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 フックlunr: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 用に設定されたロケールが自動的に追加されます。検索インデックスに異なるロケール (たとえば、1 つだけ) を使用しない限り、使用するロケールを 2 回構成する必要はありません。
このモジュールには、Web サイトで使用できる検索コンポーネントが含まれています。デフォルトのスロットを使用して、meta prop で渡されたプロパティを使用して検索結果を表示します。
< 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
プロパティを使用してそのドキュメント参照のページ パスを検索インデックスに 1 回だけ追加することをお勧めします。
Lunr は ES6 モジュールをエクスポートしないため、ツリーシェイクすることはできません。このモジュールを使用すると、バンドル (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 を使用している場合は、キーlunr-module.placeholderText
を使用して翻訳を提供することもできます
Array<String>
{ fetching: 'Fetching search index', loading: 'Loading search index', searching: 'Searching...', noresults: 'No results found' }
検索ライフサイクル中に表示されるステータス メッセージ。 nuxt-i18n を使用している場合は、キー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
使用して開発サーバーを起動します。 MITライセンス
著作権 (c) ピムリー