manifest.json 逐字段详解(MV3 必备项与易错项)
manifest.json 是扩展的身份证兼操作手册:浏览器靠它认识你的扩展,也靠它划定你的权限边界。这个文件是声明式的,写错就是硬错误——不是功能异常,而是整个扩展拒绝加载。这一篇按「必备、常用、易错」三个层次过一遍 MV3 的字段。
必备字段
平台强制要求三个字段,缺一不可:
{
"manifest_version": 3,
"name": "我的扩展",
"version": "1.0.0"
}
manifest_version 只能是 3。name 最长 75 字符,会出现在安装对话框和 chrome://extensions 页面。version 是 1 到 4 段的点分非负整数,如 1.2.10,每段不超过 16 位;它决定商店更新逻辑,发版只增不减。
商店另有两条硬要求:description(最长 132 字符)和 icons。图标建议 16、48、128 三档 PNG:
{
"manifest_version": 3,
"name": "我的扩展",
"version": "1.0.0",
"description": "一句话说清楚它是干什么的",
"icons": {
"16": "icons/icon-16.png",
"48": "icons/icon-48.png",
"128": "icons/icon-128.png"
}
}
常用字段速查
| 字段 | 作用 | 关键细节 |
|---|---|---|
| action | 工具栏图标与弹窗 | default_popup 指向 HTML |
| background | 后台 Service Worker | MV3 唯一形态 |
| content_scripts | 自动注入网页的脚本 | 必须配 matches |
| permissions | API 权限列表 | 影响安装警告 |
| host_permissions | 站点权限 | 影响跨域与注入 |
| commands | 键盘快捷键 | 至多 4 个默认快捷键 |
| options_page | 设置页 | 用户长期配置 |
| default_locale | 默认语言 | 有 _locales 才可写 |
| minimum_chrome_version | 最低版本要求 | 用到新 API 时设 |
注意 default_locale 的规则是双向的:有 _locales 目录则必须写,没有则禁止写——这是 JSON 声明式文件特有的「写了也错」类目。
最容易踩的坑
坑一:JSON 语法。manifest 不允许注释、不允许尾逗号。编辑器的 JSON 校验务必开着,HBuilderX 等工具的语法检查能拦下大半低级错误,见 HBuilderX 效率技巧。
坑二:relative path 写成绝对路径。所有文件引用都是相对于扩展根目录的相对路径,写成 /images/icon.png 带前导斜杠在部分字段会失效,规范写法是 images/icon.png。
坑三:background 写法沿袭 MV2。MV2 的 "background": { "scripts": [...] } 在 MV3 已不存在,必须是:
"background": { "service_worker": "background.js" }
坑四:权限想当然。以为 tabs 权限才能用 chrome.tabs——实际上多数 tabs 方法无需任何权限,tabs 权限只是解锁读取 url、title、favIconUrl 这四个敏感属性。权限与警告的对应关系,官方有专门的 permissions-list 可查,链接见文末。
坑五:web_accessible_resources 沿用 MV2 写法。MV3 从字符串数组改成了对象数组,且必须声明资源和暴露范围的映射:
"web_accessible_resources": [
{
"resources": ["inject.js"],
"matches": ["https://example.com/*"]
}
]
一个功能完整的 MV3 manifest 样例
把常用字段拼在一起,作为项目模板:
{
"manifest_version": 3,
"name": "划词收藏夹",
"version": "0.3.0",
"description": "选中网页文字一键收藏并同步",
"icons": { "16": "icons/icon-16.png", "128": "icons/icon-128.png" },
"permissions": ["activeTab", "storage", "contextMenus"],
"host_permissions": ["https://api.myservice.com/*"],
"background": { "service_worker": "background.js" },
"action": { "default_popup": "popup.html", "default_title": "划词收藏" },
"content_scripts": [
{ "matches": ["https://*.news.com/*"], "js": ["content.js"], "run_at": "document_idle" }
],
"commands": {
"save-selection": {
"suggested_key": { "default": "Ctrl+Shift+S" },
"description": "收藏当前选中文字"
}
}
}
字段的官方权威来源
字段全集与每个字段的精确语义,以官方 Manifest 页为准:https://developer.chrome.com/docs/extensions/reference/manifest 。权限列表在 https://developer.chrome.com/docs/extensions/reference/permissions-list 。本书后续章节会逐个深入 action、background、content_scripts、commands 这些大字段。
match 模式是 host_permissions 与 content_scripts 的公共语法,写法细节容易错,正则匹配写法可参考本站《正则表达式从入门到精通》:正则实战。
字段的继承与迁移
如果你在维护一个 MV2 老扩展,manifest 迁移有固定对照关系,官方 migrate 文档有完整清单,这里列最常改的几项:
| MV2 写法 | MV3 写法 |
|---|---|
| browser_action | action |
| page_action | action(统一进工具栏) |
| background.scripts | background.service_worker |
| webRequest 阻塞监听 | declarativeNetRequest 规则 |
| web_accessible_resources: ["a.js"] | 数组对象形式(带 matches) |
| content_security_policy 字符串 | 对象形式(extension_pages / sandbox) |
| 远程托管代码 | 禁止,全部打进包 |
MV2 的 manifest 文档仍在官方站点保留(developer.chrome.com/docs/extensions/mv2/manifest),核对旧字段时有用,但新项目一律从 MV3 文档出发。
manifest 的调试与校验
声明式文件的排错有自己的特点:错误发生在「加载时」而不是「运行时」,因此要用加载时的反馈来查。三层校验由浅入深:
- 编辑器层:JSON 语法校验,拦住逗号、注释、引号问题,工程化项目可加 schema 校验(社区有 manifest 的 JSON Schema,编辑器装插件后 manifest 能自动提示字段);
- 浏览器层:chrome://extensions 的「错误」按钮,报错信息精确到字段名,比如 unrecognized key 或 invalid value;
- 行为层:扩展加载成功但某功能不工作,先怀疑权限与路径——console 里会出现「cannot access」类报错,反查 manifest 对应声明。
「加载成功但功能静默失效」是声明式文件最迷惑人的地方:拼错一个字段名(如 command 写成 commands 的子结构错位)浏览器可能只是忽略它而不报错。所以养成习惯:改完 manifest 重载扩展后,到错误按钮确认零报错,再测功能。
结构化的 manifest 管理
manifest 会随功能增长越来越大,两个管理建议。一是加注释的需求用「生成式」方案:用脚本从带注释的源文件(如 JSON5 或 JS 配置)生成纯 JSON,构建时顺带做版本号注入;二是至少把 manifest 纳入 code review 的必看文件——它是全项目唯一「错一行全盘拒绝」的文件,合并冲突要人工逐字段核对,不能随手 accept。
字段全集与每个字段的精确语义,以官方 Manifest 页为准:https://developer.chrome.com/docs/extensions/reference/manifest 。match 模式是 host_permissions 与 content_scripts 的公共语法,写法细节容易错,正则匹配写法可参考本站《正则表达式从入门到精通》:正则实战。
本章由 WorkBuddy 原创整理,API 行为依据 Chrome 扩展官方文档(Manifest V3)。
