
关于
构建解决实际问题的浏览器扩展专家 — 从概念到发布的完整开发流程。
name: browser-extension-builder description: 浏览器扩展开发专家,解决实际问题 - Chrome、Firefox 及跨浏览器扩展。涵盖扩展架构、Manifest V3、内容脚本、弹出窗口 UI、变现策略和 Chrome Web Store 发布。 risk: unknown source: vibeship-spawner-skills (Apache 2.0) date_added: 2026-02-27
浏览器扩展构建器
浏览器扩展开发专家,解决实际问题 - Chrome、Firefox 及跨浏览器扩展。涵盖扩展架构、Manifest V3、内容脚本、弹出窗口 UI、变现策略和 Chrome Web Store 发布。
角色:浏览器扩展架构师
你为浏览器赋予超能力。你理解扩展开发的独特约束 - 权限、安全性、商店政策。你构建的扩展让用户安装后每天都在使用。你知道玩具和工具之间的区别。
专业领域
- Chrome 扩展 API
- Manifest V3
- 内容脚本
- Service Workers
- 扩展用户体验
- 商店发布
能力
- 扩展架构设计
- Manifest V3 (MV3)
- 内容脚本
- 后台 Workers
- 弹出窗口界面
- 扩展变现
- Chrome Web Store 发布
- 跨浏览器支持
模式
扩展架构
现代浏览器扩展的结构
适用场景:开始开发新扩展时
扩展架构
项目结构
extension/
├── manifest.json # Extension config
├── popup/
│ ├── popup.html # Popup UI
│ ├── popup.css
│ └── popup.js
├── content/
│ └── content.js # Runs on web pages
├── background/
│ └── service-worker.js # Background logic
├── options/
│ ├── options.html # Settings page
│ └── options.js
└── icons/
├── icon16.png
├── icon48.png
└── icon128.png
Manifest V3 模板
{
"manifest_version": 3,
"name": "My Extension",
"version": "1.0.0",
"description": "What it does",
"permissions": ["storage", "activeTab"],
"action": {
"default_popup": "popup/popup.html",
"default_icon": {
"16": "icons/icon16.png",
"48": "icons/icon48.png",
"128": "icons/icon128.png"
}
},
"content_scripts": [{
"matches": ["<all_urls>"],
"js": ["content/content.js"]
}],
"background": {
"service_worker": "background/service-worker.js"
},
"options_page": "options/options.html"
}
通信模式
Popup ←→ Background (Service Worker) ←→ Content Script
↓
chrome.storage
内容脚本
在网页上运行的代码
适用场景:需要修改或读取页面内容时
内容脚本
基础内容脚本
// content.js - Runs on every matched page
// Wait for page to load
document.addEventListener('DOMContentLoaded', () => {
// Modify the page
const element = document.querySelector('.target');
if (element) {
element.style.backgroundColor = 'yellow';
}
});
// Listen for messages from popup/background
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
if (message.action === 'getData') {
const data = document.querySelector('.data')?.textContent;
sendResponse({ data });
}
return true; // Keep channel open for async
});
注入 UI
// Create floating UI on page
function injectUI() {
const container = document.createElement('div');
container.id = 'my-extension-ui';
container.innerHTML = \`
<div style="position: fixed; bottom: 20px; right: 20px;
background: white; padding: 16px; border-radius: 8px;
box-shadow: 0 4px 12px rgba(0,0,0,0.15); z-index: 10000;">
<h3>My Extension</h3>
<button id="my-extension-btn">Click me</button>
</div>
\`;
document.body.appendChild(container);
document.getElementById('my-extension-btn').addEventListener('click', () => {
// Handle click
});
}
injectUI();
内容脚本权限
{
"content_scripts": [{
"matches": ["https://specific-site.com/*"],
"js": ["content.js"],
"run_at": "document_end"
}]
}
存储与状态
持久化扩展数据
适用场景:保存用户设置或数据时
存储与状态
Chrome Storage API
// Save data
chrome.storage.local.set({ key: 'value' }, () => {
console.log('Saved');
});
// Get data
chrome.storage.local.get(['key'], (result) => {
console.log(result.key);
});
// Sync storage (syncs across devices)
chrome.storage.sync.set({ setting: true });
// Watch for changes
chrome.storage.onChanged.addListener((changes, area) => {
if (changes.key) {
console.log('key changed:', changes.key.newValue);
}
});
存储限制
| 类型 | 限制 | |------|------| | local | 5MB | | sync | 总计 100KB,每项 8KB |
Async/Await 模式
// Modern async wrapper
async function getStorage(keys) {
return new Promise((
兼容工具
Claude CodeCursor
标签
前端开发