1. 引言Chrome 插件扩展程序是运行在 Chrome 浏览器中的小型软件程序能够扩展浏览器功能、提升工作效率甚至彻底改变网页的使用体验。比如很多人用过的Dark Reader可以一键把几乎所有网站变成暗黑模式保护眼睛、降低亮度、自定义对比度。它背后并没有什么黑魔法核心依然是 Manifest、内容脚本、后台服务和消息通信。本文将从零开始以“做一个迷你版 Dark Reader”为案例带你完整走一遍 Chrome 插件开发流程从项目结构、暗色注入、配置存储到消息通信和权限申请。2. 环境准备开发前准备Chrome 浏览器最新稳定版MV3Manifest V3支持最完整VS Code推荐装 JSON / JavaScript 高亮即可Node.js可选用 Vite、Webpack 或本地服务时才需要一个测试网站比如新闻站、文档站方便看暗色效果3. 认识插件核心文件一个基础 Chrome 插件通常包含manifest.json插件身份证声明名称、版本、权限、入口background.jsMV3 里是 Service Worker管全局事件content.js注入网页直接操作 DOM / CSSpopup.html点工具栏图标出现的设置面板styles/dark.css暗黑模式样式本例新增以 Dark Reader 类插件来说content script 负责“把页面变黑”popup 负责“开关和强度”background 负责“跨页面状态”。4. 编写第一个插件迷你暗黑模式项目目录mini-dark-reader/ ├── manifest.json ├── popup.html ├── popup.js ├── background.js ├── content.js └── dark.cssmanifest.json{ manifest_version: 3, name: Mini Dark Reader, version: 1.0.0, description: 网站启暗黑模式, action: { default_popup: popup.html, default_icon: { 16: icon16.png, 48: icon48.png } }, permissions: [activeTab, scripting, storage], host_permissions: [all_urls], background: { service_worker: background.js }, content_scripts: [ { matches: [all_urls], css: [dark.css], js: [content.js] } ] }dark.css核心暗色样式html { filter: invert(1) hue-rotate(180deg) !important; background: #000 !important; } img, video, canvas { filter: invert(1) hue-rotate(180deg) !important; }这正是 Dark Reader 最早期的思路之一用 CSSfilter反转颜色再把图片反回来。popup.html!DOCTYPE html html head meta charsetutf-8 / titleMini Dark Reader/title style body { width: 220px; font-family: sans-serif; padding: 12px; } button { width: 100%; margin-top: 8px; } /style /head body h3Mini Dark Reader/h3 label 暗黑模式 input idtoggle typecheckbox / /label button idincrease加深对比度/button button iddecrease降低对比度/button script srcpopup.js/script /body /html5. 加载与调试插件打开chrome://extensions打开「开发者模式」点「加载已解压的扩展程序」→ 选mini-dark-reader打开一个网页如知乎 / 文档站点工具栏图标 → 勾选开关调试方式弹窗右键弹窗 → 检查网页内注入F12 → Content scripts后台扩展页 → Service Worker 的 “Inspect views”6. 内容脚本实战真正的“开关控制”上面 CSS 是一直生效的不够像 Dark Reader。我们用content.js控制是否启用content.jsfunction enableDark() { document.documentElement.classList.add(mini-dark); } function disableDark() { document.documentElement.classList.remove(mini-dark); } chrome.storage.local.get([darkEnabled], (res) { if (res.darkEnabled) enableDark(); }); chrome.runtime.onMessage.addListener((msg, sender, sendResponse) { if (msg.type TOGGLE_DARK) { const on document.documentElement.classList.toggle(mini-dark); chrome.storage.local.set({ darkEnabled: on }); } });dark.css 改成作用域版本html.mini-dark { filter: invert(1) hue-rotate(180deg); background: #000; } html.mini-dark img, html.mini-dark video { filter: invert(1) hue-rotate(180deg); }这样才是“用户说了算”。7. 消息通信机制Popup 和网页不是同一个环境要通过后台或 runtime 通信。popup.jsdocument.getElementById(toggle).addEventListener(change, async (e) { const [tab] await chrome.tabs.query({ active: true, currentWindow: true }); chrome.tabs.sendMessage(tab.id, { type: TOGGLE_DARK }); }); document.getElementById(increase).addEventListener(click, () { document.documentElement.style.filter invert(1) hue-rotate(180deg) contrast(1.2); });background.js可做全局统计chrome.runtime.onMessage.addListener((msg, sender, sendResponse) { if (msg.type TOGGLE_DARK) { console.log(切换暗黑模式, sender.tab?.url); } });对应现实里的 Dark ReaderPopup用户开关Content script真正改页面Background记录状态 / 多标签同步8. 常用 API 与权限做“热门插件”通常会用到chrome.tabs获取当前页面、注入脚本chrome.storage保存用户配置暗色强度、白名单chrome.scripting动态注入 CSS / JSchrome.alarms定时同步配置chrome.declarativeNetRequest广告拦截类插件用本例权限permissions: [activeTab, scripting, storage], host_permissions: [all_urls]权限越少审核越快用户越敢装。9. 总结用一个“迷你版 Dark Reader”你就已经学到了Manifest V3 项目结构content script 改页面popup 做设置界面storage 存用户状态runtime / tabs 消息通信很多“很火”的 Chrome 插件起点都是一个能解决自己痛点的小功能
企业数字化 ERP 产品动态
相关推荐
Sublime Text 快捷键备忘清单:从入门到高效编码的完整速查指南 文档知识库教程开发工具 【免费下载链接】reference 为开发人员分享快速参考备忘清单(速查表) 项目地址: https://gitcode.com/jaywcjlove/reference 点击查看 免费下载 Sublime Text 是一款面向代码与标记的复杂文本编辑器,其核心生产力来自一套高度可… · 2026/9/24 19:21:04
Spring Boot读取resource目录文件:六种方法与jar包部署避坑指南 先说我自己的经历。早些年做Spring Boot项目,本地IDE跑接口一切正常,一旦打成jar包部署到服务器,很多文件读取就奇迹般地失效了。排查了半天,发现不是路径敲错,而是对resource目录的理解有偏差。后来我把这个系列问题系… · 2026/9/24 19:20:57
Spring Boot 集成 MyBatis 核心配置与原理实战指南 说个实在的,现在 Java 后端面试和日常开发里,Spring MyBatis 基本就是标配组合。尤其 Spring Boot 出来以后,MyBatis 的集成难度被大幅降低,但很多人只是会“用”,一旦遇到缓存失效、分页慢、嵌套查询 N1、日志看不到… · 2026/9/24 19:20:57
2026等保测评全攻略:新规动向、整改实操与策略选择 我第一次独自扛等保测评的时候,对着测评机构发来的资料清单犯了两天愁。那时候以为等保就是把防火墙、日志审计、堡垒机买齐再填一堆表格,结果真正开始整改才发现,最花时间的不是买设备,而是搞清楚每个检查项背后的意图。到2026年… · 2026/9/24 19:54:49
国产GitLab选型指南:Gitee、极狐GitLab与自建方案对比 这些年问我“有没有国产 GitLab”的人越来越多了,而且问法五花八门:有人是被网络卡到崩溃,有人是被版本和合规逼的,还有人是纯粹想搞清楚 Gitee 和极狐 GitLab 这俩到底有什么区别。说实话,这个问题放在两年前还没有标… · 2026/9/24 19:54:49
前端开发者必补的后端与部署Skill:选型逻辑与实操避坑指南 前端开发者写页面写到一定阶段,几乎都会撞上同一堵墙:接口联调时后端说“字段没问题”,部署上线时运维说“环境不对”,本地跑得好好的项目一上服务器就白屏。这时候你会发现,光会写组件和调样式已经不够用了࿰… · 2026/9/24 19:54:49
Hadoop与PySpark对比实战:从架构原理到选型落地 做大数据这行,绕不开的坎就是选框架。我刚入行那会儿,被“Hadoop VS PySpark”这个问题纠结了很久,网上资料各说各话,看得人头晕。后来自己把两者都真正用了一遍,从课程设计到生产环境都踩过坑,才慢慢理清楚… · 2026/9/24 19:54:49
多数据库结构分析工具开发实战:解析MySQL、PostgreSQL与SQLite元数据 上个月帮朋友迁移一个老项目,需要同时核对MySQL和PostgreSQL两套库的表结构。那体验就像一个人同时用两套方言的字典查单词:MySQL里翻information_schema还算顺手,换到PostgreSQL就得去pg_catalog里对着pg_attribute、pg_class拼查询… · 2026/9/24 19:54:49
Windows HID设备枚举实战:从SetupAPI到HID Class API完整解析 简介:本资源是一个基于Visual C开发的USB HID设备检测工具项目,面向Windows平台C开发者及嵌入式/驱动方向学习者,解决HID类外设(如键盘、鼠标、游戏手柄等)在PC端的自动识别与信息获取问题。项目完整封装了SetupAPI枚举… · 2026/9/24 19:54:41
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44