乐于分享
好东西不私藏

AI开发系列:开发一个功能完整的浏览器插件(第1篇)

AI开发系列:开发一个功能完整的浏览器插件(第1篇)

你有没有这样的经历在研究某个技术问题,开了20多个标签页,每个都觉得有用。不断切换跳转,突然浏览器崩溃了,标签页全没了。你盯着空荡荡的浏览器窗口,心里一万头草泥马奔腾而过。或者网上学习时,看到一篇关于 React 新特性的好文章,随手截了个图,心想”明天再仔细看”。过两天遇到一个问题,打开电脑,想找那篇文章——翻遍了微信传输助手、浏览器书签、桌面截图文件夹,就是找不到。最后只能凭着模糊的记忆继续胡乱搜索,结果搜出来一堆文章,哪篇是你看过的?不知道。

说了这么多,现在要开始装逼了。这就是我随手开发「时间轴随手记」的初衷,一直有这个想法,奈何能力时间有限。现在有了ai咔咔咔一顿输出,就诞生了我人生中第二个插件!作为一个重度信息收集者(说白了就是收藏不看),我深知碎片化信息管理的痛苦。市面上的方案要么太重(Notion、Obsidian),要么功能单一(单纯的书签管理器),要么需要联网同步(我不想把所有数据传到云端)。

在一个艳阳高照的下午我突然想:为什么不做一个浏览器插件呢?(AI来做)

  • 随手记录:看到什么直接截图记笔记,不用切换应用(随时访问来源)
  • 智能回顾:再次访问相关网页时,自动提醒你之前的记录。
  • 网页批注:随时批注重要内容。
  • 关联图谱:可视化你的知识网络,发现意想不到的联系。
   本地存储:数据存在本地,不用担心隐私泄露。
      。。。。。

说干AI就干。今天就介绍这个项目从0到1的开发历程,以及浏览器插件开发的那些事儿。(不足之处海涵)

想先体验一下成品? – 🔗 Edge 插件市场:(为什么没chrome,问就是穷。注册要5美元,关键要国外信用卡啊)

https://microsoftedge.microsoft.com/addons/detail/kbkmnnpkgcjkgoolgklolpeabndocnfd

二、项目介绍:时间轴随手记

2.1 这是个什么项目?

「时间轴随手记」(Timeline Quick Notes)是一个浏览器扩展,核心功能很简单:

  • 📸 智能截图:全屏或区域截图,支持画笔、箭头、文字、马赛克等编辑工具,一条记录最多支持10张图片
  • 📝 快速笔记:随时记录想法,支持 Markdown 和代码语法高亮
  • 📋 网页剪藏:保存选中内容或整页,离线也能查看
  • ⏰ 时间轴展示:按时间线组织所有记录,支持列表、网格、日历、图谱等多种视图
  • 🔍 智能回顾:再次访问相关网页时,自动提醒你之前的记录(支持 URL 精确匹配和域名匹配)
  • 🕸️ 关联图谱:基于标签、域名、手动关联自动计算关联强度,用 Cytoscape.js 可视化你的知识网络
  • ✏️ 沉浸式批注:在网页上直接批注,XPath 精准定位,下次访问自动高亮
  • 🎨 分享卡片:9种精美样式,支持二维码,一键生成高清分享图
  • 🐱 宠物助手:页面悬浮的可爱宠物(10种形象可选),环形菜单快捷入口,还会自己溜达(这是为了圈钱想的功能)

2.3 系列文章规划

这个项目涉及的技术点太多了,一篇文章肯定讲不完。所以我打算写一个系列,分以下几篇来讲(想到哪写到哪):

  1. 第一篇(本篇):项目起源、技术选型、整体架构
  2. 第二篇:核心功能实现(上)- 截图、存储、消息传递
  3. 第三篇:核心功能实现(下)- 智能回顾、关联图谱
  4. 第四篇:差异化功能 – 可爱的宠物助手(动画系统、自主行为、性能优化
  5. 第五篇:测试驱动开发 – 单元测试、属性测试
  6. 第六篇:踩坑与爬坑 – 数据迁移、跨浏览器兼容、内存管理

每篇文章都会有真实的代码示例、架构图、流程图,以及我踩过的坑。希望能帮自己少走弯路。

三、技术选型:选择比努力更重要

技术选型这事儿,说实话挺纠结的。选对了事半功倍,选错了就是给自己挖坑。我在项目初期花了整整一会会做调研和对比,最后确定了这套技术栈。(AI推荐)

3.1 原生 JavaScript vs 框架(React/Vue)

这是第一个要做的决定。很多人可能会说:“都2030年了,还用原生 JS?”我的考虑是这样的:(后面两个不会)

为什么不用框架?(下面凑字数,纯属自己不会框架,怕AI搞出来看不懂

  1. 包体积:React + ReactDOM 压缩后也要 130KB+,Vue 3 也要 80KB+。对于浏览器插件来说,这个体积不算小。用户每次打开 Popup 都要加载这些代码。
  2. 性能开销:虚拟 DOM、响应式系统都有运行时开销。对于插件这种需要快速响应的场景,原生 JS 的性能更好。
  3. 学习曲线:只需要会 JavaScript 就行,不需要学 React Hooks 或 Vue Composition API。
  4. 构建复杂度:不用框架意味着不需要复杂的构建配置,一个简单的脚本就能搞定。(纯找借口….)

原生 JS 的优势:

  • 零依赖,包体积小(整个插件压缩后不到 1024KB,那是不可能的快3M多了)
  • 性能好,启动快
  • 代码直观,容易理解
  • 调试方便,不需要 Source Map

当然也有劣势:

  • 没有组件化,代码复用需要自己封装
  • 没有响应式,状态管理需要手动处理
  • DOM 操作比较繁琐

综上所述。对于这个项目来说,因为我不会框架所以我使用原生JS。

3.2 Manifest V3:拥抱新标准

Chrome 从 2023 年开始强制新插件使用 Manifest V3(MV3),V2 已经不再支持了。虽然 MV3 有些限制(比如不能用 eval(),Background Page 变成了 Service Worker),但它带来的好处也很明显:

MV3 的优势:

  1. 更好的性能:Service Worker 按需启动,不会一直占用内存
  2. 更强的安全性:更严格的 CSP 策略,减少 XSS 风险
  3. 未来趋势:所有浏览器都在往这个方向走

MV3 的挑战:

  1. Service Worker 限制:不能直接操作 DOM,不能使用 window 对象
  2. 生命周期管理:Service Worker 会被浏览器随时终止,需要处理好状态恢复
  3. 调试困难:Service Worker 的调试比 Background Page 麻烦一些

不过这些挑战都是可以克服的。而且拥抱新标准总是对的,反正不是我干活。

3.3 IndexedDB vs Chrome Storage

数据存储方案的选择也很关键。Chrome 提供了两种主要的存储方式:

特性

Chrome Storage

IndexedDB

存储容量

5MB(sync)/ 10MB(local)

无限制(受磁盘空间限制)

数据结构

简单的 Key-Value

支持复杂对象、索引、事务

查询能力

只能按 Key 查询

支持索引查询、范围查询

性能

读写快,但容量小

容量大,查询灵活

API 复杂度

简单(Promise-based)

复杂(基于事件的回调)

适用场景

配置、设置

大量数据、复杂查询

对于这个项目,我需要存储大量的截图、笔记、网页内容,Chrome Storage 的容量明显不够。而且我需要按时间、标签、域名等多个维度查询数据,IndexedDB 的索引功能正好满足需求。

最终方案: – IndexedDB:存储记录、标签、批注、关联等核心数据 – Chrome Storage:存储用户设置、高级功能配置。这样既能利用 IndexedDB 的大容量和查询能力,又能用 Chrome Storage 快速读取配置。

3.4 Cloudflare 技术栈:Workers + Pages

项目后期我加入了想想能不能圈点钱加入了高级功能,需要实现许可证验证。传统方案是搭建一个后端服务器,但我不想维护服务器(穷),也不想付高昂的服务器费用。

Cloudflare Workers 完美解决了这个问题(免费)

  • 无服务器:不需要管理服务器,代码部署到全球边缘节点。
  • 按需计费:免费额度每天 10 万次请求,对于个人项目完全够用
  • 全球 CDN:自动在全球 200+ 个城市部署,访问速度快(这个刷刷能用)
  • 简单易用:用 JavaScript 写 API,和前端代码无缝衔接

同时,项目官网使用 Cloudflare Pages (官网也可以白嫖了)部署:

  • 免费托管:静态网站免费托管,无限流量
  • 自动构建:Git 推送后自动构建部署

这套组合拳下来,我的后端成本几乎为零,而且性能还中。强烈推荐给个人开发者。给Cloudflare跪一个不亏是活菩萨(YYDS)。

3.5 技术栈总览

最终确定的技术栈:

前端运行时:原生 JavaScript (ES Module)、HTML、CSS      数据存储:IndexedDB + Chrome Storage      图谱可视化:Cytoscape.js      测试框架:Jest + fast-check      构建工具:Node.js 自定义脚本     云服务:Cloudflare Workers + Pages     插件标准:Manifest V3

这套技术栈用下来,我觉得还是挺满意的。性能好、成本低、维护简单(简单不麻烦是真的)。

四、架构设计:搭建稳固的地基

技术选型确定后,就该设计架构了。浏览器插件的架构和普通网页应用不太一样,需要理解它的运行机制。

4.1 浏览器插件的基本概念

让开我要开始装逼了,虽然我也是边做边学。如果你之前没开发过浏览器插件,可能会对这些概念有点懵。我用最简单的方式解释一下:

Background Service Worker(后台服务) – 插件的”大脑”,负责处理核心逻辑 – 在后台运行,不依赖任何页面 – 可以监听浏览器事件(标签页切换、右键菜单点击等) – MV3 中是 Service Worker,会被浏览器按需启动和终止。

Content Script(内容脚本) – 注入到网页中运行的脚本 – 可以访问和修改网页 DOM – 可以和 Background 通信 – 每个标签页都有独立的 Content Script 实例

Popup(弹出窗口) – 点击插件图标时弹出的小窗口 – 是一个独立的 HTML 页面 – 可以和 Background 通信 – 关闭后会被销毁,不保留状态

Options(设置页面) – 插件的设置页面 – 也是一个独立的 HTML 页面 – 通常用来配置插件的各种选项

独立页面(如 Timeline) – 完整的浏览器标签页 – 可以展示复杂的 UI – 适合需要大量空间的功能

4.2 整体架构图

来看看「时间轴随手记」的整体架构:

4.3 模块划分与职责

我把代码分成了几个清晰的层次:

1. 用户界面层 – popup: 快速操作入口(截图、笔记、剪藏) – timeline: 时间轴展示(列表、网格、日历、图谱视图) – options/: 设置页面(主题、快捷键、高级功能)

2. 内容脚本层 – content/content.js: 主入口,协调各个功能 – content/region-selector.js: 区域选择器 

– content/recall-bubble.js: 智能回顾气泡 – content/immersive-sidebar.js: 沉浸式批注侧边栏 

– content/pet-assistant/: 宠物助手(差异化功能,包含10个子模块)

3. 后台服务层 – background/background.js: 消息路由、事件监听、API 调用

4. 服务层(28个组件 + 20个服务模块) – services/storage.js: IndexedDB 封装 

– services/screenshot.js: 截图处理 

– services/export.js: 多格式导出 

– services/search.js: 搜索引擎 

– services/recall.js: 智能回顾逻辑 

– services/relation.js: 关联计算 

– services/premium.js: 高级功能管理 – … 还有很多

5. 组件层 – components/: 可复用的 UI 组件(28个) – 比如:timeline.js、record-card.js、graph-view.js、markdown-editor.js 等

4.4 数据流设计

来看一个典型的数据流:用户截图并保存

这个流程展示了各个模块之间的协作: 1. Content Script 负责 UI 交互。 2. Background 负责调用浏览器 API 。3. Storage Service 负责数据持久化 4. 消息传递串联整个流程。

4.5 目录结构

最后看看项目的目录结构:


timeline-notes/├── background/           # 后台服务 (1个文件)│   └── background.js├── components/           # UI组件 (28个文件)│   ├── timeline.js│   ├── record-card.js│   ├── graph-view.js│   ├── markdown-editor.js│   └── ...├── content/              # 内容脚本 (14个文件)│   ├── content.js│   ├── region-selector.js│   ├── recall-bubble.js│   ├── immersive-sidebar.js│   └── pet-assistant/    # 宠物助手 (10个文件) │       ├── pet-assistant.js│       ├── animation-controller.js│       ├── wander-controller.js│       ├── mood-manager.js│       └── ...├── services/             # 服务层 (20个文件)│   ├── storage.js│   ├── screenshot.js│   ├── export.js│   ├── search.js│   ├── recall.js│   ├── relation.js│   └── ...├── popup/                # 弹出窗口 (3个文件)│   ├── popup.html│   ├── popup.js│   └── popup.css├── timeline/             # 时间轴页面 (3个文件)│   ├── timeline.html│   ├── timeline.js│   └── timeline.css├── options/              # 设置页面 (3个文件)│   ├── options.html│   ├── options.js│   └── options.css├── locales/              # 国际化 (4个文件)│   ├── en.json│   ├── zh-CN.json│   ├── zh-TW.json│   └── ja.json├── styles/               # 样式文件 (7个文件)│   ├── common.css│   ├── themes.css│   └── ...├── tests/                # 测试文件 (29个文件)│   ├── storage.test.js│   ├── recall.property.test.js│   └── ...├── libs/                 # 第三方库│   ├── cytoscape.min.js│   └── ...├── website/              # 官网 (Cloudflare Pages)├── worker/               # Cloudflare Workers└── manifest.json         # 插件配置文件

  这个结构清晰地分离了各个模块的职责,便于维护和扩展。

4.6 差异化功能(圈钱功能):宠物助手

圈钱功能是,content/pet-assistant/ 这个模块是项目的差异化功能。它包含了10个子模块,实现了一个可爱的页面悬浮宠物:

  • 10种宠物形象(猫、狗、狐狸、熊猫等,1个免费 + 9个高级)
  • 环形菜单快捷入口
  • 自主溜达行为
  • 状态动画系统(待机、行走、开心、困倦等)
  • 需求系统(注意力、活动、休息)
  • 性格系统(5个维度影响行为)

这个功能在第四篇文章会详细讲解,包括动画系统的实现、性能优化等(纯纯的是因为找不到圈钱项)。

五、写在最后

这是系列的第一篇,主要讲了项目的起源、技术选型和整体架构。希望能让你对浏览器插件开发有个全局的认识。

下一篇我们会深入代码,看看那些核心功能是怎么一步步实现的: – 📸 截图功能:如何使用 chrome.tabs.captureVisibleTab API,如何处理区域选择和图片压缩 – 💾 数据存储:IndexedDB 的初始化、版本管理、数据迁移 – 📨 消息传递:Background 和 Content Script 如何通信,如何处理异步响应。

立即体验

想亲自试试「时间轴随手记」吗?(跪求体验,开发出来没人用啊)

  • 🔗 Edge 插件直达
    https://microsoftedge.microsoft.com/addons/detail/kbkmnnpkgcjkgoolgklolpeabndocnfd

项目后期会考虑开源,到时候会在公众号第一时间通知大家。

实践建议

如果你也想开发浏览器插件,这里有几个建议:

  1. 从小项目开始:不要一上来就想做个大而全的插件,从解决一个小问题开
  2. 先看官方文档:Chrome Extension 的官方文档写得很好,值得仔细读一遍(直接AI也行)
  3. 理解运行机制:搞清楚 Background、Content Script、Popup 的区别和通信方式。
  4. 重视架构设计:好的架构能让后期开发事半功倍。
  5. 考虑云服务:Cloudflare Workers/Pages 这类服务很适合个人开发者
本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » AI开发系列:开发一个功能完整的浏览器插件(第1篇)

评论 抢沙发

3 + 7 =
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
×
订阅图标按钮