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中文网其他相关文章!

在这篇文章中,布莱克·莫里(Blackle Mori)向您展示了一些骇客,同时试图推动同位HTML支持的极限。如果您敢于使用这些,以免您也被标记为CSS罪犯。

具有CSS的自定义光标很棒,但是我们可以将JavaScript提升到一个新的水平。使用JavaScript,我们可以在光标状态之间过渡,将动态文本放置在光标中,应用复杂的动画并应用过滤器。

互动CSS动画和元素相互启动的元素在2025年似乎更合理。虽然不需要在CSS中实施乒乓球,但CSS的灵活性和力量的增加,可以怀疑Lee&Aver Lee&Aver Lee有一天将是一场

有关利用CSS背景滤波器属性来样式用户界面的提示和技巧。您将学习如何在多个元素之间进行背景过滤器,并将它们与其他CSS图形效果集成在一起以创建精心设计的设计。

好吧,事实证明,SVG的内置动画功能从未按计划进行弃用。当然,CSS和JavaScript具有承载负载的能力,但是很高兴知道Smil并没有像以前那样死在水中

是的,让#039;跳上文字包装:Safari Technology Preview In Pretty Landing!但是请注意,它与在铬浏览器中的工作方式不同。

此CSS-tricks更新了,重点介绍了年鉴,最近的播客出现,新的CSS计数器指南以及增加了几位新作者,这些新作者贡献了有价值的内容。

在大多数情况下,人们展示了@Apply的@Apply功能,其中包括Tailwind的单个property实用程序之一(会改变单个CSS声明)。当以这种方式展示时,@Apply听起来似乎很有希望。如此明显


热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

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

热门文章

热工具

WebStorm Mac版
好用的JavaScript开发工具

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

SublimeText3 英文版
推荐:为Win版本,支持代码提示!