uBlock Origin 源码中的 wat 文件如何用 wat2wasm 重新编译为 wasm
uBlock Origin 仓库里保留了若干 WebAssembly 模块的文本源码(.wat 文件)和对应的二进制产物(.wasm 文件)。文档说明这一流程主要面向代码审阅者:当你修改或审阅 .wat 源码时,可以用 wat2wasm 把它重新编译,得到与仓库中一致的 .wasm 文件。本文覆盖仓库中所有 .wat 文件的位置、编译命令,以及文档给出的替代编译方式(在线工具)与结果检查方法。
仓库中有哪些 wat / wasm 对
编译前先从文档确认每个模块的路径和命令,三份目录级 README 是权威依据:
| 目录 | wat 源文件 | 对应 README |
|---|---|---|
| src/js/wasm/ | hntrie.wat、biditrie.wat |
src/js/wasm/README.md |
| src/lib/publicsuffixlist/wasm/ | publicsuffixlist.wat |
src/lib/publicsuffixlist/wasm/README.md |
| src/lib/lz4/ | lz4-block-codec.wat |
src/lib/lz4/README.md |
以 src/js/wasm/README.md 为例,它明确写道:该目录下所有 wasm 文件都是由对应的 wat 文件编译而来,并规定命令必须在该目录内执行("The command is executed from within the present directory")。hntrie.wat 的文件头注释也声明了它与消费方的对应关系:它是 src/js/hntrie.js 使用的 WebAssembly 代码,编译方式见同目录 README。
另注意:根目录 Makefile 中虽然列有 wasm 目标,但它只执行 echo(空占位目标),并不执行任何编译。因此重新生成 .wasm 必须手动运行 wat2wasm,不要指望 make wasm 代劳。
准备 wat2wasm 工具
文档指出 wat2wasm 属于 WebAssembly 官方的 wabt 项目,可从其 release 页面下载;src/js/wasm/README.md 给出的是 tag 1.0.29 的 release,而 src/lib/publicsuffixlist/wasm/README.md 与 src/lib/lz4/README.md 只给出 release 入口,未指定具体 tag。取哪个版本以你能正常执行该命令为准,两份文档没有给出可互换性的说明。
命令行编译(主路径)
进入对应目录后执行文档给出的原命令。
src/js/wasm/ 目录,README 以 hntrie 为例:
cd src/js/wasm
wat2wasm hntrie.wat -o hntrie.wasm
README 的原话是"该目录下所有 wasm 文件都由对应的 wat 文件用此命令编译",因此同目录的 biditrie.wasm 按同一模式处理,输出名保持与目录内已有文件名一致:
cd src/js/wasm
wat2wasm biditrie.wat -o biditrie.wasm
src/lib/publicsuffixlist/wasm/ 目录:
cd src/lib/publicsuffixlist/wasm
wat2wasm publicsuffixlist.wat -o publicsuffixlist.wasm
这条命令同样写在 publicsuffixlist.wat 的文件头注释里,与 README 一致。
src/lib/lz4/ 目录是文档中唯一带两步流程的模块:先用 wat2wasm 生成,再用 binaryen 项目的 wasm-opt 以 -O4 级别优化并覆盖同一个文件(见 src/lib/lz4/README.md):
cd src/lib/lz4
wat2wasm ./lz4-block-codec.wat -o ./lz4-block-codec.wasm
wasm-opt ./lz4-block-codec.wasm -O4 -o ./lz4-block-codec.wasm
文档说明 wasm-opt 可从 WebAssembly 官方的 binaryen 项目获取。跳过 wasm-opt 只会得到未优化的产物,与仓库中经优化生成的 lz4-block-codec.wasm 生成流程不符。
用在线 wat2wasm 工具(替代路径)
两份 README(src/js/wasm/README.md、src/lib/publicsuffixlist/wasm/README.md)都给出了同一替代方式:使用 wabt 项目提供的在线 wat2wasm 工具(地址见 README 中的 webassembly.github.io 链接)。操作步骤:
- 将
wat文件的完整内容粘贴到在线工具的 WAT 输入区; - 点击 "Download" 按钮,下载编译出的
wasm文件。
得到的文件即为对应 .wasm 的重新编译结果,文件名与本地目录中的模块保持一致即可。
结果检查
- 命令行方式下,成功条件是命令正常结束、在
-o指定路径生成.wasm文件;各 README 都没有给出额外的输出比对步骤。 - src/lib/publicsuffixlist/wasm/README.md 在 "See also" 一节提到:可以用在线的 WasmExplorer 工具查看
wasm代码对应生成的机器码,用于核对编译产物内容。 - 编译后的模块名与消费方必须保持对应:例如
hntrie.wat头注释声明其服务于src/js/hntrie.js,publicsuffixlist.wat头注释声明其实现publicsuffixlist.js的核心查找方法。重新生成时不要改动输出文件名,否则与这些 js 代码的加载约定脱节。
限制
- 以上流程文档定位为代码审阅/再生成场景,README 没有描述把新编译的
wasm接入构建脚本的后续步骤;仓库的打包脚本(如tools/make-nodejs.sh)只是按既有路径读取src/js/wasm/hntrie.wasm、biditrie.wasm等文件,因此直接覆盖同名文件即可被现有流程使用。 - 除
lz4-block-codec.wat外,其余模块的文档流程只含wat2wasm一步,不要自行追加优化步骤;lz4的wasm-opt -O4也只适用于该模块。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0629
MiniCPM5-2BMiniCPM5-2B 是一款面向端侧、本地部署和资源受限场景的 2B 稠密 Transformer,能够达到同尺寸开源模型 SOTA 水平。Markdown00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
HivisionIDPhotos⚡️HivisionIDPhotos: a lightweight and efficient AI ID photos tools. 一个轻量级的AI证件照制作算法。Python07
DragonOSDragonOS is an operating system developed from scratch using Rust, with Linux compatibility. It is designed for **Serverless** scenarios. 使用Rust从0自研内核,具有Linux兼容性的操作系统,面向云计算Serverless场景而设计。Rust00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00