uBlock Origin 是浏览器里装机量最大的广告拦截扩展,它靠一份内置的规则库决定哪些请求该被拦。这份规则库有多大、现在还能不能装,是两件事——前者有明确数字,后者在 Chrome 上已经变天了。

把 1.75.0 的扩展包拆开统计:9 个规则文件、179195 条规则、6.6 MB;扩展目录整体 14.8 MB。然后在 Chrome 156 里加载一次,页面内的探针显示它根本没有生效。

14.8 MB 的扩展,六成是规则

组成体积占比
扩展目录总计14.8 MB100%
规则文件(9 个)6.6 MB45%
规则条数179195 条—
manifest 版本2—
声明权限10 项—

规则库占 45%(6.6 MB / 14.8 MB),剩下 8.2 MB 是界面、图标和脚本。这也解释了它的工作方式:不需要联网就能拦广告,因为 179195 条规则已经在本地了。

十九万条规则里,两个列表占八成

规则文件条数体积
easylist.txt81128 条2090 KB
easyprivacy.txt56070 条1457 KB
filters.min.txt23589 条1848 KB
urlhaus-filter-online.txt9322 条810 KB
badware.min.txt4271 条144 KB
unbreak.min.txt2557 条173 KB
privacy.min.txt1832 条136 KB
quick-fixes.min.txt347 条70 KB

EasyList 和 EasyPrivacy 加起来 137198 条,占总数的 76.6%。这两个列表是整个拦截生态的公共基础设施,几乎所有广告拦截器都在用同一份源。

其中 filters.min.txt 很有意思:23589 条规则占了 1848 KB,平均每条 80 字节,比 easylist 的 26 字节长得多。因为它存的是 uBlock 自己的高级语法(过程化过滤、脚本注入),一行能表达一整套操作。

Chrome 156 上,它装不上

扩展包的 manifest 版本是 2。Chrome 从 138 版起不再加载 MV2 扩展,156 版自然也不行。用自动化启动 Chrome 156 并指定加载这个扩展目录,页面里的探针结果:

--load-extension=uBlock0.chromium --disable-extensions-except=uBlock0.chromium

页面内探针: {'vAPI': 'undefined', 'ublock': 'undefined',
             'scripts': 1, 'imgs': 0}
service workers: 0

vAPI 是 uBlock 注入页面上下文的接口对象,只要扩展生效它必然存在。这里返回 undefined,service worker 数量也是 0,说明扩展被加载器直接忽略了,没有报错、没有提示。

如果扩展的 manifest 版本是 2,Chrome 138 以上的加载器会静默忽略它,179195 条规则一条都不会生效。这个「静默」是最容易踩的地方:命令行参数写了、进程起来了、页面正常打开,看起来一切正常,实际上一个请求都没拦。

怎么确认它到底有没有在工作

打开任意页面,按 F12 在控制台输入 typeof vAPI。返回 "object" 说明扩展在跑,返回 "undefined" 就是没加载——Chrome 156 上实测就是后者。

或者看扩展管理页的图标:icon 上的数字是当前页面被拦掉的请求数,装好后随便开一个新闻站,正常应该显示两位数。数字一直是 0 有两种可能:规则没加载,或者这一页确实没有可拦的请求——看扩展详情页里那 9 个规则文件的载入状态就能分清。

Firefox 仍然是正路

Firefox 到现在仍支持 MV2 扩展,uBlock Origin 的官方推荐路径就是 Firefox 版。同一个 1.75.0 版本,Firefox 包是 .firefox.signed.xpi,签名由 Mozilla 完成,装上去 179195 条规则全部生效。

如果主用 Chrome,官方给的迁移方案是 uBlock Origin Lite(MV3 版本,简称 uBOL)。它的能力比 MV2 版弱:过程化过滤、动态过滤这类依赖深度钩子的功能做不了,只能靠静态列表,规则上限也从 179195 条降到按需声明的那部分。

这也是为什么很多人宁可为了一个 14.8 MB 的扩展换浏览器。拦截能力取决于能拿到多少请求控制权,MV3 把这块收紧了。

规则库本身还在更新

179195 条规则不是定值。EasyList 每天合并新提交的规则,所以拦截效果会随时间变化;这也是为什么拦截器需要定期更新列表,而不是装完就不管。

体积上的代价是 6.6 MB,对现代机器可以忽略,但在低端设备上首次加载规则要占几百毫秒。uBlock 的优化在于把规则编译成紧凑的匹配表,实际运行时不是逐条比对 17.9 万条。