Chrome插件开发实战:如何用Gitee私有仓库保存所有标签页(附完整源码)

发布时间:2026/7/18 6:41:19

Chrome插件开发实战:如何用Gitee私有仓库保存所有标签页(附完整源码) Chrome插件开发实战Gitee私有仓库同步标签页完整指南1. 项目背景与核心思路每次在Chrome中同时打开十几个研究资料标签页时最怕的就是浏览器意外崩溃。传统的书签管理方式无法保存完整的会话状态而云同步服务又存在隐私顾虑。这个插件正是为了解决这个痛点而生——将当前所有标签页信息加密存储到Gitee私有仓库实现版本可控的会话管理。核心架构分为三个模块数据采集层通过Chrome API获取当前窗口所有标签页的URL和标题存储层利用Gitee API将数据以JSON格式存入指定仓库交互层通过浏览器右上角的弹出窗口实现一键保存/恢复提示Gitee的免费私有仓库完全够用个人需求且国内访问速度稳定2. 开发环境准备2.1 基础工具链配置推荐使用以下开发环境组合# 检查Node版本要求v16 node -v # 初始化项目 mkdir chrome-tabs-saver cd chrome-tabs-saver npm init -y # 安装TypeScript支持 npm install typescript types/chrome --save-dev2.2 插件项目结构典型Chrome插件需要以下目录结构├── manifest.json # 插件配置文件 ├── src │ ├── background.ts # 后台服务脚本 │ ├── popup.html # 弹出窗口界面 │ └── content.ts # 内容脚本本项目不需要 └── icons # 插件图标目录2.3 Gitee API准备登录Gitee创建私有仓库如tabs-backup在[个人设置→私人令牌]生成Access Token记录以下关键信息仓库所有者owner仓库名称repo访问令牌token3. 核心功能实现3.1 标签页数据采集通过Chrome.tabs API获取当前窗口所有标签页interface TabData { url: string; title: string; favIcon?: string; } async function getAllTabs(): PromiseTabData[] { return new Promise((resolve) { chrome.tabs.query({ currentWindow: true }, (tabs) { const result tabs.map(tab ({ url: tab.url || , title: tab.title || , favIcon: tab.favIconUrl })); resolve(result); }); }); }3.2 Gitee存储模块实现文件读写操作的API封装const GITEE_API https://gitee.com/api/v5/repos; async function saveToGitee(data: TabData[]) { const content btoa(JSON.stringify(data)); const path sessions/${new Date().toISOString()}.json; const response await fetch( ${GITEE_API}/${owner}/${repo}/contents/${path}, { method: POST, headers: { Content-Type: application/json, Authorization: token ${token} }, body: JSON.stringify({ content, message: Auto saved tabs }) } ); if (!response.ok) throw new Error(Save failed); }3.3 恢复标签页功能async function restoreFromGitee(sessionId: string) { const response await fetch( ${GITEE_API}/${owner}/${repo}/contents/sessions/${sessionId}, { headers: { Authorization: token ${token} } } ); const { content } await response.json(); const tabs JSON.parse(atob(content)); // 在新窗口打开所有标签页 chrome.windows.create({ url: tabs.map(t t.url) }); }4. 用户界面开发4.1 弹出窗口设计popup.html基础结构div classcontainer h3标签页管理器/h3 button idsave保存当前会话/button div classsessions-list !-- 动态加载历史会话 -- /div /div4.2 样式优化技巧添加popup.css实现现代化UI.container { width: 300px; padding: 12px; } button { background: #2468f2; color: white; border: none; padding: 8px 16px; border-radius: 4px; cursor: pointer; } .sessions-list { margin-top: 12px; max-height: 400px; overflow-y: auto; }4.3 交互逻辑实现popup.ts中的事件处理document.getElementById(save)?.addEventListener(click, async () { const tabs await getAllTabs(); await saveToGitee(tabs); alert(保存成功); }); // 加载历史会话列表 async function loadSessions() { const response await fetch( ${GITEE_API}/${owner}/${repo}/contents/sessions, { headers: { Authorization: token ${token} } } ); const sessions await response.json(); // 渲染到UI... }5. 高级功能扩展5.1 数据加密方案为保护隐私建议在存储前加密数据import CryptoJS from crypto-js; function encryptData(data: string, password: string): string { return CryptoJS.AES.encrypt(data, password).toString(); } function decryptData(ciphertext: string, password: string): string { const bytes CryptoJS.AES.decrypt(ciphertext, password); return bytes.toString(CryptoJS.enc.Utf8); }5.2 自动同步机制通过Chrome.alarms实现定时备份chrome.alarms.create(autoSave, { periodInMinutes: 30 }); chrome.alarms.onAlarm.addListener(async (alarm) { if (alarm.name autoSave) { const tabs await getAllTabs(); await saveToGitee(tabs); } });5.3 跨设备同步方案在不同设备上安装插件时可以通过以下方式同步配置将Gitee仓库信息存储在chrome.storage.sync中使用相同的加密密码通过仓库的commit记录查看历史会话6. 调试与发布6.1 本地调试技巧在Chrome中加载未打包的扩展访问chrome://extensions开启开发者模式点击加载已解压的扩展程序注意每次修改代码后需要手动刷新扩展6.2 性能优化建议针对大量标签页的优化策略场景优化方案效果50标签页分批存储避免API限制频繁保存本地缓存差异减少网络请求历史记录分页加载提升响应速度6.3 发布到Chrome商店打包发布流程# 生成发布包 zip -r tabs-saver.zip dist/* icons/* manifest.json # 然后到Chrome开发者控制台提交7. 实际应用场景7.1 研究资料收集当进行专题研究时可以打开所有相关文献标签页保存为区块链研究-202308会话后续随时恢复完整研究环境7.2 工作流保存开发人员可以保存包含调试工具、文档、IDE的完整工作环境为不同项目创建独立会话一键切换工作上下文7.3 教学演示准备教师提前配置好课程相关的所有在线资源演示用的Web工具参考文档链接 在课堂上直接恢复完整环境

相关新闻