Skip to content

⚡️ 压缩用户管理网络规则的 DNR 编译输出 - #1733

Open
cyfung1031 wants to merge 1 commit into
mainfrom
codex/dnr-compiler-compaction
Open

⚡️ 压缩用户管理网络规则的 DNR 编译输出#1733
cyfung1031 wants to merge 1 commit into
mainfrom
codex/dnr-compiler-compaction

Conversation

@cyfung1031

Copy link
Copy Markdown
Collaborator

Checklist / 检查清单

  • Fixes mentioned issues / 修复已提及的问题
  • Code reviewed by human / 代码通过人工检查
  • Changes tested / 已完成测试

人工 review 尚未发生;本次 commit 已由三个分拆的自动化 review packet 分别检查 semantic/priority、domain canonicalization、以及 tests/scope,并在 commit SHA 上重新绑定复核。

背景

User-managed network rules 目前每条 enabled logical rule 都占用一条 physical DNR rule。大量相同的 response-header removal rules 会不必要地消耗 modifyHeaders dynamic-rule quota。

本次改动

  • 在 logical candidates 编译完成后,只压缩 active priority sequence 中连续的 pure response-header removal rules。
  • 只有 compiled action 相同、且 compiled condition 除 requestDomains 外 canonical-equal 时才合并。
  • 合并时对 domains 做 normalization、去重、父域消除和 deterministic sorting,并按 MAX_RULE_DOMAINS 分块。
  • 保留 run 的最高 logical priority、既有 user-rule ID range 和 full reconcile applier;不修改 storage、UI、logical ordering 或 service protocol。
  • 补充 compiler edge-case Vitest,并更新 service-level physical-output expectation。

实现考虑

active enabled rule 是 merge barrier;disabled rule 在 candidate 阶段被跳过,因此不会阻断相邻 active rules。signature 使用完整 compiled condition 减去唯一允许变化的 requestDomains,只对已知 set-like fields canonicalize,避免未来字段被未知地忽略。第一版只允许 idempotent response-header remove,不会合并 appendset、request-header modification、redirect、allow 或 block。

已知限制

  • 本 PR 不实现 delta apply 或 stable physical IDs。
  • 没有执行真实浏览器 DNR runtime/E2E;变更集中在低层纯 compiler logic,已用 Vitest、caller tests、typecheck、lint 和 production build 验证。
  • production build 保留既有 Rspack bundle-size 与 Monaco critical-dependency warnings;没有新增 warning 类别的判断依据。

建议审查重点

  • active barrier 不被跨越,disabled barrier 可以被忽略。
  • 合并后 priority、physical IDs、100-domain chunking 和完整 domain preservation。
  • 条件 Cartesian-product 不会因 requestDomains 之外的字段差异而产生。
  • IP-like / IPv6-like hosts 不会被错误当作 DNS parent domain 消除。

验证

  • TDD reproduction:实现前 focused compiler run 为 5 个新增 compaction cases failed、15 个既有 cases passed。
  • pnpm exec vitest run --no-coverage --reporter=default src/app/service/service_worker/network_rule_compiler.test.ts src/app/service/service_worker/network_rule.test.ts src/app/repo/network_rule.test.ts src/pages/options/routes/Tools/sections/NetworkRulesSection.test.tsx — 4 files, 69 tests passed。
  • pnpm run lint — Prettier, TypeScript, i18n, issue-template checks and ESLint passed。
  • pnpm run build — passed; only existing size/Monaco warnings were emitted。
  • Post-commit review target: 9e07a8a1d22c0db00e74f6b3b0526ed9c34edb23; semantic, domain, and tests/scope packets all accepted.

@cyfung1031

Copy link
Copy Markdown
Collaborator Author

既有 vitest timeout 问题见 #1734

@CodFrm

CodFrm commented Sep 9, 2026

Copy link
Copy Markdown
Member

不是很认可,哪怕 modifyHeaders 属于 DNR 的 unsafe rule,Chrome 上限 5000,一般也很难达到

而且这么压缩过后产生不一致性,会导致问题排查困难,换来的收益微乎其微

@cyfung1031

cyfung1031 commented Sep 9, 2026

Copy link
Copy Markdown
Collaborator Author

不是很认可,哪怕 modifyHeaders 属于 DNR 的 unsafe rule,Chrome 上限 5000,一般也很难达到

而且这么压缩过后产生不一致性,会导致问题排查困难,换来的收益微乎其微

这个是在DNR 层做统一合并。用户使用不变。
有问题就加edge case用AI排错
代码只是一些逻辑处理
连E2E都不用

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants