”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 构建 jargons.dev [# 词典搜索引擎

构建 jargons.dev [# 词典搜索引擎

发布于2024-08-23
浏览:247

没有搜索引擎或嗯搜索功能的字典是什么!?

在基本词典的实现过程中,我创建了这些静态搜索表单(一个在主页上,另一个在单词布局上使用的导航栏上)为这一特定功能做准备。

Building jargons.dev [# The Dictionary Search Engine

Building jargons.dev [# The Dictionary Search Engine

我只需要从那里开始工作并让它工作,轻松的工作 - 如果这是真的。

过去的事

重要的是要重申,我最初的计划是使用 Nextra 构建 jargons.dev,正如我在最初的提交中承认的那样:

...Nextra(这实际上是我穿着闪亮盔甲的骑士,我想用 Nextra 来建造)。

我是 React ⚛️ 粉丝,非常喜欢 Next.js; Nextra 是一个基于 Next.js 构建的以内容为中心的 Web 框架。所以我想你应该能理解为什么 Nextra 听起来像个骑士。在我最初探索 Nextra 的过程中,有一个功能对我来说很突出:全文搜索——我对这个流口水了(我必须承认)。

该功能由 Flexsearch 提供支持——一个零深度的全文搜索库;天哪,我是轻量级和无/低依赖性的忠实粉丝。我深入研究了 Nextra 如何使用它在构建时索引内容以进行搜索;很有趣。

所以!?

在我早期接触 Astro 的过程中,我发现自己正在使用 Flexsearch 进行黑客攻击;当我遵循 astro 文档的构建博客教程时,我更进一步,非常轻松地实现了搜索功能。

所以,这次实施的经验;我向搜索引擎传递了 jargons.dev.

搜索引擎

任务非常简单,我需要..

  • 获取单词字典目录内所有文件的访问或调用它的引用 - 此时它是 src/pages/word 目录
  • 获取使用 Flexsearch 索引的这些文件内容
  • 插入搜索表单并繁荣?

看起来很简单!也许对于搜索索引和实际搜索来说,它是;但到达那里需要做很多事情。

在 jargons.dev 中集成第一个“岛”

Astro 默认情况下采用服务器优先的方法,这意味着它会在服务器上构建网站的 HTML/CSS,自动删除所有客户端 javascript (JS)(除非您另有说明)。去掉所有 JS 可以保证性能提升,但没有 JS 就意味着没有交互性;但如果您想要互动,阿斯特罗岛是您的最佳选择之一。我需要搜索引擎的交互性,所以它就是岛屿!

什么是“岛”!?

我简单地说,岛屿是网页上一个独立的交互式组件,其 HTML/CSS 在服务器端呈现和/但它的客户端 javaScript 也(水合)与之捆绑在一起 -未删除。

我在 TILConf'24 上发表了有关 Island 的演讲,请查看以了解更多信息。

Astro 的产品

Astro 提供了将 Island 与我最喜欢的 UI 库(是的,你猜对了,React)集成的支持。这使我能够将静态搜索表单构建为功能性的东西。

我做过的事

  • 我首先为我需要集成的岛屿添加集成模块(@astrojs/react);使用 npx astro add React 命令很容易完成
  • 我将所有静态搜索表单转移到单个 React 组件中(这是两个不同大小的表单);配置组件以根据给定的 props 以所需的大小渲染它们。
  • 我还实现了一些子组件,这些子组件仅在同一搜索组件中本地使用,这些是......
    • SearchDialog - 执行搜索操作的主要组件
    • SearchResult 组件等...
  • 我实现了一些自定义键盘快捷键和按键绑定,可以与搜索组件进行交互(从现在起我想将其称为“搜索岛”),这些是......
    • CTRL K 或 ⌘K 开始搜索
    • ESC 关闭搜索
    • ...以及在搜索结果中导航所需的基本导航按钮
  • 我还添加了一些自定义挂钩,以便搜索岛的工作顺利进行,这些是......
    • useLockBody - 打开搜索对话框后禁用滚动的钩子
    • useRouter - 我作为一些 window.location 方法的包装器制作的钩子,使它们感觉像 React 中已知的路由器库,这是我特别在搜索结果组件上的导航按钮键绑定中的 ENTER 按钮单击处理程序上使用的钩子在搜索岛上。
    • and useIsMacOS - 检查计算机是否为 MacOS,以确定在搜索表单触发器上呈现的适当描述文本;即 CTRL K 或 ⌘K
  • 我添加了命令式模块——flexsearch;
  • 我使用 Astro.glob() 函数非常轻松地检索了对单词目录文件的访问(太糟糕了,我无法谈论这个函数有多么强大;我很高兴它在 Astro 中开箱即用)以及它为启动和运行这个搜索引擎的流程带来了多少便利)并将返回的单词对象数组插入由 Nanostore(另一个漂亮的东西就在那里)提供支持的 $dictionary 状态(也许我应该称其为商店)
  • 然后使用 flexsearch 为这个 $dictionary 建立索引,为以后的搜索做好准备。

另一个重要功能:最近的搜索

这是我必须谈论的另一个重要功能;此功能跟踪搜索到的项目并将其存储在本地存储中,以便在页面重新加载时保留它们;然后,这些商店搜索的项目将呈现在词典主页上的列表中。

Building jargons.dev [# The Dictionary Search Engine

它还将集成作为一个岛屿,并将价值保存在由 Nanostore 驱动的 $recentSearches 状态中。

我对此功能的实现并不完全完美,这里列出了一些需要修复的问题(在撰写本文时),以使其沿着这条路线更进一步(即使我们永远无法达到完美,是的)一定)

  • 将加载组件添加到最近的搜索岛 - https://github.com/devjargons/jargons.dev/issues/31
  • 错误:在导航栏中使用搜索表单执行的搜索操作覆盖 LocalStorage - https://github.com/devjargons/jargons.dev/issues/10
  • 增强功能:Word 编辑器 - 第二次迭代功能 - https://github.com/devjargons/jargons.dev/issues/9

公关

这是一篇很长的文章,我希望保持简短...这是 PR

Building jargons.dev [# The Dictionary Search Engine 壮举:实现字典搜索引擎 #5

Building jargons.dev [# The Dictionary Search Engine
巴布尔贝 发表于

这个 Pull Request 实现了字典项目的搜索功能。它使用@astro/react集成为Islands提供动力,并结合nanostore进行状态管理和flexsearch作为文本搜索库。

所做的更改

  • 添加了文本搜索所需的以下 astrojs 集成和库
    • @astrojs/react
    • @nanostores/react
    • 弹性搜索
  • 实现了搜索岛(一个反应组件),其中实现了其他子组件以供内部使用
    • 实现了 SearchTrigger 组件,该组件呈现两种不同大小的搜索字段并在网页上的两个不同位置使用...
      • size md - 在网络应用程序的主页上使用
      • size sm - 用于词典单词布局导航部分
    • 实现了SearchDialog组件,该组件仅在单击SearchTrigger时呈现
    • 实现了SearchInfo组件,当表单字段中没有输入搜索词时呈现为默认占位符
    • 实现了 SearchResult 组件,呈现搜索结果或未找到搜索结果的消息
    • 在搜索岛中实现了按键绑定,以允许使用指定的键盘快捷键进行以下操作
      • CTRL K 或 ⌘K 打开搜索对话框,无需单击搜索触发器
      • ArrowUp、ArrowDown 和 Enter 允许在搜索结果列表上导航
      • ESC 允许关闭搜索对话框
    • 添加了搜索岛上消费的自定义挂钩
      • useIsMacOS - 检查当前用户是否正在使用 MacOS 计算机浏览 Web 应用程序;这用于确定要在搜索触发器上呈现的适当短路;即 CTRL K 或 ⌘K
      • useLockBody - 用于在打开搜索对话框时禁用当前视口滚动
      • useRouter - (而不是将react-router添加到deps中)这个钩子环绕window.location并使用分配对象作为推送;主要用在SearchResult组件中路由到选定/点击的结果页面
    • 在搜索岛上实现了 searchIndexing,并使用 flexsearch 的 Document 方法作为首选选项
      • 添加了一个新的搜索存储,用于使用 nanostores 和 @nanostores/react 集成管理搜索相关状态
      • 添加了以下存储值和操作
        • $isSearchOpen - 用于管理 SearchDialog 状态的全局状态
        • $recentSearches - 用于跟踪最近搜索的单词的状态;它与 localStorage 协同工作,即使在选项卡重新加载后也能保留其值
        • $addToRecentSearchesFn - 将新项目添加到 $recentSearches 存储值的存储操作
  • 添加了一个 $dictionary 存储来管理整个字典条目;使其可供客户端访问并用作搜索岛中 searchIndex 的值
    • 使用 Astro.glob() 方法索引整个字典目录,尽早从布局/库计算字典存储的值
  • 添加了RecentSearches岛,它从$recentSearches存储中读取值并将其呈现在主页上

截屏

完整演示

截屏-bpconcjcammlapcogcnnelfmaeghhagj-2024.03.25-13_32_30.webm

在 GitHub 上查看
版本声明 本文转载于:https://dev.to/babblebey/building-jargonsdev-2-the-dictionary-search-engine-1i7l?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何正确使用 getElementsByClassName 并根据事件更改元素样式?
    如何正确使用 getElementsByClassName 并根据事件更改元素样式?
    使用 getElementsByClassName 更改元素样式getElementsByClassName 允许您选择具有相同类名的多个元素。在给出的示例中,代码旨在当事件发生在具有特定类名的所有 div 之外时更改这些 div 的背景颜色。问题诊断The提供的代码有一些问题: getElemen...
    编程 发布于2024-11-08
  • 为什么我的画布图像无法绘制?异步图像加载的重要性。
    为什么我的画布图像无法绘制?异步图像加载的重要性。
    绘图前等待图像加载尝试将图像添加到画布时,确保图像在绘制之前加载至关重要试图画它。您在代码中遇到的问题是由于图像加载的异步性质造成的。要解决此问题,您需要向图像的 onload 事件添加回调函数。该回调函数将在图像加载完成时执行,确保在尝试绘制图像之前图像数据可用。下面更正的代码将等待图像加载,然后...
    编程 发布于2024-11-08
  • Golang 中的 LeetCode:解析布尔表达式
    Golang 中的 LeetCode:解析布尔表达式
    这是我喜欢解决的 LeetCode 问题之一。我用 Golang 解决了这个问题,而且我已经是一个 Go 新手了,刚开始学习一周。 直觉 这个问题是实现计算器程序的另一个版本,该程序接受一个字符串并对其进行计算。您必须通过评估内部括号和外部括号来解决问题,直到得到最终结果。这些问题...
    编程 发布于2024-11-08
  • 预防 XSS 攻击的方法:综合指南
    预防 XSS 攻击的方法:综合指南
    1.什么是XSS? XSS(即跨站脚本)是 Web 应用程序中发现的一种安全漏洞。它允许攻击者将恶意脚本(通常是 JavaScript)注入到其他用户查看的网页中。这可能会导致未经授权的操作、数据盗窃或会话劫持。 1.1. XSS 攻击的类型 XSS攻击一般分为三...
    编程 发布于2024-11-08
  • Laravel 的新 Cache::flexible()
    Laravel 的新 Cache::flexible()
    每次点击路线时都等待大型数据集进行计算真是太糟糕了!而且用户不想等待,现在每个人的保留时间都很短,所以我们几年前就通过使用缓存修复了这个问题。 Laravel 有一个 Cache Fascad 来帮助我们缓存数据,我们一直在使用 Cache::remember(),这是一个很好的方法来缓存一些数据一...
    编程 发布于2024-11-08
  • 组装中的 Web 应用程序!
    组装中的 Web 应用程序!
    MOS 6502 是经济实惠计算领域的一大进步。感谢这个小家伙,我们了解了 Commodore64、Apple II、 Atari2600 和 NES。直到今天,人们仍在使用 6502 Assembly,为这些被遗忘的平台创建软件和游戏。 现在,让我介绍一下自己 - 我是Cassiopeia(但是,...
    编程 发布于2024-11-08
  • 使用 SCSS Mixins 和函数让你的 CSS 变得更好
    使用 SCSS Mixins 和函数让你的 CSS 变得更好
    SCSS 是 CSS 的扩展,可让您的代码更易于管理。借助 SCSS,您可以使用 mixin 和函数来帮助您避免一次又一次编写相同的代码。在本文中,我将向您展示一些有用的 SCSS mixins 和函数,它们可以节省您的时间并使您的代码更清晰。 为什么使用 Mixins 和 Functions? 编...
    编程 发布于2024-11-08
  • ## Scopelint 错误:在范围范围内使用变量 - 如何安全地引用函数文字中的循环变量?
    ## Scopelint 错误:在范围范围内使用变量 - 如何安全地引用函数文字中的循环变量?
    Scopelint 错误:在范围范围上使用变量在测试函数 TestGetUID 中,代码遇到了scopelint 报告的错误,该错误会发出警告使用函数字面量范围内的变量 x。考虑以下代码行:for _, x := range tests { t.Run(x.description, func...
    编程 发布于2024-11-08
  • 实现平滑滚动以获得更好的用户体验。
    实现平滑滚动以获得更好的用户体验。
    平滑滚动是一项现代微动画功能,可通过允许在页面各部分之间轻松导航来增强用户体验。平滑滚动不是立即跳到各个部分,而是创造流畅、引人入胜的过渡。这是一种保持用户参与度的好方法,而又不会因为突然的跳转而让他们不知所措。 在本文中,我们将探讨两种实现平滑滚动的方法: 使用 CSS 使用 JavaScript...
    编程 发布于2024-11-08
  • ## 使用 CURLOPT_RETURNTRANSFER 时,为什么 Curl 返回“18:传输已关闭,剩余未完成的读取数据”?
    ## 使用 CURLOPT_RETURNTRANSFER 时,为什么 Curl 返回“18:传输已关闭,剩余未完成的读取数据”?
    解决未完成读取数据的传输关闭错误使用curl执行数据检索有时可能会产生错误消息,特别是在使用CURLOPT_RETURNTRANSFER时存储数据以供以后检索。此错误“18:传输已关闭,剩余未完成的读取数据”可能会导致数据不完整。一个值得注意的方面是,当 CURLOPT_RETURNTRANSFER...
    编程 发布于2024-11-08
  • python 程序列表
    python 程序列表
    我的列表创建 mylist=["singam","山羊","rayyan","leo"] 打印(我的列表) 打印(我的列表[2]) mylist[1]="mersal" 打印(我的列表) mylist...
    编程 发布于2024-11-08
  • Apache 虚拟主机:添加反向代理
    Apache 虚拟主机:添加反向代理
    什么是反向代理? 反向代理充当将客户端请求转发到其他服务器的中介。它通常用于负载平衡、安全、缓存或将 HTTP 请求转发到后端服务器(例如,在 Node.js、Python、PHP 或其他服务器上运行的应用程序)。 Apache 允许您使用其 mod_proxy 和 mod_pr...
    编程 发布于2024-11-08
  • [已解决] Appwrite 用户角色缺失或缺失范围错误
    [已解决] Appwrite 用户角色缺失或缺失范围错误
    如果您想快速构建应用程序,Appwrite 是一个很棒的工具,但有时您可能会遇到令人沮丧的错误,对我来说,这些错误总是与“用户角色缺失”或“用户无权执行此操作”等。即使我可以完全访问我的应用程序的任何实例,执行任何操作。 但最终我找到了一种方法来修复所有这些问题(也许不是全部,但我想这样认为)。 所...
    编程 发布于2024-11-08
  • 如何使用 Pandas 在 Python 中读取 Excel 文件时修复 pd.io.parsers.ExcelFile.parse 错误
    如何使用 Pandas 在 Python 中读取 Excel 文件时修复 pd.io.parsers.ExcelFile.parse 错误
    使用 Pandas 在 Python 中读取 Excel 文件背景在 Python 中处理数据时,Excel 文件是常见的信息源。 Pandas 是一个强大的数据操作和分析库,使其成为读取和解析 Excel 文件的理想工具。使用 pd.ExcelFile在提供的代码片段中,您遇到错误因为 pd.io...
    编程 发布于2024-11-08
  • 精度字段实际上如何与“fmt.Printf”中的“%g”一起工作?
    精度字段实际上如何与“fmt.Printf”中的“%g”一起工作?
    fmt.Printf 对 %g 的宽度和精度字段的意外行为理解不明确的文档fmt.Printf 格式化字段的文档对于浮点值,规定:“对于浮点值,宽度设置字段的最小宽度,精度设置小数点后的位数,如果适当,除外对于 %g/%G,它设置了总位数。"令人困惑的部分在于最后一句中“it”的用法。它实...
    编程 发布于2024-11-08

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3