整体效果

流沙插件主题切换演示:https://live.csdn.net/v/228888

源码

https://github.com/kaimo313/quicksand

实现步骤

1、新建 manifest.json 文件

新建一个 chrome 文件夹,在文件夹里新建 manifest.json 文件,在文件里输入下面代码,给插件取名叫流沙,版本是 1.0。

{"name": "流沙","version": "1.0","manifest_version": 3
}

这里需要注意的是 manifest_version 必须是整数 2 或者 3,我们这里使用 3。

2023 年 1 月后 MV2 插件不能再继续更新,MV2 插件将不能在 Chrome 中运行;2023 年 6 月后 即使使用企业策略,MV2 扩展程序也不再在 Chrome 中运行。目前已经不能再发布 MV2 版本的插件,相比于 MV2,MV3 有诸多不同,例如权限控制,API 的变动,发起请求的方式等。

2、将插件添加到扩展程序中

打开 chrome 浏览器,输入 chrome://extensions/,点击加载已解压的扩展程序,选择刚刚新建的 chrome 文件夹即可。

选择好文件夹之后,流沙这个插件就被加载到浏览器中了。

3、配置 service-worker.js

background script 是扩展的事件处理程序;它包含对扩展很重要的浏览器事件的侦听器。它处于休眠状态,直到触发事件,然后执行指示的逻辑。有效的后台脚本仅在需要时加载,并在空闲时卸载。

先在 manifest.json 配置:

{"name": "流沙","version": "1.0","manifest_version": 3,"background": {"service_worker": "service-worker.js"}
}

manifest.json 同级新建 service-worker.js 文件,里面添加下面代码

console.log("流沙---> service-worker", chrome);chrome.action.onClicked.addListener(function () {console.log('点击了流沙插件图标');
});

然后我们刷新扩展程序页面,发现有个错误

错误如下:Uncaught TypeError: Cannot read properties of undefined (reading 'onClicked'),没有onClicked方法

chrome.action 文档:必须在 manifest 中声明才能使用此 api

在 manifest 中配置 action

{"name": "流沙","version": "1.0","manifest_version": 3,"background": {"service_worker": "service-worker.js"},"action": {}
}

刷新清除掉错误之后,点击 Service Worker,就可以看到打印的日志

点击右上角的流沙插件,就会打印日志出来。

如果没有这个图标的可以添加上来。

4、实现点击插件图标切换主题 icon

manifest.json 配置

{"name": "流沙","version": "1.0","manifest_version": 3,"description": "用于 CSDN 博客网站的暗黑和明亮主题切换","author": "kaimo","background": {"service_worker": "service-worker.js"},"icons": {"16": "icons/logo.png","48": "icons/logo.png", "128": "icons/logo.png"},"action": {"default_icon": {"32": "icons/popup_light_32.png"},"default_title": "流沙:明亮模式"}
}

service-worker.js 添加代码

console.log("流沙---> service-worker", chrome);let themeType = "light";chrome.action.onClicked.addListener(function () {console.log('点击了流沙插件图标');// 修改初始值themeType = themeType === "light" ? "dark" : "light";chrome.action.setIcon({path: "icons/popup_" + themeType + "_32.png"});chrome.action.setTitle({title: themeType === "light" ? "流沙:明亮模式" : "流沙:暗黑模式"});
});

添加 icons 文件夹跟图片

效果如下:

流沙:明亮模式

点击切换到流沙:暗黑模式

5、让 CSDN 的网页加载插件

先匹配 csdn 网站,在 manifest.json 里添加 content_scripts 的配置

"content_scripts": [{"matches": ["https://*.blog.csdn.net/*"],"js": ["content-script.js"]}
]

然后新建 content-script.js 文件,添加代码

alert("匹配到了 CSDN 博客网站")

测试效果,访问 csdn 博客网站的时候,就会弹出。其他网址就不会。

6、插件里实现样式主题的切换

我们发现 id 为 userSkin 的 dom 元素的类不同可以显示不同的主题的效果。

暗黑主题效果:skin-blackwhale user-skin-Black

明亮主题效果:skin-yellow user-skin-White

具体代码如下:

manifest.json 文件

{"name": "流沙","version": "1.0","manifest_version": 3,"description": "用于 CSDN 博客网站的暗黑和明亮主题切换","author": "kaimo","background": {"service_worker": "service-worker.js"},"icons": {"16": "icons/logo.png","48": "icons/logo.png", "128": "icons/logo.png"},"action": {"default_icon": {"32": "icons/popup_light_32.png"},"default_title": "流沙:明亮模式"},"content_scripts": [{"matches": ["https://*.blog.csdn.net/*"],"js": ["content-script.js"]}],"permissions": ["storage", "tabs"]
}

service-worker.js 文件

console.log("流沙---> service-worker", chrome);// 设置主题类型
function setThemeType(type) {chrome.storage.local.set({ theme: type }, () => {console.log('设置主题模式为:', type);});
}// 通过 tabs 发送消息改变主题类型
// tabs api,必须被注册在 manifest 的 permissions 字段中给插件使用,这里不然获取不到 url。
function changeThemeByTabs(themeType){chrome.tabs.query({}, tabs => {console.log("获取 tabs", tabs);for (var i = 0; i < tabs.length; i++) {console.log(`tabs[${i}].url`, tabs[i].url);try {const location = new URL(tabs[i].url);const host = location.host;console.log(host, host.includes("blog.csdn.net"));if (host.includes("blog.csdn.net")) {console.log(tabs[i].id, tabs[i], themeType);// 向选项卡发送消息chrome.tabs.sendMessage(tabs[i].id, {theme: themeType}, response => {// 将打印出"接收到主题切换";console.log(response);});}}catch (e) {console.error("报错--->", e);}}});
}// 添加插件监听被安装事件
// 在 onInstalled 监听器内部,扩展使用 storage API 设置一个值。这将允许多个扩展组件访问该值并进行更新。
// 大部分 API,包括 storage api,必须被注册在 manifest 的 permissions 字段中给插件使用。
chrome.runtime.onInstalled.addListener(() => {console.log("插件已安装");// 设置主题类型setThemeType("light");
});// 添加图标点击事件监听
chrome.action.onClicked.addListener(() => {console.log('1、点击了流沙插件图标');// 获取主题类型chrome.storage.local.get(["theme"], res => {console.log("2、缓存的theme", res);let { theme } = res;// 修改初始值theme = theme === "light" ? "dark" : "light";console.log("3、切换 theme 为:", theme);// 设置图标chrome.action.setIcon({path: "icons/popup_" + theme + "_32.png"});// 设置titlechrome.action.setTitle({title: theme === "light" ? "流沙:明亮模式" : "流沙:暗黑模式"});// 设置主题类型setThemeType(theme);// 通过 tabs 发送消息改变主题类型changeThemeByTabs(theme);});
});

content-script.js 文件

console.log("流沙---> content-script", chrome);// 设置明亮主题
function setLightThemes() {document.getElementById("userSkin").className = "skin-yellow user-skin-White";
}// 设置暗黑主题
function setDarkThemes() {document.getElementById("userSkin").className = "skin-blackwhale user-skin-Black";
}// 切换主题
function switchThemes(type = "light") {if(type === "dark") {setDarkThemes();} else {setLightThemes();}
}// 初始化设置
chrome.storage.local.get(['theme'], res => {let { theme } = res;console.log("初始化设置 theme--->", theme);switchThemes(theme);
});// 监听消息
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {console.log("监听消息--->", request, sender, sendResponse);// 接收信息返回给发送方sendResponse("接收到主题切换");const { theme } = request;switchThemes(theme);
});

说明

目前这里只实现了博客首页的部分内容样式,感兴趣的可以自己研究完善。

另外就是打包扩展程序 crx 文件的生成。第一次可以不用选私有秘钥 .pem 文件。


浏览器会自动生成的

确定就会生成,不过这个 crx 不能直接放到扩展程序里使用。

该扩展程序未列在 Chrome 应用商店中,并可能是在您不知情的情况下添加的。

参考 manifest.json 所有配置项

官网中给出所有配置项:

  {// Required - 通俗易懂"manifest_version": 3,"name": "My Extension","version": "versionString",// 『重点』action配置项主要用于点击图标弹出框,对于弹出框接受的是html文件"action": {"default_title": "Click to view a popup","default_popup": "popup.html"}// 通俗易懂"default_locale": "en","description": "A plain text description","icons": {...},"author": ...,// 『重点』下面将出现的background.js 配置service work"background": {// Required"service_worker": "service-worker.js",},// 『重点』下面将出现content_script.js 应用于所有页面上下文的js"content_scripts": [{"matches": ["https://*.nytimes.com/*"],"css": ["my-styles.css"],"js": ["content-script.js"]}],// 使用/添加devtools中的功能"devtools_page": "devtools.html",/*** 三个permission* host_permissions - 允许使用扩展的域名* permissions - 包含已知字符串列表中的项目 【只需一次弹框要求允许】* optional_permissions - 与常规类似permissions,但由扩展的用户在运行时授予,而不是提前授予【安全】* 列出常见选项* {*       activeTab: 当扩展卡选项被改变需要重新获取新的权限*     tabs: 操作选项卡api(改变位置等)*        downloads: 访问chrome.downloads API 的权限 便于下载但还是会受到跨域影响*       history: history api权限*     storage: 访问localstorage/sessionStorage权限* }*/"host_permissions": ["http://*/*", "https://*/*"],"permissions": ["tabs"],"optional_permissions": ["downloads"],// 内部弹出可选页面 - 见fehelper操作页"options_page": "options.html","options_ui": {"chrome_style": true,"page": "options.html"},
}

参考资料

  • 这个前端的小众市场蕴含着巨大财富
  • 最新版 V3 chrome 插件开发~ demo + 坑

怎么从零编写一个 v3 版本的 chrome 浏览器插件实现 CSDN 博客网站的暗黑和明亮主题切换?相关推荐

  1. 如何成功打造一个能够赚钱的个人博客网站?

    今天的天气格外开朗,心情也自然好了很多,所以一到公司做下来,充满了激情和斗志.工作要继续做,日记要坚持写.由于最近一段时间,笔者发现国内一下子出来了大批的博客网站,采用跟笔者个人网站相同的主题,有的只 ...

  2. 从零编写一个解析器(1)—— 解析数字

    文章名称:从零编写一个解析器(1)-- 解析数字 参考地址:https://github.com/Geal/nom/blob/master/doc/making_a_new_parser_from_s ...

  3. 如何从零搭建一个hexo博客网站02

    title: 如何从零搭建一个hexo博客网站02 categories: "Hexo教程" #文章分類目錄 可以省略 简介:此教程分为两部分,云服务器篇和本地pc机篇 tags: ...

  4. 如何从零搭建一个hexo博客网站01

    title: 如何从零搭建一个hexo博客网站01 #文章標題 categories: "Hexo教程" #文章分類目錄 可以省略 categories: "Hexo教程 ...

  5. 零成本系列丨盏茶的功夫,零成本搭建了一个自己的博客网站

    WIX,免费建站 技术基础:不需要. 需要用到的材料:一个邮箱,用于注册. 如果是做一个简单的博客网站,只需要点点点就可以. 复杂网站的话,创作过程类似于使用墨刀画原型图,也是不涉及编程的. 创建步骤 ...

  6. Docker学习总结(6)——通过 Docker 化一个博客网站来开启我们的 Docker 之旅

    2019独角兽企业重金招聘Python工程师标准>>> 通过 Docker 化一个博客网站来开启我们的 Docker 之旅 这篇文章包含 Docker 的基本概念,以及如何通过创建一 ...

  7. 如何搭建一个属于自己的博客网站?(小白教程)

    如何搭建一个属于自己的博客网站?(小白教程) 一.准备阶段 二.搭建阶段 1.服务器阶段 2.宝塔面板阶段 3.WordPress阶段 三.结尾语 欢迎大家访问我的个人博客:endeavorchuan ...

  8. 10分钟搭建一个免费个人博客网站

    一个程序员怎么能不拥有自己的博客,本文让10分钟快速搭建部署好自己的博客 准备工作 有Gitee账号 有安装git 会 markdown 编写文档 Node.js 版本 >= 8.6 博客采用V ...

  9. php 上传apk包到cdn_零基础搭建自己的博客网站和配置CDN设置wordpress篇

    零基础搭建自己的博客网站 博客类的建站程序有很多例如wordpress. typecho.zblog.emlog等等这几种是最常见的 平时我们用的见的更多的都是wordpress,因为wordpres ...

  10. 不花钱,用一个小时搭建自己的博客网站

    点击关注强哥,查看更多精彩文章呀 不知道大家平常有没有写博客的习惯,一般写博客都会记录什么?都会在哪里写自己的博客呢? 强哥平常就有写博客的习惯,不过没有强制自己多久写一篇,一般都是工作中遇到问题解决 ...

最新文章

  1. 【Ghost Blog】如何给Ghost Blog添加背景音乐
  2. 技术图文:如何爬取一个地区的气象数据(上)?
  3. echarts导入mysql数据库_Echarts最新:Django中从mysql数据库中获取数据传到echarts方式_爱安网 LoveAn.com...
  4. 监控操作系统和服务器,监控操作系统和服务器
  5. 十年web老兵整理的web前端文章
  6. 05 切片、迭代、列表生成
  7. linux的基础知识——模型结构和数据包的封装
  8. windows多用户 文件夹不共享_手把手教你如何使用Tekla多用户
  9. 你最隐秘的性格在哪?
  10. “几乎看不见”的铰链!可折叠iPhone要来了?
  11. linux打包java jar_在linux环境下修改可运行jar包配置并重新打包
  12. jsp页面中显示word/excel文档方法
  13. QT之交叉编译qmake的ARM版本套件(三)
  14. 解决yolo+cudnn+opencv+gpu的一些问题
  15. js获取(URL)地址栏参数
  16. 使用Python识别/提取PDF中的字符、文字
  17. 逻辑运算符在c语言里的作用,C语言逻辑运算符有哪些
  18. vue -【nextTick】-【过度与动画】-【插槽】-【配置代理服务器】-【vuex】-【路由】
  19. vue实践学习——keep-alive属性及生命周期
  20. word中,去表格格式,把表格转换为文本的方法

热门文章

  1. scrapy框架使用教程
  2. [XJTUSE编译原理] 第三章 上下文无关文法
  3. DCL文件里面的数据怎么给LSP,button控件
  4. 电脑W7系统怎样安装鸿蒙系统,家用电脑升级win7系统的操作方法
  5. 怎么升级计算机的操作系统,电脑如何升级系统版本_Windows10/7电脑升级系统版本的操作步骤...
  6. 系统集成项目管理工程师教程 第二版下载,仅供学习交流使用
  7. java gbk转机内码_\xd5\xd2\xb2\xbb\xb5\xbd\xd6 gbk内码转中文方法
  8. 虚幻引擎源码分析(3)
  9. linux系统怎么启动u盘启动盘,如何制作 linux 系统 U盘启动盘
  10. 【转】周鸿祎:网络业的柔道搏击术