如何在Lunr多语言修剪器前添加自定义improvedTrimmer
如何在Lunr.js的多语言修剪器前添加自定义修剪器?
我明白你遇到的困扰——想在lunr-language插件生成的多语言修剪器之前插入自定义的improvedTrimmer,但用pipeline.before()/after()总是找不到目标修剪器,只能靠操作私有属性_stack临时解决。下面给你两个规范且可靠的解决方案:
问题回顾
你尝试过这些方法但都失败了:
fullTextIndex = lunr(function() { this.use(lunr.multiLanguage("en", "it")); // 把修剪器加到了管道末尾,不符合需求 // this.pipeline.add(improvedTrimmer); // 找不到默认修剪器(多语言插件已替换它) // this.pipeline.after(lunr.trimmer, improvedTrimmer); // 用字符串名称找不到目标修剪器 // this.pipeline.before("lunr-multi-trimmer-en-it", improvedTrimmer); // 可行但依赖私有属性,不规范 // this.pipeline.after(this.pipeline._stack[0], improvedTrimmer); });
解决方案1:通过修剪器名称精准定位
lunr-multiLanguage插件生成的修剪器有固定命名格式:lunr-multi-trimmer-<语言1>-<语言2>,比如你用en和it,对应的名称就是lunr-multi-trimmer-en-it。关键是要在插件初始化后,用pipeline.get()方法获取修剪器的引用,再传入before():
fullTextIndex = lunr(function() { // 先初始化多语言插件 this.use(lunr.multiLanguage("en", "it")); // 获取多语言修剪器的引用 const multiTrimmer = this.pipeline.get("lunr-multi-trimmer-en-it"); // 确认找到后,将自定义修剪器放在它前面 if (multiTrimmer) { this.pipeline.before(multiTrimmer, improvedTrimmer); } });
解决方案2:遍历管道栈动态查找(更通用)
如果不想硬编码修剪器名称,可以遍历管道的栈,通过名称特征找到多语言修剪器,这样就算语言组合变化也不用改代码:
fullTextIndex = lunr(function() { this.use(lunr.multiLanguage("en", "it")); // 找到名称包含"multi-trimmer"的修剪器 const multiTrimmer = this.pipeline._stack.find(item => item.name.includes("multi-trimmer") ); if (multiTrimmer) { this.pipeline.before(multiTrimmer, improvedTrimmer); } });
为什么之前的方法失败?
lunr.trimmer找不到:因为多语言插件会替换默认的修剪器,全局的lunr.trimmer已经不是当前管道中使用的那个了;- 直接传字符串名称失败:部分Lunr版本的
before()/after()需要传入修剪器的引用而非字符串,用get()获取引用后就能解决; - 操作
_stack[0]不规范:_stack是Lunr的私有内部属性,未来版本更新可能会修改或移除,依赖它会导致代码不稳定。
内容的提问来源于stack exchange,提问作者SiliconValley
相关产品推荐
相关产品推荐

