【免费下载链接】tab-out
Keep tabs on your tabs. Turn your "New tabs" page into a mission control, so you can close them easily. Built for people who open too many tabs and never close them.
Tab Out 是一款零服务器代码的 Chrome 标签页管理扩展:它把浏览器"新标签页"变成任务控制中心,按域名分组展示所有打开的标签,并可用一键批量关闭、收藏稍后处理。本文用一份完整清单,带你看懂它的 chrome.storage.local 本地优先存储架构,新手也能轻松理解。
一、为什么一行服务器代码都不用写?🤔
很多"稍后阅读"类产品都要搭后端(数据库、REST API、账号系统)。Tab Out 直接省掉了整个服务端,靠三个关键设计:
- 新标签页本身就是扩展页面。在 manifest.json 中通过
chrome_url_overrides.newtab把新标签页指向 index.html,页面天然拥有chrome.tabs和chrome.storage的全部权限,无需任何中间层。 - 打开的标签页是"活数据",永远实时查询。页面每次渲染都调用
chrome.tabs.query({})拉取当前标签(见 app.js),浏览器关闭就自然消失,根本不需要持久化。 - 唯一需要保存的数据只有一小份 JSON——"稍后处理"列表,正好塞进 Chrome 内置的本地存储
chrome.storage.local。
💡 一句话总结:实时状态问浏览器要,持久数据存本地。这就是本地优先(Local-first)的精髓。
二、本地优先架构完整清单:5 个文件各管什么
Tab Out 的整个扩展只有 5 个核心文件,全部在 extension/ 目录中:
| 文件 | 职责 | 涉及本地存储? |
|---|---|---|
| manifest.json | 声明 Manifest V3、权限、新标签页接管 | ⚙️ 仅声明storage权限 |
| index.html | 新标签页界面骨架(标签网格 + 稍后处理侧栏) | 否 |
| app.js | 面板"大脑":读标签、分组、读写本地存储、所有交互 | ✅ 核心 |
| background.js | 服务 Worker,只负责工具栏角标计数 | 否 |
| style.css | 全部样式 | 否 |
权限声明在 manifest.json:["tabs", "activeTab", "storage"]——第三个storage就是启用chrome.storage.local的钥匙。
三、chrome.storage.local 的 4 个核心操作清单
所有持久化逻辑都围绕deferred(稍后处理)这一个存储键,代码集中在 app.js 的 "Saved for Later" 区块:
1️⃣ 写入:saveTabForLater
app.js 中,点击书签图标时把标签对象 push 进deferred数组,再一次性set回存储。id 用时间戳生成,savedAt存 ISO 时间——没有任何网络请求。
2️⃣ 读取:getSavedTabs
app.js 读出deferred后做两次过滤:剔除dismissed的软删除项,再按completed拆成"进行中"和"已归档"两组,供侧栏分别渲染(渲染入口见 renderDeferredColumn)。
3️⃣ 勾选归档:checkOffSavedTab
app.js 把对应项的completed置为true并补上completedAt时间戳,条目随之移入可折叠的 Archive 归档区。
4️⃣ 软删除:dismissSavedTab
app.js 只把dismissed置为true。注意它选择标记删除而非物理删除,这是本地存储场景下最简单可靠的"可恢复"设计。
交互链路完整闭环:保存(defer-single-tab 处理)→ 关闭原标签 → 侧栏即时刷新,全程只走本地存储。
四、本地存的数据结构:一眼就能看懂
deferred键下是一个 JSON 数组,每个元素只有 6 个字段(定义见 app.js):
{ "id": "1712345678901", "url": "https://example.com", "title": "Example Page", "savedAt": "2026-04-04T10:00:00.000Z", "completed": false, "dismissed": false }没有外键、没有表结构、没有同步状态机——这正是选择chrome.storage.local而非数据库的原因:数据量小、读写是整体性的,键值存储就是最合适的轮子。
五、"后台"也在本地:角标只有 90 行
background.js 是唯一的后台脚本,唯一职责是维护工具栏角标(updateBadge):
- 🟢 绿标:1–10 个标签,一切尽在掌控
- 🟡 黄标:11–20 个,开始堆积
- 🔴 红标:21+ 个,该"大扫除"了
它监听标签的创建、关闭、更新事件(事件监听清单)即时刷新数字。同样是直接查chrome.tabs,零服务器依赖。
六、新手快速上手:3 步装好 Tab Out
- 拿到代码(仓库是只读的,建议克隆一份):
git clone https://gitcode.com/gh_mirrors/ta/tab-out - 加载扩展:打开
chrome://extensions→ 右上角开启"开发者模式" → 点"加载已解压的扩展程序" → 选中仓库里的extension/文件夹。 - 打开一个新标签页:看到 Tab Out 面板即安装完成,全程约 1 分钟,无 npm、无 Node.js、无配置。
可选进阶:在extension/下放一个config.local.js自定义"主页分组"规则(加载逻辑见 index.html),文件不存在时自动使用内置默认值。
七、本地优先带来的 4 个真实好处
- 隐私零妥协:所有数据不出本机,没有账号、没有云端备份、没有第三方埋点
- 离线全可用:断网时功能照常工作,因为根本不依赖网络
- 维护成本≈0:没有服务器要部署、没有 API 要兼容、没有数据库要备份
- 响应零延迟:读写都发生在浏览器进程内,保存标签即点即存
小结:Tab Out 证明了"零服务器代码"不是噱头——把"实时数据问浏览器、持久数据进chrome.storage.local"这条本地优先架构清单走通,一个隐私友好的标签页任务控制中心就成立了。🚀
【免费下载链接】tab-out
Keep tabs on your tabs. Turn your "New tabs" page into a mission control, so you can close them easily. Built for people who open too many tabs and never close them.
相关推荐
Tab Out的Save for Later功能深挖:先收藏再关闭,打造零服务器的本地阅读清单
Tab Out的Save for Later功能深挖:先收藏再关闭,打造零服务器的本地阅读清单 刷到好文章却没时间看,关了吧又怕丢、不关又占着标签栏?Tab O
Activepieces 流式文件写入架构:为什么所有流式写都必须经过应用服务(一条路径原则)
Activepieces 流式文件写入架构:为什么所有流式写都必须经过应用服务(一条路径原则) 导读 本文围绕 Activepieces 的一份已接受(acce
工作流自动化低代码AI 应用人工智能AI AgentMCP 服务后端前端Sequoia-X 高而窄旗形策略全解:4个硬性条件,如何自动筛出强势股的停顿窗口
Sequoia X 高而窄旗形策略全解:4个硬性条件,如何自动筛出强势股的停顿窗口 正常行情下,"先猛拉、再收敛"的股票一周只出现一两次,人肉盯盘很难抓到。开源
金融科技数据分析
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考