共计 2041 个字符,预计需要花费 6 分钟才能阅读完成。
背景痛点
在日常使用网页版 ChatGPT 时,我们经常遇到几个核心问题:

- 上下文丢失:每次刷新页面或切换对话都会清空历史记录
- 页面割裂:需要手动复制粘贴其他网页内容到 ChatGPT 界面
- 功能单一:无法根据当前浏览页面内容提供智能建议
浏览器插件能完美解决这些问题:
- 通过后台服务维持持久会话
- 直接读取当前页面 DOM 内容
- 添加右键菜单等交互入口
技术选型
Manifest V3 vs V2
选择 Manifest V3 的三大理由:
- 更强的安全性:用 service worker 替代 background page
- 更好的性能:限制资源加载,强制使用 Promise
- 未来兼容性:Chrome 应用商店已强制要求 V3
关键差异对比:
- V3 不再支持远程托管代码
- 网络请求必须声明在
host_permissions - 最大持久存储从 5MB 提升到 10GB
核心实现
OAuth2 认证实现
// 在 manifest.json 中声明 identity 权限
{"permissions": ["identity"]
}
// 认证函数实现
const getAuthToken = async (): Promise<string> => {
try {const {token} = await chrome.identity.getAuthToken({interactive: true});
return token;
} catch (err) {console.error('Auth failed:', err);
throw new Error('用户取消授权');
}
};
通信架构设计
内容脚本与后台服务的通信采用分层设计:
- 内容脚本:监听 DOM 变化
- 中间层:处理消息路由
- Service Worker:维护 API 连接
// content-script.ts
chrome.runtime.sendMessage({
type: 'ANALYZE_PAGE',
html: document.documentElement.innerHTML
});
// background.ts
chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {if (msg.type === 'ANALYZE_PAGE') {processPageContent(msg.html);
}
});
防抖优化
处理快速连续请求的典型方案:
let debounceTimer: number;
const debounceRequest = (query: string) => {clearTimeout(debounceTimer);
debounceTimer = setTimeout(async () => {const response = await fetchAPI(query);
// 更新 UI...
}, 300);
};
安全实践
数据存储决策树
| 数据类型 | 存储方案 | 示例 |
|---|---|---|
| 临时会话 | sessionStorage | OAuth 状态 token |
| 用户配置 | chrome.storage.local | API 密钥 |
| 敏感信息 | chrome.storage.managed | 企业凭证 |
CSP 配置示例
{
"content_security_policy": {"extension_pages": "script-src'self'; object-src'self'"}
}
避坑指南
CSP 绕过技巧
当遇到页面 CSP 限制时:
- 使用
chrome.declarativeNetRequest重写响应头 - 通过 iframe 沙箱加载第三方资源
- 将外部库打包为本地资源
热重载配置
在 vite.config.js 中添加:
plugins: [
{
name: 'reload-extension',
handleHotUpdate({server}) {server.ws.send({ type: 'full-reload'});
return [];}
}
]
性能优化
Worker 基准测试
处理 10 万字文本时的耗时对比:
| 方案 | 首次加载(ms) | 平均耗时(ms) |
|---|---|---|
| 主线程 | 1200 | 850 |
| Web Worker | 150 | 200 |
实现代码:
// worker.ts
self.onmessage = async (e) => {const result = await analyzeText(e.data);
self.postMessage(result);
};
// 主线程
const worker = new Worker('worker.js');
worker.postMessage(largeText);
发布 Checklist
- 完善 manifest.json 的 icons 字段
- 提供 128×128 和 48×48 两种尺寸图标
- 验证所有权限声明必要性
- 测试隐身模式下的功能
- 准备隐私政策文档
- 录制功能演示视频
结语
通过这个项目,我们不仅实现了 ChatGPT 与浏览器的深度集成,更重要的是掌握了一套标准的浏览器扩展开发模式。建议在此基础上继续探索:
- 添加 Markdown 渲染支持
- 实现对话历史本地加密存储
- 开发跨浏览器兼容版本
完整的示例代码已上传 GitHub,欢迎在项目中实际体验这种开发方式带来的效率提升。
正文完
发表至: 技术开发
近两天内
