document rules自动扫描同源a标签并过滤非法链接;href_matches需用完整url正则且注意转义;selector_matches更安全精准;eagerness须配合where使用;规则按数组顺序匹配,高优先级路径应前置。

document rules 会自动扫描所有 a 标签,但默认只处理同源链接
浏览器拿到 source: "document" 规则后,会立即遍历当前 DOM 中所有 a 元素,提取其 href 属性值,并过滤掉跨域、空值、锚点(#)、mailto:、tel: 等非法协议链接。这个过程不依赖 JS,也不需要你手动绑定事件或写循环。
关键限制是:跨域链接直接被跳过,连日志都不会打;含 form、meta http-equiv="refresh" 或 POST 表单的页面也会被浏览器自动排除,无需你额外判断。
常见误操作:href_matches: "/*" 这种写法看似“匹配全部”,实则会命中页脚版权链接、隐私政策等低价值页面,导致内存占用飙升——尤其在商品列表页有上百个卡片链接时,eager 模式下极易触发崩溃。
href_matches 是正则,不是 glob,写错就全失效
href_matches 字段接受标准 JavaScript 正则语法,必须用字符串形式写入 JSON,且需注意转义。它匹配的是完整 URL(含协议和域名),不是相对路径片段。
- 正确示例:
"href_matches": "^https?://example.com/product/\d+$"(匹配/product/123,注意双反斜杠) - 错误示例:
"href_matches": "/product/*"(*不是正则通配符,会被当作字面量字符) - 错误示例:
"href_matches": "product/\d+"(没加^和域名,可能误匹配https://evil.com/product/123)
调试建议:先在控制台运行 [...document.querySelectorAll('a')].map(a => a.href),复制真实 href 值,再粘贴到 regex101.com 验证正则是否匹配准确。
selector_matches 比 href_matches 更安全,适合 React/Vue 动态页面
如果你能控制页面 HTML 输出(比如服务端渲染或静态生成),给高价值链接加一个属性,比如 @#@#@#@#@#@#@#@#@#@0,然后用 selector_matches: "a[data-prerender]",比正则更精准、无歧义、无需考虑 URL 构造逻辑。
这个方式天然兼容 SPA:Vue/React 渲染完新 DOM 后,Speculation Rules 会重新扫描(只要新 a 已挂载到 document),不需要你手动调用 API 或重载规则。
注意:selector_matches 只支持 CSS 选择器语法,不支持伪类(如 :hover)或动态状态,也不能写 document.querySelector 那样的 JS 表达式。
eagerness 必须和 where 配合,否则 moderate 会扫光整个页面
eagerness: "moderate" 单独使用时,浏览器会把所有同源 a 都纳入悬停监听范围——包括分页导航、面包屑、页脚链接。这不是设计缺陷,而是规范明确要求的行为。真正可控的方式是加 where 条件:
"where": { "href_matches": "/blog/\d+" }"where": { "selector_matches": "nav a, .article-list a" }
没有 where,eagerness 就等于“开盲盒”。conservative 虽然延迟高,但副作用风险反而更大:用户鼠标按下瞬间就执行 fetch 或 localStorage 写入,哪怕他最终拖走了也不会取消。
最易忽略的一点:多个 prerender 规则按数组顺序匹配,首个 where 成功即终止,后面的规则不会执行。所以要把高转化率路径(如结账、详情页)放在数组前面。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











