写个自己的chrome插件

简介: 有没有好奇chrome[1]插件是用什么做的?像类似掘金插件又是怎么实现的,当我安装稀土掘金插件后,我的导航页都被改掉了,因此你也可以做一个类似的插件,来导航你公司的一些产品,方便快捷的实现你的内部导航

有没有好奇chrome[1]插件是用什么做的?像类似掘金插件又是怎么实现的,当我安装稀土掘金插件后,我的导航页都被改掉了,因此你也可以做一个类似的插件,来导航你公司的一些产品,方便快捷的实现你的内部导航


在开始本文之前,主要是从零认识一个chrome插件,主要会从以下几点去认识chrome插件


  • 核心配置manifest.json配置,必不可少的几个配置
  • popup为插件内容文件
  • backgroundcontent通信,popupcontent通信
  • chrome.runtime几个通信API


正文开始...


首先预知的几个文件


manifest.json,必须在插件根目录上新建一个这样的文件,我们从官网查看更多的manifest[2]信息

{
    // 必不可少
    "manifest_version": 3, // 扩展插件版本必须是2以上
    "name": "Maic_test_chrome", // 扩展名称
    "description": "lesson demo", // 扩展描述
    "version": "1.0",
    // 可选
    "action": {
        "default_popup": "popup/index.html", // 默认的页面
        "default_icon": "logo.png" // 浏览器扩展插件显示图标
    },
    // 在插件列表里显示不同尺寸的图标
    "icons": {
        "16": "images/icon-16.png",
        "32": "images/icon-32.png",
        "48": "images/icon-48.png",
        "128": "images/icon-128.png"
    }
}

a1dd5a5e7d9ba1620e846df74946ecbe.png


让当前网页加载一个脚本


content_scripts指定加载对应脚本js,css注意matches中匹配的是当前访问的url,当选择<all_urls>时,匹配任何url,必须要有matches[3]否则不会生效

 "content_scripts": [
        {
            "js": [
                "scripts/content.js"
            ],
            "matches": [
                "https://*.wmcweb.cn/*",
                "<all_urls>"
            ]
        }
    ]


background增强浏览器事件程序的js


{
 "background": {
        "service_worker": "background.js"
  }
}


background.jscontent.js通信


background.js在插件页面加载,background.js调用onMessage.addListener接收content.js发送过来的数据

function callback(info, curent, sendToContent) {
}
chrome.runtime.onMessage.addListener(callback)
// background.js 在插件页面加载
const user = {
    username: 'Maic'
};
// 调用onMessage.addListenter
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
    console.log('background.js', message, sender)
    // 2. A page requested user data, respond with a copy of `user`
    if (message === 'get-user-data') {
        sendResponse(user);
    }
});

content.js在你指定的匹配域名页面加载,与当前浏览器加载的页面同环境


content.jscontentbackground.js发送信息

chrome.runtime.sendMessage(info, callbackResponse)
// sendMessage content.js
chrome.runtime.sendMessage('get-user-data', (response) => {
    console.log('received user data', response);
});


popup.jscontent.js通信


popup页面需要查找当前激活的tabs

// popup.js
chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) {
        chrome.tabs.sendMessage(tabs[0].id, {}, function (response) {
            console.log(response, 'content.js回传过来的信息');
   });
});

content.js接收信息

function callback(request, sender, sendResponse) {}
chrome.runtime.onMessage.addListener(callback)

content.js详细代码参考以下

// content.js
console.log('loader-content')
// 1. content向service worker发送信息
chrome.runtime.sendMessage('get-user-data', (response) => {
    // 2,接受service worker回调过来的信息
    console.log('received service worker data', response);
});
const render = ({ style, title }) => {
    const boxDom = document.querySelector('.box');
    const contentDom = document.querySelector('.content');
    const resultDom = document.querySelector('.result');
    boxDom.style.width = style.width;
    boxDom.style.height = style.height;
    boxDom.style.backgroundColor = style.backgroundColor;
    contentDom.innerText = title;
    resultDom.innerText = JSON.stringify({ ...style, title }, null, 2)
}
// 接收popup.js发送过来的信息
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
    console.log('content', request, sender);
    const {
        inputColorValue,
        titleValue,
        widthValue,
        heightValue } = request;
    const style = {
        width: `${widthValue}px`,
        height: `${heightValue}px`,
        backgroundColor: inputColorValue
    }
    const receivePopupInfo = {
        style,
        title: titleValue
    }
    // 向popup.js回传信息
    sendResponse(receivePopupInfo)
    render(receivePopupInfo)
});

background.js参考如下

const user = {
    username: 'Web技术学苑'
};
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
    console.log('background.js', message, sender)
    if (message === 'get-user-data') {
        sendResponse(user);
    }
});

popup.js参考如下

const $ = id => document.getElementById(id);
function setBadge() {
    const inputColorValue = $('color-input').value;
    const titleValue = $('title-input').value;
    const widthValue = $('width-input').value;
    const heightValue = $('height-input').value;
    const info = {
        inputColorValue,
        titleValue,
        widthValue,
        heightValue
    }
    chrome.action.setBadgeText({ text: inputColorValue });
    // 扩展脚本向content发出信息
    chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) {
        console.log(tabs)
        chrome.tabs.sendMessage(tabs[0].id, info, function (response) {
            console.log(response, 'content.js回传过来的信息');
        });
    });
}
$('submit').addEventListener('click', setBadge);
['width', 'height'].forEach(dom => {
    const curent = $(`${dom}-input`);
    curent.addEventListener('change', (evt) => {
        $(`${dom}-result`).innerText = evt.target.value;
    })
});

我们再看下popup.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <link rel="stylesheet" href="popup.css" />
  </head>
  <body>
    <div id="app">
      <div>title: <input type="text" value="我是标题" id="title-input" /></div>
      <div>color:<input type="color" id="color-input" /></div>
      <div>
        width: <input type="range" value="30" id="width-input" max="1000" />
        <span id="width-result">30</span>
      </div>
      <div>
        height: <input type="range" value="30" id="height-input" max="1000" />
        <span id="height-result">30</span>
      </div>
      <button id="submit">确定</button>
    </div>
    <script src="./popup.js"></script>
  </body>
</html>

当你打开浏览chrome://extensions/然后添加插件04-demo

32522ca12e7efa8286d5a3a3efdf097f.png


在打开一个测试页面

750f671086f8648c371e18e09559cec3.png


我通过插件中的popup.jscontent.js通信,就可以修改我当前页面上的元素了


另外推荐一个chrome插件官方的例子chrome-extensions-samples[4],看完一些例子多插件哟更深刻的认识,在下一节里,我会利用chrome内置缓存能力做一些与我们实际业务相关的例子。


总结


  • 一个chrome插件基础文件manifest.json几个比较的参数,加载插件根目录必须要有个文件,且manifest_version2版本上
  • popup.jscontent.js交互,content.js是独立于插件外部脚本,当匹配对应网页时,可以利用content.js控制当前网页
  • background.js是运行插件增强js,我们可以在这background.js控制chrome插件,或者与popup.js的通信
  • chrome核心api,chrome.runtime.onMessagechrome.runtime.sendMessage,chrome.tab.query的使用
  • 本文示例code example[5]






相关文章
|
2月前
|
Web App开发 JSON JavaScript
vue学习:chrome 中 vuetools 开发插件 的下载、安装
这篇文章介绍了如何在Chrome浏览器中下载、安装并测试Vue.js开发插件——vue-devtools。
360 0
vue学习:chrome 中 vuetools 开发插件 的下载、安装
|
4月前
|
Web App开发 存储 前端开发
《Chrome谷歌插件Top10》开发最好用的谷歌插件
本文介绍了多个实用的浏览器插件及其安装方法。包括CSDN浏览器助手,提供高效开发工具;FeHelper,前端必备工具,支持格式化、压缩等功能;uBlock Origin,有效屏蔽广告和弹窗;PageLiner,网页标尺工具,便于前端设计;Fatkun,批量下载图片;Smallpdf,文件转换工具;Octotree,GitHub代码树插件;Awesome Screenshot,截图与录屏工具;ColorZilla,颜色拾取器;Dark Reader,暗黑模式阅读插件。安装方式有通过Chrome商店搜索或下载crx插件本地安装。
80 11
|
4月前
|
Web App开发 JSON 前端开发
30个Chrome 灵魂插件!
30个Chrome 灵魂插件!
|
4月前
|
Web App开发 前端开发 JavaScript
手摸手教你,从0到1开发一个Chrome浏览器插件
开发 Chrome 插件既有趣又具成就感。本教程将引导你从零开始,逐步创建一个简单的 Chrome 插件。首先了解 Chrome 插件是可增强浏览器功能的小程序。以一个基础示例开始,你将学习如何设置开发环境,包括安装 Chrome 和准备文本编辑器,并掌握 HTML、CSS 和 JavaScript 的基础知识。接着,我们将构建插件的基本结构,涉及 `manifest.json` 配置文件、`background.js` 后台脚本、`popup.html` 用户界面以及 `style.css` 样式表。
361 8
|
4月前
|
Web App开发
Chrome 护眼模式 - 黑暗模式 - 夜眼(Night Eye) 插件
Chrome 护眼模式 - 黑暗模式 - 夜眼(Night Eye) 插件
187 0
Chrome 护眼模式 - 黑暗模式 - 夜眼(Night Eye) 插件
|
5月前
|
Web App开发 JavaScript 前端开发
Chrome插件实现问题之最新的 Chrome 浏览器架构有什么新的改变吗
Chrome插件实现问题之最新的 Chrome 浏览器架构有什么新的改变吗
|
5月前
|
JavaScript 前端开发 Web App开发
Chrome插件实现问题之单进程浏览器的不稳定主要体现在什么地方
Chrome插件实现问题之单进程浏览器的不稳定主要体现在什么地方
|
5月前
|
Web App开发 数据可视化 前端开发
Chrome插件实现问题之content-scripts能访问哪些Chrome API
Chrome插件实现问题之content-scripts能访问哪些Chrome API
|
5月前
|
Web App开发 前端开发 JavaScript
Chrome插件实现问题之用户在浏览器中输入URL后,浏览器进程会进行什么操作
Chrome插件实现问题之用户在浏览器中输入URL后,浏览器进程会进行什么操作
|
5月前
|
Web App开发 JavaScript 前端开发
Chrome插件实现问题之在Manifest V2中,设置插件的图标要如何解决
Chrome插件实现问题之在Manifest V2中,设置插件的图标要如何解决