浏览器专题 · 图文教程

浏览器开发入门:扩展、UserScript、DevTools 与 Web API 总目录

浏览器开发总目录:先分清 UserScript、浏览器扩展、DevTools 与 Web API 四条路的边界,再讲开发环境隔离、最小工作流与外壳/内核/引擎的术语,最后给出四篇正文的阅读顺序。

浏览器开发 · 图文教程

这一块专讲「站在浏览器这一侧做东西」:给网页加自己的功能、给浏览器加常驻能力、把页面为什么不对查清楚、以及让站点调用系统级别的能力。它和服务端的框架、数据库、后端语言没有关系,只用到浏览器自己就提供的东西。

最后更新:2026-10-04 · 全篇 8 节 · 覆盖 4 篇正文与 12 篇站内深读页

一、先确认你要解决的是哪一类问题

这四种做法的名字经常被混着用,但它们的入口、能力边界和交付方式完全不同。先对号入座,能省掉后面一大半返工。

1.1 我想给某个网站加自己的功能,但不想动它的代码

这是 UserScript(用户脚本)的活。它是一段 JavaScript,加上一段元数据注释,由浏览器里的脚本管理器在打开匹配的网页时注入执行。改的是「你本机看到的页面」,网站服务器上什么都没有变,也不会影响别人的访问。适合:去掉某个网站的弹窗、给页面补一个按钮、批量导出列表、把外文站点的排版改顺眼。

1.2 我想要常驻的工具栏按钮、想拦截或改写网络请求

这是浏览器扩展(extension)的活。扩展有独立于网页的界面(工具栏图标、弹出面板、选项页、开发者工具面板),能申请比脚本更高的权限,也能在页面加载前就介入。当前的扩展平台是 Manifest V3:清单文件里写 "manifest_version": 3,后台从常驻页面改成了 Service Worker,网络请求的拦截也从阻塞式 webRequest 换成了声明式的规则接口。细节见 浏览器扩展开发入门。

1.3 页面效果不对,我要先查清楚原因

这是开发者工具(DevTools)的活,也是上面两件事的必备前置。它不需要你先写代码,只需要会看:DOM 树、控制台报错、网络请求、断点、性能录制。见 浏览器 DevTools 调试。

1.4 我想让网页用摄像头、剪贴板、离线缓存这类系统能力

这是 Web API 的活。浏览器把设备能力包装成 JavaScript 接口,网页调用前通常要经过一次用户授权,并且越来越多接口要求页面跑在 HTTPS 下(安全上下文)。哪些接口在哪些浏览器上可用,是这块最常踩的坑。见 Web API 与浏览器兼容性检测。

1.5 我要让老浏览器用户看到一个升级提示

这属于「兼容性检测」这一小类,做法有新旧两代:老办法读 navigator.userAgent 判断浏览器型号和版本,新办法不认浏览器、只认「这个能力在不在」。两代做法各有适用场景,也各有坑,一并写在 Web API 与浏览器兼容性检测 里。

1.6 我只想改改样式,不想写逻辑

改样式同样是 UserScript 的活:在元数据里声明目标站点,脚本里注入一段 CSS,或者直接改元素的类名。它和「写逻辑」的脚本没有区别,只是内容更短。判断标准只有一条:改动只发生在你这台机器上、只发生在你打开的那个页面里。

二、四种做法的能力边界对照

同一件事往往有多种做法。下表把四条路放在一起,按「能不能做」而不是「哪个更高级」来排。

表 1|四种做法能做什么、不能做什么
能力 UserScript 浏览器扩展 DevTools Web API(网页自己用)
改当前页面的 DOM 与样式 可以 可以(内容脚本) 可以,但只在你这台机器上临时生效 可以,但只能改自己的页面
加工具栏按钮 / 弹出面板 不能 可以 不能 不能
在页面脚本运行前介入 可以(把运行时机提前到文档开始阶段) 可以,且时机更可控 可以,用于观察 不适用
拦截或改写网络请求 有限(一般只能改自己发的请求) 可以,Manifest V3 用声明式规则 只能看和限速,不能长期改 可以,用 Service Worker 代理自己站点的请求
分发给别人用 发一个 .user.js 文件或链接 要打包、要过商店审核,或让别人手动加载 不适用 随网站一起发布
上架商店后自动更新 取决于脚本管理器 可以 不适用 不适用

2.1 最常见的选择错误:拿扩展做脚本的事

只为了改一个网站的一处显示,却去写一个完整扩展,代价是多出一套清单、图标、打包和审核流程。反过来,用脚本去做「常驻工具栏 + 跨站规则拦截」,能力又不够。判断口径很简单:有没有独立于网页的界面、要不要在页面之外常驻、要不要改请求——三个里有一个是「要」,就该用扩展。

2.2 权限是成本,不是功能

扩展在清单里申请的每一项权限,都会在安装时被列出来给用户看。host_permissions 里写得越宽(例如匹配所有站点),用户看到的提示越刺眼,被拒绝的概率也越高。先写最小范围,等确实需要再放宽——这一点在 Manifest V3 里尤其重要,因为主机权限已经和其它权限分成了两个字段。

2.3 别把「能跑」当成「能维护」

网页会改版。任何依赖具体 DOM 结构、具体类名或具体接口返回格式的脚本,都会在某次改版后失效。写的时候给关键选择器留一句注释、给失败分支留一条控制台输出,比追求一次写全更划算。

三、开发环境:先给自己一个可以弄坏的浏览器

这一节是给所有四条路通用的。开发期的扩展和脚本经常把浏览器搞到打不开页面,所以第一件事不是写代码,是隔离。

3.1 为什么不要在日常主配置上开发

日常主配置里有你的书签、密码、登录态和几十个扩展。一旦新扩展在启动阶段抛错,或者内容脚本把某个网站改坏,你分不清是「网站的问题」还是「自己的问题」。更麻烦的是排查过程中要反复开关扩展、清缓存、清站点数据,这些动作会直接作用在你的真实数据上。

3.2 三种隔离做法,按成本从低到高

第一种:同一个浏览器里新建一个用户配置(Chrome 叫「个人资料」,Firefox 叫「配置文件」),把开发期的扩展只装在这个配置里;第二种:用无痕/隐私窗口做临时验证,但要注意无痕窗口默认不加载扩展,各家策略不同;第三种:干脆用另一个浏览器或另一个浏览器版本专门做开发。三者的共同点是「主配置永远保持干净」。

3.3 弄坏了怎么一键回到干净状态

如果已经把主配置弄坏了,按这个顺序处理:先在扩展管理页把所有开发期扩展停用(不是卸载),再看页面是否恢复;仍然不正常,就用「无痕窗口打开同一页面」对比一次——无痕下正常、普通窗口不正常,基本可以确定是扩展或缓存的问题,而不是网站的问题。清缓存和清 Cookie 的具体入口见 怎么清理浏览器缓存 与 怎么清理 Cookie。

3.4 开发期要养成的两个小习惯

一是随时保留一个「能打开的普通网页」作为对照组,出问题时先对比;二是每次改动只改一件事,改完立刻刷新验证——浏览器开发没有编译期检查,靠的是小步快跑。

四、最小可用工作流

下面四条闭环都短,但顺序不能省。跳过最后一步自查,是绝大多数「在别人机器上不好使」的原因。

表 2|四条路各自的最小闭环
路线 第一步 第二步 第三步
UserScript 写元数据块,声明目标站点与运行时机 在脚本管理器里新建并保存,打开目标页验证 确认在页面刷新、跨页跳转、iframe 里的表现
扩展 写清单文件与最小脚本,加载已解压的扩展 打开扩展的后台调试页看报错 收紧权限、补图标与说明,再考虑打包
调试 先看控制台有没有报错,再看网络请求是否成功 在出问题的代码位置下断点,逐行看变量 用性能面板确认是不是卡在渲染或脚本上
Web API 先做能力检测,缺能力就走降级分支 确认页面处在安全上下文(HTTPS 或本机) 处理用户拒绝授权的分支,别只写成功路径

4.1 每一步都要有「我看到了什么」

新手最常见的卡点是「点了没反应」。把「没反应」拆成可观察的信号:请求发出去了吗(网络面板)、代码执行到了吗(断点)、变量是什么值(控制台)。三者中至少有一个会给你线索,剩下两个用来排除猜测。

4.2 用站内工具做两件杂事

开发过程里有两类小活不必装软件:一是格式化与校验 JSON,用 JSON 格式化工具;二是构造假数据联调,用 Mock 数据生成。这两件都在浏览器本机跑,内容不出本机。

4.3 上线前必查的四条

一、把权限收到最小;二、在所有分支上都打日志,但发布前把日志降到只在出错时输出;三、确认在无痕窗口和全新用户配置下也能跑;四、写一份「这个脚本/扩展在什么情况下会失效」的说明。第四条尤其重要,因为网页改版是必然事件,不是意外。

五、术语表:别把外壳、内核、引擎混着说

这块的名词混乱度很高,先把三层分清楚,再看代码就顺了。

5.1 四层结构

最外层是浏览器外壳(界面、书签、设置、账号同步);往里是内核(把 HTML、CSS、JavaScript 跑起来的那一整套实现);内核里通常再分成渲染引擎(负责排版和绘制)和 JavaScript 引擎(负责执行脚本)。「内核」是习惯叫法,它不是一个官方标准名词。内核是什么、为什么国内很多浏览器用的是同一套内核,见 浏览器内核是什么。

5.2 Chromium 系与非 Chromium 系,差别落在哪

差别首先落在扩展接口上:Chromium 系用 chrome.* 命名空间,Firefox 同时提供 browser.*(并支持 Promise 风格)。其次落在Web API 的覆盖速度上:新接口往往先在 Chromium 系出现,其它内核跟进有时间差。这就是为什么「能力检测」比「认浏览器名字」更可靠。

5.3 双核浏览器的那点事

国内不少浏览器标称「双核」,指的是内置两套内核,遇到老站点自动切到兼容内核。对开发者的影响是:同一台机器上可能出现两套渲染结果。写脚本时不要假设「只有一种内核」。相关选型见 双核浏览器怎么选。

六、这条线怎么往下走

6.1 四篇正文的阅读顺序

建议顺序:DevTools 调试 → UserScript 用户脚本 → 浏览器扩展开发 → Web API 与兼容性检测。先把「能看见」练熟,再学「能改动」;先做轻的(脚本),再做重的(扩展);最后回到网页自身,看它怎么用浏览器提供的能力。

6.2 配套的站内入口

已装扩展的排查与推荐看 Chrome 扩展管理与权限、扩展怎么挑;日常效率相关的看 开发者工具日常用法 与 浏览器快捷键大全;想知道自己当前这台机器的浏览器信息,用 浏览器信息检测 和 User-Agent 查询。

七、常见问题

UserScript 和浏览器扩展到底该选哪个?

看要不要「离开网页还存在」。只需要在特定网页里改点东西,选 UserScript;需要工具栏按钮、弹出面板、跨站规则、改网络请求,选扩展。扩展的能力更强,代价是要打包、要处理权限与更新。

学这块需要先会写后端吗?

不需要。这一块只用到 HTML、CSS、JavaScript 和浏览器自己的接口。只有当你需要把数据存到服务器、或者要调第三方接口时,才会碰到服务端的事情,而那部分和浏览器开发是两件事。

为什么我的脚本在控制台里能跑,装成脚本管理器里的脚本就不行?

最常见的两个原因:一是运行时机不对,页面元素还没生成脚本就执行完了,需要把运行时机往后放;二是脚本运行在隔离环境里,拿不到页面自身的变量。先在脚本里加一行输出确认它到底有没有被执行。

Manifest V3 之后,原来的扩展是不是都不能用了?

不是「都不能用」,而是「按旧清单写的扩展需要迁移」。主要改动集中在三处:清单版本号、后台页改成 Service Worker、网络请求拦截改成声明式规则。纯内容脚本类的扩展迁移量通常不大。

为什么开发时要专门开一个干净的用户配置?

为了把变量降到最少。主配置里有几十个扩展和大量缓存,出问题时无法判断是谁造成的。用一个干净配置,装上你自己的东西就能复现,问题范围一下就缩到最小。

在这块内容里,会不会碰到「改别人网站」的合规问题?

这一段只能给方向,不给法律结论。技术上的事实是:UserScript 和扩展都只在你自己这台机器上生效,不改变网站服务器上的内容,也不影响其他访问者;但如果你把它分发给别人、或者绕过网站本身的访问控制,性质就变了。涉及具体场景请自行确认适用条款。

手机上能做这些吗?

手机上装扩展和脚本的限制比桌面多,各家差别很大,具体支持情况以你手上那款浏览器的官方说明为准。桌面端是这套内容的主场,建议先在桌面上把流程走通。

这块内容和「浏览器怎么用」有什么区别?

「怎么用」讲的是设置、书签、快捷键、隐私选项;这块讲的是拿浏览器当运行环境来写东西。两者共用同一套基础知识,但目标不同:一个是用好它,一个是改造它。

八、接下来做什么

把本页转给朋友(短码 9za0jY,回流可归因)