首页
/ uBlock Origin 源码中的 wat 文件如何用 wat2wasm 重新编译为 wasm

uBlock Origin 源码中的 wat 文件如何用 wat2wasm 重新编译为 wasm

2026-09-08 17:17:38作者:温玫谨Lighthearted

uBlock Origin 仓库里保留了若干 WebAssembly 模块的文本源码(.wat 文件)和对应的二进制产物(.wasm 文件)。文档说明这一流程主要面向代码审阅者:当你修改或审阅 .wat 源码时,可以用 wat2wasm 把它重新编译,得到与仓库中一致的 .wasm 文件。本文覆盖仓库中所有 .wat 文件的位置、编译命令,以及文档给出的替代编译方式(在线工具)与结果检查方法。

仓库中有哪些 wat / wasm 对

编译前先从文档确认每个模块的路径和命令,三份目录级 README 是权威依据:

目录 wat 源文件 对应 README
src/js/wasm/ hntrie.watbiditrie.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.mdsrc/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.mdsrc/lib/publicsuffixlist/wasm/README.md)都给出了同一替代方式:使用 wabt 项目提供的在线 wat2wasm 工具(地址见 README 中的 webassembly.github.io 链接)。操作步骤:

  1. wat 文件的完整内容粘贴到在线工具的 WAT 输入区;
  2. 点击 "Download" 按钮,下载编译出的 wasm 文件。

得到的文件即为对应 .wasm 的重新编译结果,文件名与本地目录中的模块保持一致即可。

结果检查

  • 命令行方式下,成功条件是命令正常结束、在 -o 指定路径生成 .wasm 文件;各 README 都没有给出额外的输出比对步骤。
  • src/lib/publicsuffixlist/wasm/README.md 在 "See also" 一节提到:可以用在线的 WasmExplorer 工具查看 wasm 代码对应生成的机器码,用于核对编译产物内容。
  • 编译后的模块名与消费方必须保持对应:例如 hntrie.wat 头注释声明其服务于 src/js/hntrie.jspublicsuffixlist.wat 头注释声明其实现 publicsuffixlist.js 的核心查找方法。重新生成时不要改动输出文件名,否则与这些 js 代码的加载约定脱节。

限制

  • 以上流程文档定位为代码审阅/再生成场景,README 没有描述把新编译的 wasm 接入构建脚本的后续步骤;仓库的打包脚本(如 tools/make-nodejs.sh)只是按既有路径读取 src/js/wasm/hntrie.wasmbiditrie.wasm 等文件,因此直接覆盖同名文件即可被现有流程使用。
  • lz4-block-codec.wat 外,其余模块的文档流程只含 wat2wasm 一步,不要自行追加优化步骤;lz4wasm-opt -O4 也只适用于该模块。
登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.14 K
2.75 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
857
1.35 K
docsdocs
暂无描述
Markdown
897
5.81 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
531
596
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
920
1.84 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.79 K
1.02 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.36 K
1.46 K
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
1.02 K
519
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
548
390