news 2026/10/11 22:04:13

为什么Tab Out把Gmail、X、LinkedIn单独放进Homepages卡片?域名分组与优先级排序逻辑全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
为什么Tab Out把Gmail、X、LinkedIn单独放进Homepages卡片?域名分组与优先级排序逻辑全解析

【免费下载链接】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.

项目地址:https://gitcode.com/gh_mirrors/ta/tab-out
点击查看免费下载

Tab Out 是一款免费的 Chrome 标签页管理插件,它把新标签页变成一块"标签任务控制台":所有打开的标签自动按域名分组,而 Gmail、X、LinkedIn 等网站的首页则被单独收进一张Homepages 卡片,方便你一键清理。为什么偏偏是这几个网站?卡片顺序又是怎么排出来的?本文结合源码,完整解析 Tab Out 的域名分组与优先级排序逻辑,新手也能轻松看懂。

一、Tab Out 是什么:给"标签狂魔"准备的仪表盘 🧰

Tab Out 用一张干净的网格仪表盘替换你的新标签页:打开一个新标签,就能看到自己所有已打开的标签,按域名聚合成一张张"任务卡片"。

它的核心能力包括:

  • 按域名分组:一眼看清在哪些网站上"开了多少页"
  • Homepages 专属卡片:Gmail、X、YouTube、LinkedIn、GitHub 的首页被单独归入一张置顶卡片
  • 重复标签检测:同一页面开了两次会打上(2x)徽标,支持一键只保留一份
  • 稍后再看:关闭前把标签存进右侧清单,数据保存在本地
  • 100% 本地运行:没有服务器、没有账号、不向外发送任何数据

它通过 extension/manifest.json 中的newtab覆盖实现"打开新标签页 = 打开 Tab Out",整个仪表盘由 extension/app.js 驱动。功能全貌可参考 README.md。

二、基础层:标签是如何被按域名分组的

每个标签被归组时,Tab Out 先从 URL 中取出主机名(hostname),比如https://mail.google.com/...对应mail.google.com。

随后它会查一张"友好域名映射表",把冷冰冰的主机名翻译成人类能看懂的名字——mail.google.com显示为 Gmail、old.reddit.com显示为 Reddit。这张表定义在 extension/app.js 的FRIENDLY_DOMAINS中,覆盖了 X、YouTube、Stack Overflow、ChatGPT、Slack 等常见站点。

几个容易忽略的细节:

  • 本地开发页面:localhost标签会带上端口号显示,方便区分不同的 vibe coding 项目
  • 本地文件:file://开头的页面统一归入 "Local Files" 分组
  • 浏览器内部页面:chrome://、扩展页面、about:blank等会被直接过滤,不进入仪表盘

三、Homepages 卡片:为什么要把 Gmail、X、LinkedIn 单独拎出来?

这是整个设计里最关键的问题。

想象一下:你在 Gmail 里打开了 20 封邮件,又顺手开着 Gmail 主页。如果 Tab Out 只按域名分组,这 21 个标签会挤在同一张 Gmail 卡片里。当你想"清掉这个首页"时,按钮却叫"关闭全部 21 个标签"——误伤率极高。

Tab Out 的解法:把"首页/落地页"从内容页里抽出来,单独组成一张 Homepages 卡片。判断逻辑在 extension/app.js 的isLandingPage()函数中,它逐条比对一份LANDING_PAGE_PATTERNS规则表。

四、5 条默认判定规则逐条拆解

规则表定义在 extension/app.js,默认共 5 条:

网站匹配域名判定条件为什么这样判定
📧 Gmailmail.google.comURL 中不含#inbox/、#sent/、#search/只有"还没开始处理邮件"的 Gmail 主页才算首页;一旦进入收件箱、已发送或搜索结果,就是"正在干活"的内容页,留在 Gmail 域名组
🐦 Xx.com路径精确等于/home只把 X 的首页/home收进卡片,推文详情页和话题页仍留在 X 组
💼 LinkedInwww.linkedin.com路径精确等于/只认站点根路径,信息流文章、消息页不算首页
🐙 GitHubgithub.com路径精确等于/同上,仓库和 PR 页面留在 GitHub 组
▶️ YouTubewww.youtube.com路径精确等于/只收首页,正在看的视频页保留在 YouTube 组

匹配方式支持两种:精确主机名(hostname)和后缀匹配(hostnameEndsWith,用于通配子域名),再配合路径前缀(pathPrefix)、精确路径(pathExact)或自定义测试函数(test)——Gmail 那条用的就是自定义测试函数。

这套组合拳的意义是:把"你反复路过却从不真正停留"的首页页面聚到一处,让它们成为清理的首选目标。

五、优先级排序:卡片顺序是怎么排出来的?

分组完成后,卡片不是随便摆的。extension/app.js 中的排序函数实现了三级优先级:

  1. 第一级:Homepages 卡片永远置顶(内部标识为__landing-pages__)
  2. 第二级:出现落地页规则的"重点域名"排前——即 Gmail、X、LinkedIn、GitHub、YouTube 这些站的内容卡片紧随其后
  3. 第三级:按标签数量降序——开得最多的域名排最前,最直观地暴露"标签重灾区"

所以打开新标签页时,你最先看到的永远是:Homepages → 重点网站 → 剩余网站按标签数递减。清理节奏从最安全的"首页"开始,一路清到数量最多的域名,非常顺手。

六、一个关键细节:关闭 Homepages 卡片为何不会误伤邮件 ⚠️

这里有个容易被忽略但至关重要的设计。

普通域名卡片点"Close all"时,走的是按主机名匹配关闭(closeTabsByUrls):只要主机名对得上就关,速度快且不怕卡片快照过期。

但 Homepages 卡片和自定义分组是跨域面的集合,主机名匹配会误杀,所以改走按完整 URL 精确匹配关闭(closeTabsExact),见 事件处理逻辑:

关闭 Homepages 卡片 = 只关这几个首页本身,绝不会把你正在读的 20 封 Gmail 邮件或 X 推文一起带走。

源码注释里写得很直白:closing "Gmail inbox" doesn't also close individual email threads。

七、进阶玩法:加入你自己的 Homepages 和分组规则 🎨

默认的 5 条规则只是起点。Tab Out 预留了本地个人配置文件config.local.js(该文件被 gitignore,不会进仓库),由 extension/index.html 在加载主逻辑前引入,文件不存在也完全没影响。

它支持两类扩展:

  • LOCAL_LANDING_PAGE_PATTERNS:把你自己高频首页(比如公司内网、某博客)追加进 Homepages 卡片,字段与内置规则一致
  • LOCAL_CUSTOM_GROUPS:自定义分组规则——合并子域名、按路径拆分等,命中的标签会归入你命名的独立卡片,并同样享受"精确 URL 关闭"保护(匹配逻辑见 extension/app.js)

示例(放在仓库根目录下的extension/config.local.js):

window.LOCAL_LANDING_PAGE_PATTERNS = [ { hostname: 'blog.example.com', pathExact: ['/'] } ];

八、小结

Tab Out 的 Homepages 卡片不是简单的"白名单",而是一套三层协作的机制:

层次机制价值
识别层LANDING_PAGE_PATTERNS逐条判定首页把"路过型"页面从"干活型"页面中分离
排序层三级优先级排序首页置顶、重点域名靠前、重灾区显眼
保护层精确 URL 关闭 vs 主机名关闭清理首页时零误伤

理解这套域名分组与优先级排序逻辑后,你会明白:为什么 Homepages 卡片永远是第一张、为什么 Gmail 进了收件箱就不再算首页、为什么关闭它永远安全。而借助config.local.js,这套逻辑还能按你的浏览习惯自由扩展,把 Tab Out 真正调教成自己的"标签任务控制台"。

【免费下载链接】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.

项目地址:https://gitcode.com/gh_mirrors/ta/tab-out
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/11 21:55:57

自我认识:从认知偏差到情绪日志,用复盘提升决策质量

1. 自我认识这事,为什么越想看清越看不清我做过几年成长辅导相关的工作,和不少人聊过类似的问题:自我认识、自我定位、我想成为什么样的人。说实话,聊了几百次之后我发现一个反直觉的现象——越是急着想"看清自己"的人&…

作者头像 李华
网站建设 2026/10/11 21:55:44

Go构建高可用微服务:并发模型与实战指南

前阵子一个朋友找我吐槽,说他们把系统拆成了十几个微服务,结果上线后性能比单体还差,一到活动大促就雪崩。我翻了半天他们的代码,发现最核心的问题不是框架不够先进,也不是机器不够多,而是整个团队还没想明…

作者头像 李华
网站建设 2026/10/11 21:55:10

使用SGLang实现DeepSeek离线大模型并行推理

一、开发目标使用离线模型进行应用开发的时候,绕不开的话题就是线程并发的问题。最基础最简单的场景:如何让模型在推理过程中能够实现并行推理的同时,降低单张显卡内存的占用量? 最直接的方案就是:数据并行张量并行。当…

作者头像 李华
网站建设 2026/10/11 21:53:58

Kafka实战从零入门:核心概念、环境搭建与代码示例

后台经常有人问我:Kafka 到底是个什么东西,为什么每个技术岗位的 JD 里都写着“熟悉 Kafka 优先”?尤其是刚转行或者还在校的同学,看了一堆概念还是不知道它解决什么问题、代码到底怎么写。这篇我就从零开始,用最直白的…

作者头像 李华