使用 lunr.js 对 Nuxt.js 进行预构建索引的全文搜索
在 Nuxt.js 的构建阶段,您可以通过调用 nuxt 挂钩lunr:document
将文档添加到搜索索引构建器。如果您已配置并沿文档传递受支持的区域设置,则将使用指定语言的 lunr 词干分析器构建索引。由于 lunr 搜索索引仅保存对文档的引用,因此您可以选择将元属性与文档一起传递,该文档也将添加到搜索索引中。
发行说明
@nuxtjs/lunr-module
依赖项添加到您的项目中$ yarn add @nuxtjs/lunr-module # or npm install @nuxtjs/lunr-module
@nuxtjs/lunr-module
添加到nuxt.config.js
的modules
部分 {
modules : [
// Simple usage
'@nuxtjs/lunr-module' ,
// With options
{
src : '@nuxtjs/lunr-module' ,
// These are the default options:
/*
options: {
includeComponent: true,
globalComponent: false,
css: true,
defaultLanguage: 'en',
languages: false,
path: 'search-index',
ref: 'id',
fields: [
'title',
'body'
]
} */
}
]
}
通过调用 nuxt hook lunr:documents
documents 添加文档,如下所示:
const document = {
id : 1 ,
title : 'My Title' ,
body : 'The body'
}
const meta = {
href : '/link/to/page' ,
title : document . title
}
nuxt . callHook ( 'lunr:document' , ( {
locale : 'af' , // optional, default en
document ,
meta // optional
} )
通过配置区域设置选项,您可以指示应为哪些支持的语言创建搜索索引。如果您通过文档传递任何其他区域设置,它将被添加到defaultLanguage
搜索索引中(并且将打印警告)。
多种语言等于多种搜索索引
Lunr 默认支持英语,当您只有英文文档时,无需配置或传递任何语言环境。
区域设置可以仅包含一种语言或包含一个区域,您可以使用其中任何一种。因此,仅语言(例如nl )和包括领土(例如nl_NL )都可以工作
如果此模块检测到您的项目使用 nuxt-i18n,则将自动添加 nuxt-i18n 配置的语言环境。您不必配置两次使用的区域设置,除非您想对搜索索引使用不同的区域设置(例如仅一个)。
该模块包括一个可以在您的网站上使用的搜索组件。使用它的默认插槽来使用元属性中传递的属性来显示搜索结果
< template >
< lunr-search : lang = " lang " >
< template v-slot : default = " { result, index, maxScore, meta } " >
< nuxt-link : to = " meta . href " >
{{ meta . title }}
< span >score: {{ Math . round ( 100 * result . score / maxScore) }}%</ span >
</ nuxt-link >
</ template >
</ lunr-search >
</ template >
< script >
export default {
components : {
// Note: 'lunr-module' below is a custom webpack alias and
// does NOT refer to the folder in node_modules
LunrSearch : () => import ( ' lunr-module/search ' )
}
}
</ script >
文档引用(由 option.ref 定义)在搜索索引中用于链接所有词干词段。如果您使用页面路径作为文档引用,那么对于路径为/en/offices/emea/nl/contact
页面,该字符串值将用于链接所有词干词段。这可能会大量增加搜索索引的大小,因此建议创建数字文档引用并使用meta
属性将该文档引用的页面路径仅添加到搜索索引中一次。
Lunr 不导出 ES6 模块,也不能进行 tree-shaking。使用此模块会为您的捆绑包(gzip 压缩)添加~8.5KB
+ ~2KB
其他语言(然后是英语)。请参阅上面的动态导入示例,确保 lunr 导入不包含在您的供应商捆绑包中
搜索索引保存为json文件,需要在客户端进行解析。如果您的搜索索引的 json 变得非常大,那么(移动)客户端可能会出现问题。例如,iOS 上的 Safari 限制每个顶级入口点最多运行 10 秒。请参阅此 Lunr.js 问题以获取可能的解决方法。
Boolean
类型true
如果为 true,则默认搜索组件将添加到您的 Nuxt 项目中
您可以使用 webpack 别名
lunr-module/search
导入组件
Boolean
, String
false
如果为真,那么一个插件将被添加到您的项目中,该插件将全局安装搜索组件
设置此选项意味着
includeComponent: true
默认情况下,搜索组件将注册为lunr-search
,如果您希望使用此名称,可以将此选项设置为包含您希望使用的名称的字符串
globalComponent : 'my-global-lunr-search'
. . .
< template >
< my-global-lunr-search : lang = "lang" class = "my-search" / >
< / template >
Boolean
类型true
如果包含搜索组件,此选项确定是否应包含默认 css 样式
String
'en'
使用的默认语言。如果您传递区域设置不受支持的文档,这也是后备语言
String
, Array
undefined
需要为其创建搜索索引的语言的字符串或数组。
尽管此选项可能看起来多余(即为什么不为传递的每种语言创建一个搜索索引),但它提供了一种检查以防止“流氓”文档被索引到单独的索引中。
Object
{}
一个对象,其中包含不支持的语言到支持的词干语言的映射(由 lunr 提供)。如果要为 lunr(尚)不支持的语言构建搜索索引,请使用此选项指定应使用哪种词干语言。
String
search-index
在构建项目时,创建的搜索索引将作为 webpack 资产发出。此选项确定应使用nuxt.publicPath
下的路径。
使用 Nuxt.js 和此模块的默认配置,英文搜索索引可在
/_nuxt/search-index/en.json
下使用
String
id
文档中属性的名称,指定搜索索引中该文档应使用的参考内容
Array
['title', 'body']
文档中将被索引的属性名称
String
Search
放置在搜索输入字段占位符中的文本。如果您使用 nuxt-i18n,您还可以使用 key lunr-module.placeholderText
提供翻译
Array<String>
{ fetching: 'Fetching search index', loading: 'Loading search index', searching: 'Searching...', noresults: 'No results found' }
在搜索生命周期期间显示的状态消息。如果您使用 nuxt-i18n,您还可以使用 key lunr-module.${key}
提供翻译。例如,使用lunr-module.noresults
提供未找到结果状态的翻译。
如果您想使用这些钩子,请使用
nuxt.callHook(<name>, <arg>)
({ locale?, document, meta? })
主要钩子用于将文档添加到搜索索引。您需要按照描述传递一个对象。两种语言环境作为元都是可选的。如果没有传递区域设置,则将使用defaultLanguage
语言
如果您想使用这些钩子,请使用
nuxt.hook(<name>, <callback>)
。回调函数接收列出的参数
({ locale, builder })
如果您想注册自定义 lunr 插件,请使用此挂钩
在实例化 lunr 构建器之后但在添加语言插件或设置任何引用和字段之前调用此挂钩
({ locale, builder })
如果您想向索引添加额外的文档,请使用此钩子
在设置 lunr 构建器后,即在将文档添加到索引之前,会调用此挂钩。
({ locale, builder, index })
如果您希望在导出索引之前与索引进行交互,请使用此挂钩
该钩子在索引导出为 json 对象之前调用
({ locale, json })
如果您希望操作作为区域设置的搜索索引发出的 json,请使用此挂钩
在 webpack 编译期间,在搜索索引准备作为资产发出之前,会调用此钩子
yarn install
或npm install
安装依赖项npm run dev
启动开发服务器麻省理工学院许可证
版权所有 (c) 皮姆利