
uBlock Origin 静态过滤引擎如何用 serialize 序列化缓存避免重复解析过滤列表【免费下载链接】uBlockuBlock Origin - An efficient blocker for Chromium and Firefox. Fast and lean.项目地址: https://gitcode.com/GitHub_Trending/ub/uBlock在 Node.js 环境中使用 uBlock Origin 的静态网络过滤引擎SNFEStatic Network Filtering Engine时每次启动都要从网络拉取 EasyList 等过滤列表再经过解析、编译成内部结构这个过程既慢又依赖远端可用。gorhill/ubo-core包提供的serialize()/deserialize()接口可以把解析好的引擎内容存成一个 JS 字符串之后再启动时直接反序列化载入README 中对此的说明是 fast-load the content of the static network filtering engine without having to parse and compile the lists快速载入引擎内容无需重新解析和编译列表。本文基于仓库中 npm 包文档、demo.js 和引擎源码 static-net-filtering.js给出可执行的缓存操作路径与验证方式。serialize 到底缓存了什么在 static-net-filtering.js 中serialize()直接委托给toSelfie()源码注释称缓存为 selfie。toSelfie()先对内部结构做优化this.optimize(0)、bidiTrie.optimize()、origHNTrieContainer.optimize()然后返回一个包含以下字段的状态对象见 toSelfie 实现version序列化格式版本当前引擎内部为selfieVersion 10第 4483 行processedFilterCount、acceptedCount、discardedCount、bitsToBucket过滤统计与哈希桶参数urlTokenizer、destHNTrieContainer、origHNTrieContainer、bidiTrieURL 分词器与各主机名压缩 trie 容器HNTrieContainer 是 SNFE 的关键组件专门用于高效存储和查找大量主机名filterData、filterRefs已编译的过滤规则数据及其引用表。反序列化路径fromSelfie()第 5212-5243 行先reset()引擎并设置notReady true逐项恢复上述组件其中有一个关键检查如果selfie.version ! this.selfieVersion则直接返回false此时内部状态不可信调用方必须自行重置引擎并重新灌入过滤列表unserialize()只是fromSelfie()的别名。准备条件根据 package.json 的 engines 字段环境要求为Node.js 18.0.0npm 6.14.4npm 包使用原生 JavaScript modulesES module 语法。README 提示这是很早期的版本API 随时可能变化。执行步骤以下是最短可行路径直接复用包内自带的 demo.js文档原文给出的启动方式mkdir myproject cd myproject npm install gorhill/ubo-core cp node_modules/gorhill/ubo-core/demo.js . node demo.js由于 demo 使用 ES module 语法文档建议在生成的package.json中添加type: module以消除警告。第一次运行时 demo 会依次做三件事见 demo.js 第 50-88 行检查本地cache/selfie.txt是否存在且文件修改时间不超过 7 天ageInDays 7缓存可用时读取该文件并执行await snfe.deserialize(selfie)跳过网络拉取缓存不可用时通过snfe.useLists([...])拉取 uAssets CDN 的filters.min.txt、badware.min.txt、privacy.min.txt、unbreak.min.txt、quick-fixes.min.txt以及 easylist.to 的easylist.txt、easyprivacy.txt和 PGL 的 hosts 列表然后执行const selfie await snfe.serialize()将结果写入cache/selfie.txt。如果你要在自己的代码中使用同一套接口README 给出的最小调用序列是import { StaticNetFilteringEngine } from gorhill/ubo-core; const snfe await StaticNetFilteringEngine.create(); // 首次灌入过滤列表如何获取列表由你自己决定 await snfe.useLists([ fetch(easylist).then(r r.text()).then(raw ({ name: easylist, raw })), ]); // 序列化引擎内容得到一个 JS 字符串可存盘 const serializedData await snfe.serialize(); // 后续启动直接用该字符串载入无需解析和编译列表 const snfe2 await StaticNetFilteringEngine.create(); await snfe2.deserialize(serializedData);注意 README 说明目前同一时间只能存在一个 SNFE 实例。验证缓存是否生效验证手段全部来自 demo.js 自身的可观察行为首次运行无缓存或缓存超过 7 天终端会为每个列表打印fetched日志如easylist fetched运行结束后cache/selfie.txt被创建。随后 demo 对三个测试请求执行snfe.matchRequest(test)并打印结果返回1打印Blocked:及snfe.toLogData()返回2打印Unblocked:及toLogData()其余打印Not blocked。README 的示例中https://securepubads.g.doubleclick.net/tag/js/gpt.js这类请求被判为 Blocked而页面自身的that.css判为 Not blocked——这些是文档给出的示例结果实际判定取决于你灌入的列表内容。7 天内再次运行cache/selfie.txt未过期时demo 直接走deserialize分支终端不再出现各列表的fetched日志和Fetching lists...日志匹配测试照常输出。文档对这一行为的说明是 The serialized data will be reused if available in order to avoid fetching from remote server each time it is executed。这就是避免重复解析的直接验证网络拉取与解析编译步骤被整体跳过。缓存过期当selfie.txt的文件修改时间距现在超过 7 天demo 中按7 * 24 * 60 * 60秒计算demo 会重新拉取列表并覆盖写入新的序列化数据。缓存失效的两个边界文件格式版本fromSelfie()会校验selfie.version与当前引擎的selfieVersion当前为10不一致时返回false并让引擎停留在notReady状态。此时必须放弃该缓存、重置引擎并重新走useLists()解析路径。单实例限制README 明确当前只能有一个 SNFE 实例序列化/反序列化用于跨进程或跨次启动复用状态而不是在同一进程内并行维护多套引擎。参考npm 包文档与 API 说明platform/npm/README.md可直接运行的缓存 demoplatform/npm/demo.js引擎序列化/反序列化实现src/js/static-net-filtering.js独立使用 HNTrieContainer 主机名 trie 的说明见 platform/npm/README.md 的 Extras 一节。【免费下载链接】uBlockuBlock Origin - An efficient blocker for Chromium and Firefox. Fast and lean.项目地址: https://gitcode.com/GitHub_Trending/ub/uBlock创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考