专注于使用Manifest V3构建Chrome扩展的专家技能。涵盖后台脚本、Service Workers、内容脚本和跨上下文通信。
技能概述
chrome-extension-developer 技能是一个高级Chrome扩展开发专家技能,专注于现代扩展架构,特别是Manifest V3、跨脚本通信和生产级安全实践。该技能帮助开发者构建安全、高效的Chrome扩展程序。
下载地址:agentic-awesome-skills/skills/chrome-extension-developer at main · sickn33/agentic-awesome-skills · GitHub
主要功能
- Manifest V3架构: 提供现代Chrome扩展的标准架构设计
- Service Workers: 实现后台服务工作者替代传统后台页面
- 内容脚本: 开发与网页DOM交互的内容脚本
- 跨上下文通信: 实现不同脚本上下文之间的消息传递
- 扩展API集成: 使用存储、权限、闹钟、侧边栏等扩展API
触发条件
在以下情况下应该使用此技能:
- 从头开始设计和构建新的Chrome扩展
- 将扩展从Manifest V2迁移到Manifest V3
- 实现Service Workers、内容脚本或弹出窗口/选项页面
- 调试跨上下文通信(消息传递)
- 实现扩展特定的API(存储、权限、闹钟、侧边栏)
不适用场景
以下情况不应使用此技能
- 开发Safari应用扩展(应使用safari-extension-expert)
- 在不使用WebExtensions API的情况下开发Firefox扩展
- 不与扩展API交互的常规Web开发
核心指令
1. Manifest V3优先
始终优先使用Service Workers而不是后台页面。Manifest V3是Chrome扩展的现代标准。
2. 上下文分离
明确区分Service Workers(后台)、内容脚本(可访问DOM)和UI上下文(弹出窗口、选项页面)。
3. 消息传递
使用chrome.runtime.sendMessage和chrome.tabs.sendMessage进行可靠的通信。始终使用responseCallback。
4. 权限管理
遵循最小权限原则。尽可能使用optional_permissions。
5. 存储方案
使用chrome.storage.local或chrome.storage.sync进行持久化数据存储,而不是localStorage。
6. 声明式API
使用declarativeNetRequest进行网络过滤/修改。
使用示例
示例1: 基本Manifest V3结构
{
"manifest_version": 3,
"name": "My Agentic Extension",
"version": "1.0.0",
"action": {
"default_popup": "popup.html"
},
"background": {
"service_worker": "background.js"
},
"content_scripts": [
{
"matches": ["https://*.example.com/*"],
"js": ["content.js"]
}
],
"permissions": ["storage", "activeTab"]
}
示例2: 消息传递策略
// background.js (Service Worker)
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
if (message.type === "GREET_AGENT") {
console.log("Received message from content script:", message.data);
sendResponse({ status: "ACK", reply: "Hello from Background" });
}
return true; // 保持消息通道开放以进行异步响应
});
最佳实践
应该做的:
- 使用
chrome.runtime.onInstalled进行扩展初始化 - 如果在manifest中配置,使用现代ES模块
- 在内容脚本中验证外部输入后再执行操作
不应该做的:
- 使用
innerHTML或eval()- 优先使用textContent和安全的DOM API - 在Service Worker中阻塞主线程;它必须保持响应
故障排除
问题: Service Worker变为非活动状态
解决方案:后台Service Workers是临时的。使用chrome.alarms进行计划任务,而不是使用可能被终止的setTimeout或setInterval。
使用限制
仅在任务明确匹配上述范围时使用此技能。不要将输出作为环境特定验证、测试或专家审查的替代品。如果缺少所需的输入、权限、安全边界或成功标准,请停止并寻求澄清。