第一章:初识浏览器扩展,搭建你的“秘密基地”

第一章:初识浏览器扩展,搭建你的"秘密基地"

本章目标:成功创建并运行你的第一个"Hello, World"浏览器扩展。


你的浏览器,不止于"浏览"

嘿,朋友!欢迎来到我们的专栏。

在正式敲下第一行代码前,我想请你先闭上眼睛(好吧,别真的闭上,不然就没法看了),回想一下你每天是如何使用浏览器的。

你可能会打开它查资料、看视频、刷社交媒体,或者在某个在线文档上奋笔疾书。对大多数人来说,浏览器就是一个通往互联网世界的"窗口"。但你有没有想过,这个"窗口",其实可以被我们亲手改造成一扇"任意门",一个"万能工具箱",甚至是一个装备了各种黑科技的"未来驾驶舱"?

让这一切成为可能的,就是我们今天的主角------浏览器扩展(Browser Extension)

如果你觉得这个词听起来有点"技术宅",那换个说法:广告拦截插件、密码管理工具、网页翻译器、购物比价助手......这些你可能每天都在使用的"小玩意儿",本质上都是浏览器扩展。它们就像是给你的浏览器配备的"外挂装备",小到改变网页颜色,大到与复杂的服务器进行交互,无所不能。

正如我在开篇时提到的,我开发 Chat2File-deepseek 的初衷,仅仅是为了解决一个个人痛点。但当我看到一个小小的想法,最终变成了工具栏上一个可以点击的图标,并在我的工作流中真正发挥作用时,那种创造的快乐是难以言喻的。

这趟旅程,我不想让你只做个看客。我要带你成为一名**"浏览器世界的建筑师"。而今天,我们的任务,就是为我们未来的宏伟蓝图,打下第一块地基,搭建起一个最最基础的,但却至关重要的------"秘密基地"**。


1.1 什么是浏览器扩展?------ 城市里的"万能铺子"

让我们用一个生动的比喻来理解。

想象一下,你的浏览器(Chrome, Edge, Firefox等)是一座繁华的现代化大都市。城市里有各种各样的公共设施:道路(网络连接)、广场(搜索引擎)、商店(网站)、图书馆(维基百科)等等。你作为市民,可以自由地在城市里穿行、消费、学习。

那么,浏览器扩展是什么呢?

它们就是由像你我这样的开发者,在这座城市里开设的**"万能铺子""便民服务站"**。

  • AdBlock / uBlock Origin:这是城市入口处的"智能安保亭"。它会帮你识别并拦截那些烦人的广告传单和弹窗,让你的城市漫步之旅清爽无比。
  • Tampermonkey (油猴):这是一个神奇的"魔法工坊"。你可以在这里编写或安装各种"魔法卷轴"(用户脚本),对城市里的任何一座建筑(网站)进行"附魔"------比如给视频网站增加倍速播放按钮,或者给购物网站增加历史价格曲线。
  • Notion Web Clipper / 印象笔记·剪藏:这是一个"数字捕蝶网"。当你在城市里发现任何美丽的风景(有价值的文章、图片),轻轻一挥,就能将它完整、优雅地捕捉到你的私人收藏馆里。
  • Dark Reader:这是"夜猫子专用护目镜"。一键开启,整个城市的灯光都会变得柔和、护眼,让你在深夜"冲浪"时也能倍感舒适。

!一张包含上述几个扩展图标的拼图

看,这些"铺子"和"服务站"并没有改变城市本身(它们不会修改浏览器内核),但它们极大地丰富和改善了市民(我们)的生活体验。

从技术的角度讲,浏览器扩展其实就是一堆我们前端开发者再熟悉不过的文件:HTML、CSS 和 JavaScript 。只不过,浏览器赋予了它们一些"特权"------也就是一套特殊的 JavaScript API。通过这些 API,我们的代码就能"合法地"做到一些普通网页做不到的事情,比如:

  • 读取和修改你当前打开的所有标签页信息。
  • 在用户点击工具栏图标时,弹出一个自定义的小窗口。
  • 在特定网站上运行我们自己的脚本,修改页面内容。
  • 将数据安全地存储在浏览器本地。
  • 在后台持续监听某些事件(比如下载完成)。

所以,请放下你的敬畏之心。开发浏览器扩展,并不是什么需要学习屠龙之术的黑魔法。它更像是你已经掌握的十八般武艺(HTML/CSS/JS),终于找到了一个可以大展拳脚、创造无限可能的全新舞台。

准备好上台表演了吗?别急,我们先得去"市政厅"办一张"营业执照"。


1.2 扩展的核心:manifest.json ------ 你的"营业执照"与"身份证明"

在我们的"浏览器大都市"里,不是随随便便就能开店的。城市管理者(浏览器)需要确保每一家"铺子"都是安全、合规、身份明确的。

因此,每一个扩展都必须拥有一个核心文件,它的名字是 manifest.json

你可以把这个文件想象成你的扩展向浏览器提交的 "身份证明" + "营业执照申请表"。它是一个遵循特定格式的 JSON 文件,你在里面用声明式的语言,清清楚楚地告诉浏览器:

  • "我是谁?"(名字、版本、描述)
  • "我长什么样?"(图标)
  • "我想开一个什么样的店?"(是工具栏弹窗,还是后台服务?)
  • "我需要哪些营业许可?"(权限申请,比如是否需要读取标签页)
  • "我的店员(脚本)都在哪里?"(脚本文件的路径)

浏览器在加载你的扩展时,会做的第一件事就是阅读这份 manifest.json 文件。如果格式有误,或者申请了不被允许的权限,浏览器会直接拒绝加载,并在控制台里毫不留情地告诉你:"对不起,你的申请不合格!"

Manifest V3:更安全、更现代的规范

你可能在查阅资料时,看到过 Manifest V2 (MV2) 和 Manifest V3 (MV3) 的说法。简单来说,这是扩展规范的两个主要版本。MV3 是 Google 推出的新一代规范,它在安全性、性能和隐私保护上都做了重要的改进。

虽然目前 MV2 仍然存在,但 Chrome 网上应用店已经不再接受新的 MV2 扩展上架,并且正在逐步淘汰所有存量的 MV2 扩展。所以,我们这个专栏将完全基于现代的 Manifest V3 规范进行教学,让你从一开始就站在正确的、面向未来的起跑线上。

解剖 manifest.json 的核心字段

好了,理论说得够多了。让我们直接来看一张最最基础的"营业执照"长什么样。下面,我们将为我们的第一个"Hello, World"小铺子,起草一份申请。

json 复制代码
{
  "manifest_version": 3,
  "name": "我的第一个扩展",
  "version": "1.0.0",
  "description": "这是一个从零到一教程中诞生的神奇扩展!",
  "icons": {
    "16": "images/icon16.png",
    "48": "images/icon48.png",
    "128": "images/icon128.png"
  },
  "action": {
    "default_icon": "images/icon16.png",
    "default_title": "点击我!",
    "default_popup": "popup.html"
  }
}

别怕,我们像庖丁解牛一样,把它一块块拆开来看:

  1. "manifest_version": 3

    • 含义 :这是最重要的声明,没有之一!它像是在申请表的顶端加粗写着:"本人申请办理 V3 版本 营业执照"。浏览器一看到这个,就知道要用最新的 V3 规范来审核和运行你的扩展。这是必填项。
  2. "name": "我的第一个扩展"

    • 含义 :你的"铺子"叫什么名字。这个名字会显示在扩展管理页面、应用商店等地方。简单明了,必填项
  3. "version": "1.0.0"

    • 含义 :当前的版本号。这对于后续的更新迭代至关重要。我们通常遵循 语义化版本(Semantic Versioning)规范,即"主版本号.次版本号.修订号"(MAJOR.MINOR.PATCH)。
      • PATCH (修订号): 修复了一些 bug。
      • MINOR (次版本号): 增加了一些新功能,且向下兼容。
      • MAJOR (主版本号): 做了不向下兼容的重大改动。
    • 养成好习惯,从 1.0.0 开始。这是必填项
  4. "description": "这是一个..."

    • 含义:一句话简介。用简短的文字描述你的扩展是做什么的。它会显示在扩展管理页面的名称下方。
  5. "icons": { ... }

    • 含义 :你的"品牌 Logo"。这里定义了你的扩展在不同场景下显示的图标。
      • "16": 16x16 像素,通常显示在浏览器工具栏上(但 action.default_icon 的优先级更高)。
      • "48": 48x48 像素,显示在扩展管理页面 (chrome://extensions)。
      • "128": 128x128 像素,在安装和应用商店展示时使用。
    • 最佳实践:提供所有推荐尺寸的图标,会让你的扩展看起来更专业。这里的路径是相对于扩展根目录的。
  6. "action": { ... }

    • 含义 :这是 MV3 中一个非常核心的概念,它定义了用户与你的扩展进行主要交互的方式,通常是指用户点击浏览器工具栏上你的扩展图标时的行为。
    • "default_icon": 指定显示在工具栏上的图标。它会覆盖 icons 中定义的 16px 图标。
    • "default_title": 当用户的鼠标悬停在工具栏图标上时,显示的提示文字。
    • "default_popup": 关键中的关键! 这里指定了一个 HTML 文件。当用户点击图标时,浏览器会加载并弹出一个小窗口,窗口的内容就是这个 HTML 文件。这就是我们常说的 Popup 页面

呼------!恭喜你,你已经完成了最枯燥但也是最重要的一步:理论学习。你现在已经完全理解了这张"营业执照"的含义。

是时候卷起袖子,亲手把它"打印"出来了。


1.3 Hello, World! ------ 建造你的第一个"秘密基地"

理论说一千道一万,不如亲手敲一行。现在,我们将遵循最神圣的编程传统,创建我们的第一个"Hello, World"扩展。

第一步:创建项目文件夹(选址盖楼)

首先,在你的电脑上找一个你喜欢的地方(比如桌面,或者你的代码项目文件夹),创建一个新的文件夹。这个文件夹就是我们扩展的根目录,我们所有的代码和资源都将放在这里。

给它起个名字,比如 my-first-extension

swift 复制代码
// 你的电脑上的某个位置
my-first-extension

第二步:准备资源文件(准备建材)

我们的 manifest.json 里提到了 images 文件夹和几个图标文件。为了让我们的扩展看起来不那么"秃",我们先来准备一下。

my-first-extension 文件夹里,创建一个名为 images 的子文件夹。

perl 复制代码
my-first-extension
└── images

然后,你需要准备几张 .png 格式的图标。你可以自己用工具画,也可以从 icon-icons.comFlaticon 等网站上找一些免费的图标。重要的是,你需要把它们处理成三个尺寸:16x1648x48128x128 像素。

为了方便你快速开始,我这里提供一个简单的图标供你使用(你可以右键保存下图,或者直接用任何一张你喜欢的 16x16 的图片代替)。

!一张简单的16x16像素的笑脸或灯泡图标 (假设你保存为了 icon16.png)

现在,我们简化一下,只准备一个 icon16.png。为了让 manifest.json 能找到它,我们把它直接放在 images 文件夹里。在后续的章节中,我们再补全其他尺寸。

你的文件结构现在是:

markdown 复制代码
 my-first-extension
└── images
    └── icon16.png

(注意:为了让代码跑起来,manifest.json 中提到的其他图标 icon48.pngicon128.png 也要先放进去,哪怕只是复制 icon16.png 并重命名。否则浏览器加载时会报"找不到文件"的错误。)

第三步:撰写"营业执照" (manifest.json)

现在,在 my-first-extension 的根目录(与 images 文件夹同级)下,创建一个新的文本文件,命名为 manifest.json

用你喜欢的代码编辑器(如 VS Code)打开它,然后把我们刚才详细解读过的那段 JSON 代码一字不差地复制进去。

json 复制代码
// my-first-extension/manifest.json

{
  "manifest_version": 3,
  "name": "我的第一个扩展",
  "version": "1.0.0",
  "description": "这是一个从零到一教程中诞生的神奇扩展!",
  "icons": {
    "16": "images/icon16.png",
    "48": "images/icon48.png",
    "128": "images/icon128.png"
  },
  "action": {
    "default_icon": "images/icon16.png",
    "default_title": "点我,有惊喜!",
    "default_popup": "popup.html"
  }
}

千万注意 :JSON 格式非常严格,不能有任何多余的逗号(比如最后一个 } 前面不能有逗号),所有字符串必须用双引号 "" 包裹。

第四步:搭建"门面" (popup.html)

我们的"执照"上写了,当用户点击图标时,要展示一个叫 popup.html 的页面。现在我们就来创建它。

同样,在 my-first-extension 的根目录下,创建一个新的 HTML 文件,命名为 popup.html

打开它,写入最最基础的 HTML 代码:

html 复制代码
<!-- my-first-extension/popup.html -->

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>我的弹窗</title>
    <style>
        body {
            width: 200px;
            height: 100px;
            text-align: center;
            font-family: sans-serif;
        }
    </style>
</head>
<body>
    <h1>你好,扩展世界!</h1>
    <p>🎉</p>
</body>
</html>

这段代码非常简单:

  • 它创建了一个标准的 HTML5 页面。
  • <style> 标签里,我们给弹窗设置了一个固定的宽度和高度,并让内容居中,否则它会自适应内容大小,看起来很奇怪。
  • <body> 里,我们放了一个大标题 <h1> 和一个小小的庆祝 emoji。

至此,我们"秘密基地"的所有建筑材料和设计图纸都已经准备就绪!

最终的文件夹结构应该是这样的:

css 复制代码
my--first-extension/
├── images/
│   ├── icon16.png
│   ├──  icon48.png
│   └── icon128.png
├── manifest.json
└── popup.html

第五步:盛大开业!------ 在浏览器中加载你的扩展

激动人心的时刻到了!我们要亲手把这个扩展"安装"到浏览器里。这个过程,我们称之为**"加载已解压的扩展程序"**。

Google Chrome 为例 (Microsoft Edge 步骤几乎完全一样):

  1. 打开扩展管理页面

    • 在地址栏输入 chrome://extensions 并回车。
    • 或者,点击浏览器右上角的"三个点"菜单 -> "扩展" -> "管理扩展程序"。
  2. 打开"开发者模式"

    • 在这个页面的右上角 ,你会看到一个名为 "开发者模式" (Developer mode) 的开关。把它打开!
    • 打开后,你会发现页面上多出了一排按钮:"加载已解压的扩展程序"、"打包扩展程序"等。

!一张截图,高亮显示"开发者模式"的开关位置

  1. 加载你的"秘密基地"

    • 点击左上角的 "加载已解-压的扩展程序" (Load unpacked) 按钮。
    • 此时会弹出一个文件选择对话框。
    • 关键操作选择我们刚才创建的 my-first-extension 整个文件夹 ,然后点击"选择文件夹"或"确定"。不要选错了,是选择包含 manifest.json 的那个根文件夹
  2. 见证奇迹的时刻

    • 如果一切顺利,没有任何拼写错误或格式问题,你会在扩展管理页面上看到一个新的卡片,上面写着"我的第一个扩展",还有我们设置的版本号和描述。
    • 同时,请把目光移向你的浏览器工具栏 (地址栏右侧)。你会发现,那里多出了一个我们指定的 icon16.png 图标!

!一张截图,展示扩展已成功加载的卡片和工具栏上的新图标

  1. 最后的互动
    • 将鼠标悬停在那个新图标上,是不是看到了提示文字:"点我,有惊喜!"?
    • 现在,用力点击它
    • Booooom! 一个小小的窗口从图标下方弹出,上面赫然写着:"你好,扩展世界!🎉"

恭喜你!你,已经成功地创造并运行了你的第一个浏览器扩展!

你不再只是一个使用者,你已经迈出了成为创造者的第一步。感受一下这小小的、但却无比真实的成就感。


1.4 事后复盘:刚才究竟发生了什么?以及"踩坑"指南

在我们庆祝之前,让我们快速回顾一下这个魔法般的流程,并为你准备一份"新手踩坑应急指南"。

流程回顾

  1. 当你点击"加载已解压的扩展程序"并选择文件夹时,浏览器做的第一件事就是冲进这个文件夹,找到 manifest.json 文件。
  2. 浏览器像一位严格的考官,逐行阅读 manifest.json,检查语法,理解你的意图。
  3. 它读到 "action" 字段,知道了:"哦,这家伙想在工具栏上放个图标,点击图标还要弹出一个叫 popup.html 的窗口。"
  4. 于是,它在工具栏上为你预留了一个位置,放上了你指定的 action.default_icon
  5. 当你点击那个图标时,浏览器立刻执行 action 里定义的命令:加载 popup.html 文件,并将它的内容渲染在一个特殊的小窗口里展示给你。

整个过程,就像是上演了一出由 manifest.json 导演,浏览器负责执行的微型舞台剧。

新手踩坑应急指南

编程世界里,第一次就完美运行是小概率事件。如果你在加载时遇到了问题,别慌,99% 的新手都会遇到。来看看你踩了哪个坑:

  • 坑点一:加载后出现红色错误提示"清单文件无效" (Manifest is not valid)

    • 原因manifest.json 文件内容有误。
    • 排查
      1. JSON 格式错误 :检查是不是哪个地方多了或少了一个逗号 ,,是不是用了单引号 ' 而不是双引号 "。你可以把你的 JSON 内容复制到 JSONLint 这样的在线校验工具里检查一下。
      2. 必填字段缺失 :检查 manifest_version, name, version 这三个必填项是不是都写了。
      3. 拼写错误 :检查 "manifest_version" 是不是写成了 "manifest_version_" 之类的。
  • 坑点二:扩展加载成功了,但图标是个破碎的图片

    • 原因manifest.json 里指定的图标路径不正确。
    • 排查 :检查 iconsaction.default_icon 里的路径,例如 "images/icon16.png",是不是和你实际的文件结构完全一致。路径是大小写敏感的!
  • 坑点三:我修改了 popup.html 的内容,但点击图标弹出的还是旧的内容

    • 原因 :对于已解压的扩展,大多数文件(尤其是 manifest.json 和后台脚本)的修改,不会自动生效
    • 解决方法 :回到 chrome://extensions 页面,找到你的扩展卡片,点击那个圆形的刷新箭头按钮("更新")。这样浏览器就会重新加载你的所有文件。对于 Popup 页面和内容脚本的简单修改,有时关闭再打开 Popup 即可,但养成修改后点击刷新按钮的习惯是最好的。

!一张截图,高亮显示扩展卡片上的刷新按钮


本章总结与展望

好了,建筑师!今天,我们完成了三件了不起的大事:

  1. 认知破冰:我们彻底搞懂了浏览器扩展的本质,它不再是神秘的黑科技,而是我们前端技能的延伸。
  2. 理论奠基 :我们深入学习了扩展的灵魂------manifest.json 文件,掌握了 V3 规范下的核心字段。
  3. 实践落地:我们亲手搭建了项目结构,编写了代码,并成功在浏览器里运行了我们的第一个"Hello, World"扩展。

虽然它现在还很简单,只能弹出一个静态的窗口,但这个小小的"秘密基地",是我们未来所有宏大构想的起点。它证明了我们有能力将想法付诸实践。

请务必亲自完成本章的所有步骤,没有什么比亲眼看到自己的作品运行起来更具激励作用了。

在下一章,我们将为这个略显单调的"基地"添砖加瓦。我们将学习如何:

  • 用 CSS 美化我们的 Popup 界面。
  • 用 JavaScript 赋予它交互能力,让它能响应我们的点击。

我们将正式开始"智能标签页管家"的界面构建工作。

保持这份兴奋和好奇心,我们的旅程才刚刚开始。

我们下期再见!

相关推荐
yuanyxh7 小时前
Mac 软件推荐
前端·javascript·程序员
万少7 小时前
AtomCode开发微信小程序《谁去呀》 全流程
前端·javascript·后端
某人辛木8 小时前
Web自动化测试
前端·python·pycharm·pytest
Kagol8 小时前
Superpowers GSD gstack AgentSkills深度测评
前端·人工智能
excel9 小时前
JavaScript 字符串与模板字面量:从表象到本质理解
前端
京东云开发者9 小时前
当AI成为导演-如何用AI创作动漫短剧
前端
李白的天不白10 小时前
使用 SmartAdmin 进行前后端开发
java·前端
乘风gg10 小时前
🤡PUA AI Coding 工具 的 10 条终极语录
前端·ai编程·claude
学Linux的语莫10 小时前
Vue 3 入门教程
前端·javascript·vue.js
怕浪猫11 小时前
第一章、Chrome DevTools Protocol (CDP) 详解
前端·javascript·chrome