如何构建你的第一个 Firefox 扩展
构建 Firefox 扩展可能看起来令人生畏,但借助 Manifest V3 和现代 WebExtensions API,你可以在 10 分钟内创建第一个可工作的扩展。本 Firefox 扩展教程将引导你创建一个功能完整的 MV3 扩展,它可以修改网页并包含弹出界面。
核心要点
- 使用 Manifest V3 在 10 分钟内创建可工作的 Firefox 扩展
- 构建在隔离上下文中安全修改网页的内容脚本
- 实现用于用户交互的弹出界面与消息传递机制
- 遵循最小权限和外部脚本的安全最佳实践
什么是 WebExtensions?为什么选择 Manifest V3?
WebExtensions 是使用标准 Web 技术(HTML、CSS 和 JavaScript)构建的跨浏览器兼容附加组件。Firefox WebExtensions Manifest V3 代表了扩展开发的当前标准,通过 service workers 提供改进的安全性,通过声明式 API 提供更好的性能,以及更强的跨浏览器兼容性。
虽然 Firefox 仍然支持 Manifest V2,但从 Manifest V3 开始可以确保你的扩展与未来的浏览器更新保持兼容,并与 Chrome、Edge 和 Safari 的扩展架构保持一致。本指南专注于 MV3 最佳实践。
设置你的 Firefox 扩展项目结构
让我们一步步构建你的第一个 Firefox 扩展。创建一个名为 my-first-extension 的新文件夹,并添加以下必需文件:
创建 Manifest V3 配置
manifest.json 文件是任何扩展的核心。使用以下 Manifest V3 配置创建此文件:
{
"manifest_version": 3,
"name": "My Page Enhancer",
"version": "1.0.0",
"description": "Enhances web pages with custom styling",
"action": {
"default_popup": "popup.html",
"default_icon": {
"48": "icon.png"
}
},
"content_scripts": [
{
"matches": ["*://*.example.com/*"],
"js": ["content.js"]
}
],
"icons": {
"48": "icon.png"
}
}
注意使用 "action" 而不是已弃用的 "browser_action"——这是 Firefox MV3 的关键要求。该清单遵循最小权限原则,这是 Firefox 扩展的核心最佳实践。
构建用于页面修改的内容脚本
MV3 内容脚本在隔离的上下文中运行,保护你的扩展代码免受恶意页面脚本的影响。创建 content.js:
// content.js - Runs on matching pages
console.log('Extension loaded on:', window.location.href);
// Add a subtle border to all paragraphs
document.querySelectorAll('p').forEach(paragraph => {
paragraph.style.border = '2px solid #4A90E2';
paragraph.style.padding = '8px';
paragraph.style.borderRadius = '4px';
});
// Listen for messages from the popup
browser.runtime.onMessage.addListener((request, sender, sendResponse) => {
if (request.action === 'changeColor') {
document.body.style.backgroundColor = request.color;
}
});
这演示了 Manifest V3 如何将扩展代码与页面上下文隔离,防止旧扩展架构中常见的安全漏洞。
Discover how at OpenReplay.com.
创建 Firefox Action 弹出界面
action 弹出组件提供用户交互功能。创建 popup.html:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
body {
width: 300px;
padding: 16px;
font-family: system-ui, -apple-system, sans-serif;
}
button {
width: 100%;
padding: 8px;
margin: 4px 0;
cursor: pointer;
}
</style>
</head>
<body>
<h2>Page Enhancer</h2>
<button id="blue">Blue Background</button>
<button id="green">Green Background</button>
<script src="popup.js"></script>
</body>
</html>
添加相应的 popup.js 来处理用户交互:
// popup.js - Handles popup interactions
document.getElementById('blue').addEventListener('click', () => {
sendColorChange('#E3F2FD');
});
document.getElementById('green').addEventListener('click', () => {
sendColorChange('#E8F5E9');
});
async function sendColorChange(color) {
const [tab] = await browser.tabs.query({
active: true,
currentWindow: true
});
browser.tabs.sendMessage(tab.id, {
action: 'changeColor',
color: color
});
}
加载和测试你的 JavaScript Firefox 附加组件
要测试你的 JavaScript Firefox 附加组件:
- 打开 Firefox 并导航到
about:debugging - 点击左侧边栏中的”此 Firefox”
- 点击”加载临时附加组件”
- 从扩展文件夹中选择任意文件
你的扩展图标会出现在工具栏中。访问任何 example.com 页面以查看内容脚本的实际效果。点击扩展图标打开弹出窗口并测试背景颜色更改。
当你修改文件时,在 about:debugging 中点击”重新加载”即可立即应用更改——无需重启浏览器。
MV3 开发的 Firefox 扩展最佳实践
遵循这些 Firefox 扩展最佳实践可确保你的扩展通过审核并提供安全的用户体验:
- 最小权限:仅在需要访问当前标签页时请求
activeTab,避免广泛的主机权限 - 禁止内联 JavaScript:MV3 的内容安全策略会阻止内联脚本——始终使用外部
.js文件 - Service Workers:对于后台任务,使用 service workers(此处未涵盖,但对高级功能至关重要)
- 安全通信:使用
browser.runtime.sendMessage()进行组件间通信
结论
你已经成功使用 Manifest V3 构建了一个可工作的 Firefox 扩展。从简单的内容脚本过渡到功能完整的扩展遵循相同的模式:隔离上下文、消息传递和最小权限。掌握这些基础知识,你将能够构建用户信任的安全、高性能扩展。
要扩展你的技能,请探索 Storage API 以持久化用户偏好,实现后台 service workers 以处理复杂事件,并查看最新的 MDN WebExtensions 文档了解 API 更新。
常见问题
可以,使用 Manifest V3 的 WebExtensions 在各浏览器之间基本兼容。API 命名空间存在细微差异,Chrome 使用 chrome 而 Firefox 使用 browser,但 Firefox 为了兼容性同时支持两者。
manifest.json 文件在 content_scripts 部分指定了匹配模式。更改 matches 数组以包含其他域名,或使用更广泛的模式如 *://*/* 匹配所有站点,但这需要仔细考虑安全性。
将扩展打包为 ZIP 文件,在 addons.mozilla.org 上创建开发者账户,提交扩展进行审核,然后等待批准。Firefox 通常在 24-48 小时内审核扩展。
内容脚本在网页上下文中运行,可以访问和修改 DOM 元素。MV3 中的后台脚本使用 service workers 处理事件和 API 调用,但不能直接访问页面内容,需要通过消息传递进行通信。
Understand every bug
Uncover frustrations, understand bugs and fix slowdowns like never before with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.