如何将LUNR搜索添加到您的Gatsby网站
Jamstack Architecture在网站开发方面获得了重大吸引力。您是否探索过Gatsby,Nuxt或Grysome?它们的易用性和预先建造的功能通常令人印象深刻。但是,搜索功能并不总是一个内置功能,对内容丰富的网站提出了挑战。我们可以在没有服务器端组件的情况下实现强大的搜索吗?
jamstack固有地缺乏内置的搜索功能。这需要仔细考虑和实施。虽然存在选项,例如Algolia的搜索服务(对免费计划的限制)或使用WPGRAPHQL和APOLLO客户端利用WordPress的搜索,但本文侧重于客户端解决方案。
我们将使用Lunr.js构建搜索索引,并将搜索集成到Gatsby站点中,Lunr.js是一个轻巧的JavaScript库,可提供可扩展且可自定义的搜索,而无需外部服务器依赖关系。我们最近在tartanify.com上使用它来添加“按塔尔坦名称搜索”功能,克服了与持续的实时搜索有关的挑战。本文将详细介绍这些挑战和解决方案。
入门
为简单起见,我们将使用官方的Gatsby博客入门者。这摘要静态网站创建的许多方面。跟随:
Gatsby New Gatsby-Starter-Blog https://github.com/gatsbyjs/gatsby-starter-blog CD Gatsby-Starter-Blog 盖茨比发展
这将创建一个带有三个帖子的小博客,可在http://localhost:8000/
。检查http://localhost:8000/__graphql
显示可用数据。
通过Lunr.js实施倒立索引
Lunr采用了记录级的倒置索引。这将站点上的每个单词都映射到其位置(页面路径)。我们确定哪些字段(标题,内容,描述等)提供索引关键字。
对于我们的博客,我们将索引标题和内容。标题很简单,但内容需要清洁。最初,使用rawMarkdownBody
由于Markdown语法而被证明是有问题的。我们将使用html
字段和striptags
软件包来删除HTML标签。有关详细信息,请参阅LUNR文档。
这是LUNR索引创建和人口片段(以后在gatsby-node.js
中使用):
const index = lunr(function(){ this.ref('slug') this.field('title') this.field('content') 对于(文档的const doc){ this.add(doc) } }))
documents
是一系列对象,每个对象都带有slug
, title
和content
:
{ slug:'/post-slug/',, 标题:“帖子标题”, 内容:“发布所有HTML标签的内容。” }
我们定义一个唯一的文档密钥( slug
)和两个字段( title
和content
)。所有文档都迭代添加。
在gatsby-node.js
中创建索引
首先,安装必要的库:
纱线添加lunr graphql型json striptags
接下来,修改gatsby-node.js
。该文件在站点构建过程中执行,使我们可以添加索引创建。我们将使用Gatsby Api createResolvers
创建一个新的根场LunrIndex
。
Gatsby的数据存储和查询功能通过GraphQL字段解析显示。 getAllNodes
检索指定类型的节点:
/ * gatsby-node.js */ // ...(导入) exports.CreateReSolvers =({cache,createresolvers})=> { createresolvers({ 询问: { lunrindex:{ 类型:GraphQljSonObject, 分辨:(源,args,context,info)=> { cont blognodes = context.nodemodel.getAllNodes({type:`markdownRemark`}); const type = info.schema.getType(`markdownRemark`); 返回createIndex(blognodes,type,cache); },, },, },, }); }; // ...(createIndex函数)
createIndex
函数利用Lunr片段:
/ * gatsby-node.js */ // ...(导入) const createIndex = async(blognodes,type,cache)=> { // ...(用于获取和处理数据的实现,包括缓存) };
(省略了完整的createIndex
函数,包括数据获取,处理和缓存,但对于简洁起见,但对于功能实现至关重要。原始响应提供了此细节。)这确保仅在必要时重建索引。
添加搜索表格组件
创建搜索表单组件( src/components/search-form.js
):
// ...(搜索表格组件实现)
(对于简洁而言,省略了完整的组件实现,但在原始响应中已详细介绍。)此组件处理表单提交和输入更改,并用查询参数导航到/search
。
创建搜索结果页面
创建一个搜索结果页面( src/pages/search.js
):
// ...(搜索结果页面实现)
(对于简洁而言,省略了完整的页面实现,但在原始响应中详细介绍。)此页面使用LunrIndex
数据显示搜索结果。
持续的搜索小部件(tartanify.com示例)
tartanify.com示例演示了一个持久的即时搜索小部件。索引创建类似于博客示例,但更简单:
// ...(tartanify.com的索引创建)
(对于简洁而言,省略了完整的实现,但在原始响应中已详细介绍。)关键区别是由输入更改触发的即时搜索功能,而不是表格提交。 useStaticQuery
Hook用于数据获取。
使小部件持续
为了在页面上维护搜索小部件,我们使用盖茨比的wrapPageElement
API:
// gatsby-browser.js // ...(包装实现)
(在原始响应中详细介绍了完整的实现。)这将页面内容与搜索小部件包装,以确保持久性。
自定义搜索查询增强功能
原始响应详细详细介绍了使用Lunr query
方法来改进搜索查询的方法,以处理模糊匹配,通配符和布尔逻辑,以获得更好的搜索结果。本节可显着增强搜索体验。
结论
在Jamstack网站中实施搜索功能是可以实现的,并且可以显着改善用户体验。虽然似乎与Jamstack的无状态性质不一致,但Lunr.js等客户端解决方案提供了强大而灵活的替代方案。本文详细介绍的仔细考虑和实施突出了通过周到的设计和开发创造出色的用户体验的潜力。
以上是如何将LUNR搜索添加到您的Gatsby网站的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

您是否曾经在项目上需要一个倒计时计时器?对于这样的东西,可以自然访问插件,但实际上更多

在元素个数不固定的情况下如何通过CSS选择第一个指定类名的子元素在处理HTML结构时,常常会遇到元素个数不�...

关于Flex布局中紫色斜线区域的疑问在使用Flex布局时,你可能会遇到一些令人困惑的现象,比如在开发者工具(d...

格子呢是一块图案布,通常与苏格兰有关,尤其是他们时尚的苏格兰语。在Tartanify.com上,我们收集了5,000多个格子呢
