-
Notifications
You must be signed in to change notification settings - Fork 0
Description
背景
当前项目在命名和结构上都有明显的历史混用问题,已经开始影响后续迭代效率。
1. 品牌命名混乱
仓库当前同时出现了 Nolo / Nolook / nolo:
manifest.json的name/action.default_title还是Nolomanifest.json的description又写成了Nolook: Use URL filter syntax to block webs for nolookREADME.md标题是Nolo (Nolook)package.json的包名还是nolo- 代码内部还存在
globalThis.NoloRuleUtils、[Nolo]日志前缀等耦合命名
这会带来两个问题:
- 用户侧品牌识别不稳定
- 开发侧内部符号和产品命名绑得过紧,后续再改名成本高
2. 项目结构已经开始不适合继续扩展
当前仓库几乎所有运行时文件都平铺在根目录:
- background
- popup
- blocked page
- shared utils
- tests
- icons
这在功能少的时候还能接受,但后续准备继续做:
- allow 例外规则
- 更完整的规则管理界面
- 更清晰的设置能力
- 可能的 options page / 高级规则能力
继续保持根目录平铺,会让职责边界越来越模糊。
这件事要解决什么
本 issue 的目标不是“单纯改个名字”,而是做一次面向后续功能演进的基础治理:
- 统一产品品牌到
Nolook - 清理 manifest / README / UI / 包名 / 代码符号的命名不一致
- 按 Chrome Extension 的运行上下文重新组织目录结构
- 为后续 issue(尤其是 feat: 支持 allow 例外规则,实现父路径拦截与子路径放行 #2 allow 例外规则)提供更稳定的代码地基
官方技术调研结论
1. 官方对命名字段有明确约束
Chrome 官方 manifest 文档说明:
name是扩展的主标识文本,最大 75 个字符description是纯文本,最大 132 个字符,且应同时适合chrome://extensions和 Chrome Web Storeshort_name是可选字段,官方建议最长 12 个字符,用于空间不足时显示
这意味着当前这种 Nolo / Nolook 混用,以及不自然的 description,确实应该尽快统一和修正。
2. 官方没有规定唯一的目录树,但明确规定了“上下文角色”
Chrome 官方并没有强制要求扩展必须采用某一种固定目录结构;它强调的是:
manifest.json必须位于扩展根目录- 扩展由多个“承担不同角色”的部分组成
- 这些部分包括 manifest、service worker、popup、content scripts、extension pages 等
换句话说,官方关注的是“按运行上下文清晰分工”,而不是“必须叫 src / app / lib 中的哪一个”。
因此,对这个项目来说,更合理的组织方式不是继续平铺,而是按上下文拆分:
- background
- popup
- blocked
- options
- shared/core
- assets
- tests
3. Popup 不是长期承载复杂设置的理想位置
Chrome 官方 popup 文档明确指出:
- popup 会在用户点击到外部区域后自动关闭
- 没有办法在用户点击离开后继续保持 popup 打开
- popup 的 JavaScript 也应放在单独文件中
这说明:
- popup 适合做“快速操作”
- 不适合承载越来越复杂的完整设置界面
随着 Nolo... 不,应该说 Nolook 后续会继续增加规则能力,完整规则管理更适合迁到 options page,而 popup 保持轻量。
4. Options page 才是官方定义的“扩展设置入口”
Chrome 官方 options page 文档明确表示:
- options page 用来让用户启用功能、选择和调整扩展能力
- 可以声明为
options_page或options_ui - 页面路径相对于扩展根目录声明
- popup 内还可以通过
chrome.runtime.openOptionsPage()跳转过去
这非常适合 Nolook 的未来方向:
- popup 负责快速开关和快捷入口
- options page 负责规则列表、规则类型、未来的 allow 例外规则、高级说明等
5. Background Service Worker 支持模块化组织
Chrome 官方 service worker 文档说明:
- background 通过 manifest 的
background.service_worker注册 - 既可以继续用
importScripts() - 也可以把 service worker 声明为
type: "module",使用标准import
这意味着当前项目如果要做结构治理,完全可以顺手把背景脚本和共享逻辑切到更清晰的模块化结构,减少 globalThis.NoloRuleUtils 这类全局耦合。
6. web_accessible_resources 应保持最小暴露面
Chrome 官方文档说明:
- 默认情况下,扩展资源不是 web accessible
- 只有显式声明的资源才可被网页访问
- 导航到扩展资源也要求该资源在
web_accessible_resources中声明
这说明在结构重组时,仍应继续坚持最小暴露面原则,不因为目录移动而扩大资源暴露范围。
7. 图标和 manifest 元数据最好一并整理到统一品牌下
Chrome 官方图标文档建议:
- 提供
128x128、48x48等 PNG 图标 action.default_icon建议提供多尺寸
现在图标体系已经相对规范,这次治理应该把它和 Nolook 品牌命名一起统一,而不是只改文案不改 manifest 元数据。
需求定义
目标
- 将项目所有用户可见品牌统一为
Nolook - 将项目目录按扩展上下文重新组织,降低根目录平铺度
- 为未来复杂规则管理预留
options分层 - 降低内部代码对品牌命名的耦合度
- 不改变当前扩展的核心行为闭环:
- popup 快速配置
- background 规则同步
- blocked page 展示拦截详情
非目标
- 本 issue 不直接实现 allow 例外规则本身(见 feat: 支持 allow 例外规则,实现父路径拦截与子路径放行 #2)
- 本 issue 不强制引入打包器
- 本 issue 不要求马上迁移到 TypeScript
- 本 issue 不要求立刻修改 GitHub 仓库 slug
当前项目的主要结构问题
1. 根目录职责过多
当前根目录同时包含:
- manifest
- 页面 HTML/CSS/JS
- background worker
- 图标资源
- 共享逻辑
- 测试文件
对于一个还会继续演进的扩展来说,这已经开始影响可读性。
2. 共享逻辑和运行时上下文混在一起
例如:
rule-utils.js是纯逻辑background.js是 service workerpopup.js/blocked.js是页面交互逻辑
它们本来就属于不同层次,但现在都平铺在同一层,而且共享逻辑通过全局变量暴露,维护成本偏高。
3. popup 承担的职责已经开始过重
当前 popup 已经不只是快速入口,而是主要规则管理入口。继续在 popup 里堆更多能力,会和官方建议的使用方式越来越背离。
推荐技术方案
一、先统一品牌,再做结构重组
建议统一采用:
- 产品名:
Nolook - manifest
name:Nolook - manifest
short_name:Nolook - popup / blocked / README / 文档 / 标题统一为
Nolook
同时建议把内部代码中的品牌耦合命名弱化,例如:
NoloRuleUtils-> 更中性的模块导出[Nolo]->[Nolook]或更中性的日志前缀
二、目录按“扩展上下文 + 共享层”组织
推荐的无构建工具目录结构:
/
manifest.json
package.json
README.md
biome.json
assets/
icons/
icon16.png
icon24.png
icon32.png
icon48.png
icon128.png
icon.svg
src/
background/
service-worker.js
core/
rules.js
state.js
messages.js
constants.js
pages/
popup/
popup.html
popup.css
popup.js
blocked/
blocked.html
blocked.css
blocked.js
options/
options.html
options.css
options.js
tests/
rule-utils.test.js
说明:
manifest.json保持在根目录,符合官方要求- 运行时文件按上下文拆分
- 纯逻辑沉到
core/ - 图标资源集中到
assets/icons/ - 测试与运行时源码分离
三、推荐把 background 与共享逻辑改为模块化
建议将 background 声明为:
"background": {
"service_worker": "src/background/service-worker.js",
"type": "module"
}然后使用标准 import 组织 core/ 逻辑。
页面端也可以逐步采用模块脚本,减少:
- 全局变量挂载
- 品牌名绑定到全局 API 名称
- 共享逻辑多入口维护的隐式耦合
四、重新划分 popup 与 options 的职责
推荐的职责划分:
popup
保留为轻量快速入口:
- 全局开关
- 快捷添加一条规则(可选)
- 最近规则概览 / 规则数量
- 进入完整设置页按钮
options page
承载完整配置:
- 全量规则管理
- 规则启停 / 删除 / 编辑
- 未来 allow 例外规则
- 高级说明和帮助文档
blocked page
继续保持单一职责:
- 只负责展示本次被拦截的命中规则与原始请求信息
五、Manifest 一并规范化
建议在这次治理中同时完成:
name统一为Nolook- 新增
short_name - 重写
description,让它更适合chrome://extensions/ Chrome Web Store - 继续保持
action.default_icon和icons的官方推荐写法 - 目录移动后同步更新
default_popup/background.service_worker/web_accessible_resources/ 图标路径
六、GitHub 仓库名称可作为后续独立动作
仓库当前叫 Nolo。如果最终也要统一到 Nolook,建议把“GitHub repo slug 改名”作为单独动作处理。
原因:
- GitHub 虽然会保留重定向,但仍会影响 clone URL、远端配置、PR 链接心智
- 相比之下,先把代码、文档、manifest、UI 全部统一更稳
验收标准
品牌统一
-
manifest.json、README、popup、blocked、包名、文案统一为Nolook - 不再出现面向用户的
Nolo/Nolook混用 - 内部代码中的品牌耦合命名得到清理或收敛
结构治理
- 根目录仅保留 manifest、配置、文档和高层入口文件
- 背景脚本、页面脚本、共享逻辑、测试、图标分层清晰
- manifest 路径全部更新且扩展可正常加载
职责边界
- popup 保持轻量
- options page 成为完整设置入口(至少完成基础落位)
- blocked page 继续保持单一职责
验证
-
npm test通过 - Chrome unpacked extension 可正常加载
- popup / blocked 页面功能不回退
- 动态规则同步链路不回退
具体实施规划
Phase 1: 品牌与 manifest 清理
- 统一产品名为
Nolook - 更新 manifest 的
name/short_name/description/default_title - 更新 README、UI 标题、页面标题、alt 文本、日志前缀
- 评估并更新
package.json名称
Phase 2: 目录重组
- 新建
assets/、src/、tests/分层 - 将 popup / blocked / background / core 文件迁移到新位置
- 更新所有 HTML 引用路径和 manifest 路径
- 确认
web_accessible_resources仍保持最小暴露面
Phase 3: 模块化治理
- 将 background service worker 切到模块模式
- 将共享逻辑改为标准模块导出
- 移除对
globalThis.NoloRuleUtils的依赖 - 梳理消息类型、常量、状态处理边界
Phase 4: popup / options 职责重构
- 为扩展增加 options page 落位
- popup 中增加“进入完整设置”的入口
- 将复杂规则管理逐步迁到 options page
- 保持 popup 的快速操作体验
Phase 5: 验证与文档
- 调整测试路径与导入方式
- 补充 README 中的目录结构说明
- 手动验证 Chrome unpacked 安装与核心流程
- 为后续 feat: 支持 allow 例外规则,实现父路径拦截与子路径放行 #2 allow 规则改造确认新的落脚位置
建议执行顺序
建议优先完成本 issue,再继续推进 #2。
原因:
- feat: 支持 allow 例外规则,实现父路径拦截与子路径放行 #2 会进一步扩展规则模型和 UI 复杂度
- 如果先完成品牌统一和结构治理,后续 allow 例外规则会更容易落地
- 能避免在旧命名和旧目录结构上继续堆功能
参考资料
- Manifest file format: https://developer.chrome.com/docs/extensions/reference/manifest
- Manifest name: https://developer.chrome.com/docs/extensions/reference/manifest/name
- Manifest short_name: https://developer.chrome.com/docs/extensions/reference/manifest/short-name
- Manifest description: https://developer.chrome.com/docs/extensions/reference/manifest/description
- Extension service worker basics: https://developer.chrome.com/docs/extensions/develop/concepts/service-workers/basics
- Add a popup: https://developer.chrome.com/docs/extensions/develop/ui/add-popup
- Give users options: https://developer.chrome.com/docs/extensions/develop/ui/options-page
- Manifest icons: https://developer.chrome.com/docs/extensions/reference/manifest/icons
- Manifest web_accessible_resources: https://developer.chrome.com/docs/extensions/reference/manifest/web-accessible-resources
- Get started / extension terminology: https://developer.chrome.com/docs/extensions/get-started