目录
入门
通过Lunr.js实施倒立索引
gatsby-node.js中创建索引
添加搜索表格组件
创建搜索结果页面
持续的搜索小部件(tartanify.com示例)
使小部件持续
自定义搜索查询增强功能
结论
首页 web前端 css教程 如何将LUNR搜索添加到您的Gatsby网站

如何将LUNR搜索添加到您的Gatsby网站

Apr 07, 2025 am 09:54 AM

如何将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是一系列对象,每个对象都带有slugtitlecontent

 {
  slug:'/post-slug/',,
  标题:“帖子标题”,
  内容:“发布所有HTML标签的内容。”
}
登录后复制

我们定义一个唯一的文档密钥( slug )和两个字段( titlecontent )。所有文档都迭代添加。

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

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

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

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1657
14
CakePHP 教程
1415
52
Laravel 教程
1309
25
PHP教程
1257
29
C# 教程
1229
24
Google字体可变字体 Google字体可变字体 Apr 09, 2025 am 10:42 AM

我看到Google字体推出了新设计(Tweet)。与上一次大型重新设计相比,这感觉更加迭代。我几乎无法分辨出区别

如何使用HTML,CSS和JavaScript创建动画倒计时计时器 如何使用HTML,CSS和JavaScript创建动画倒计时计时器 Apr 11, 2025 am 11:29 AM

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

HTML数据属性指南 HTML数据属性指南 Apr 11, 2025 am 11:50 AM

您想了解的有关HTML,CSS和JavaScript中数据属性的所有信息。

如何通过CSS选择第一个类名为item的子元素? 如何通过CSS选择第一个类名为item的子元素? Apr 05, 2025 pm 11:24 PM

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

为什么Flex布局中的紫色斜线区域会被误认为是'溢出空间”? 为什么Flex布局中的紫色斜线区域会被误认为是'溢出空间”? Apr 05, 2025 pm 05:51 PM

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

我们如何创建一个在SVG中生成格子呢模式的静态站点 我们如何创建一个在SVG中生成格子呢模式的静态站点 Apr 09, 2025 am 11:29 AM

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

使Sass更快的概念证明 使Sass更快的概念证明 Apr 16, 2025 am 10:38 AM

在一个新项目开始时,Sass汇编发生在眼睛的眨眼中。感觉很棒,尤其是当它与browsersync配对时,它重新加载

在前端开发中,如何使用CSS和JavaScript实现类似Windows 10设置界面的探照灯效果? 在前端开发中,如何使用CSS和JavaScript实现类似Windows 10设置界面的探照灯效果? Apr 05, 2025 pm 10:21 PM

在前端开发中如何实现类似Windows...

See all articles