热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于javascript:使用Vite搭建Chrome插件项目

前言写了个vite插件,用于构建ChromeExtensionMV3我的项目。我的项目已放在github,详情请查看:vite-plugin-crx-mv3如果对您有帮忙,star反对一下,谢谢~性能Chro

前言

写了个vite插件,用于构建Chrome Extension MV3我的项目。我的项目已放在github,详情请查看: vite-plugin-crx-mv3

如果对您有帮忙,star反对一下,谢谢~

性能

  • Chrome扩大页面和注入脚本反对应用vue、react等等;
  • Content_scripts的css配置项反对.scss或.less文件;js配置项反对.js(x)或.ts(x)文件;
  • background.service_worker配置项反对.js或.ts文件;
  • 在开发环境,批改content_scripts和background.service_worker之后,content_scripts注入的页面和Chrome扩大程序会主动重载;

应用

装置

# pnpm
pnpm add vite-plugin-crx-mv3 -D
# npm
npm install vite-plugin-crx-mv3 -D
# yarn
yarn add vite-plugin-crx-mv3 -D

vite配置

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'  //如果是应用vue开发的,引入相干的插件
import crx from 'vite-plugin-crx-mv3'

export default defineConfig({
  plugins: [
    vue(),
    crx({
      manifest: './src/manifest.json'
    }),
  ],
})

demo:https://github.com/Jervis2049…

实现的整体思路

先回顾一下,一个根本的Chrome插件我的项目个别有哪些内容:

目录构造

├─assets        //动态资源目录,寄存icon,css等等
├─content.js    //content_scripts,注入到页面的脚本
├─background.js //service_worker, 这是个运行在后盾的脚本
├─popup.html    //popup弹框
├─menifest.json //清单文件

menifest.json

{
  "name": "chrome-extension-demo",
  "description": "A Chrome extension demo.",
  "version": "1.0.0",
  "icons": {
    "16": "assets/icons/icon16.png",
    "48": "assets/icons/icon48.png",
    "128": "assets/icons/icon128.png"
  },
  "action": {
    "default_title": "Hello World",
    "default_popup": "popup.html"
  },
  "content_scripts": [{
    "matches": [ "" ],
    "js": ["content.js"]
  }],
  "background": {
    "service_worker": "background.js"
  },
  "manifest_version": 3
}

这其中version, manifest_version,name为必填项。

好了,当初咱们都分明我的项目须要有什么了。这个vite插件就是以manifest.json作为一个入口文件,解析出外面的内容,比方service_workercontent_scriptspopup.html等等的门路。再通过这些失去的内容,利用构建工具打包出咱们想要的最终的文件。因而,配合上这个vite插件,本来只能配置原生js,css后缀的manifest.json反对了配置.ts(x)、.scss、.less这样格局的文件了,因为这些都会在插件外部作解析的。这样,content_scripts也实现了应用vue、react等等这样的技术栈开发了。

例如,配置了tsx文件:

...
"content_scripts": [{
    "matches": [""],
    "js": ["content.tsx"],
}]
 ...

打包后是这样。产生的css文件会主动写入到配置:

...
"content_scripts": [{
    "matches": [ "" ],
    "js": ["content.js"],
    "css": ["content.hashxxxx.css"],
}]
...

主动刷新性能

画了一个简略的流程图

先从开始的vite build --watch说起,为什么开发环境也要build呢?还是得解释一下,防止刚入门的小伙伴不了解。

开发步骤是这样的,首先关上chrome://extensions/, 右上角勾选“开发者模式”,而后点击“加载已解压的扩大程序”,加载我的项目。

然而,应用构建工具搭建的我的项目,都是初始文件,并没打包,这样是不能加载进去。平时咱们开发其它我的项目的时候,npm run dev运行后,并不会产生实体文件的,而是在内存里。所以在开发Chrome插件我的项目时就须要build,生成dist目录,再点击“加载已解压的扩大程序”加载这个dist目录。vite还提供了watch这个参数,批改文件后,会从新构建。如果你是用webpack搭建,达到雷同的成果,须要把devServer.writeToDisk设置为true,writeToDisk意为写入到磁盘。

到了这步,只管watch到文件批改,会从新打包。然而Chrome插件并不会感知到文件已发生变化。content_scripts和service_worker是不会自动更新的。通常都须要手动到后盾刷新一下。这很不不便,于是实现了批改文件,主动重载的性能。Chrome提供了chrome.runtime.reload办法,能够利用这个做文章。

首先咱们须要晓得,content_scripts、service_worker、popup这三者是能够相互通信的。插件利用了content_scripts和service_worker之间的消息传递,从而达到刷新的目标。

//content_scripts发送音讯
chrome.runtime.sendMessage({ msg: 'RELOAD' }, () => {
  window.location.reload() //service_worker回传音讯给content_scripts的回调
})
//service_worker接管音讯
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
  if (request.msg == 'RELOAD') {
    chrome.runtime.reload() //重载Chrome插件
    sendResponse() //回传音讯给content_scripts
  }
})

content_scripts是注入到页面的脚本,所以Chrome插件重载之后,才调window.location.reload()让页面刷新。

vite-plugin-crx-mv3插件,在开发环境会把上述代码别离写入到content-dev.js和background-dev.js(如果用户没配置service_worker才会生成backgound-dev.js。如果配了,就把chrome.runtime.onMessage.addListener那段代码,在transform钩子阶段插入到原有的background.js)。同时也会写入到manifest.json配置文件。

...
"content_scripts": [{
    "matches": [""], //设置为,这样所有页面都会加载到
    "js": ["content-dev.js"],
}]
"background": {
    "service_worker": "background-dev.js"
},
 ...

到这步曾经筹备得差不多了。咱们的最终目标是,批改文件后,从新打包产出新的文件,而后Chrome插件能够主动刷新。vite build --watch曾经实现一部分了。主动刷新的性能是应用websocket帮助实现的,批改文件每次从新打包后,发送socket音讯给客户端,客户端再接管音讯。在vite插件的writeBundle阶段操作(其实是rollup的钩子),在这阶段示意曾经构建实现,文件写入实现。

writeBundle(){
   //发送音讯给客户端(content-dev.js)
   //content-dev.js外面接管到音讯后,就走下面和service_worker通信的流程了。
}

写在最初

这个vite插件根本满足本人现阶段的开发需要,其实开发Chrome插件的教训并不是很多,可能有些场景还没笼罩,请多多包涵。如果应用过程有什么问题,能够告知我。创作不易,如果能帮到您,能够star反对一下~


推荐阅读
  • React 小白初入门
    推荐学习:React官方文档:https:react.docschina.orgReact菜鸟教程:https:www.runoob.c ... [详细]
  • ReactJSUIAnt设计空组件原文:https://w ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • loader资源模块加载器webpack资源模块加载webpack内部(内部loader)默认只会处理javascript文件,也就是说它会把打包过程中所有遇到的 ... [详细]
  • RN即ReactNative基于React框架针对移动端的跨平台框架,在学习RN前建议最好熟悉下html,css,js,当然如果比较急,那就直接上手吧,毕竟用学习前面基础的时间,R ... [详细]
  • 前言:原本纠结于Web模板,选了Handlebars。后来发现页面都是弱逻辑的,不支持复杂逻辑表达式。几乎要放弃之际,想起了Javascript中ev ... [详细]
  • 前言:原本纠结于Web 模板,选了Handlebars。后来发现页面都是弱逻辑的,不支持复杂逻辑表达式。几乎要放弃之际,想起了Javascript中eval函数。虽然eval函 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 程序员如何选择机械键盘轴体?红轴和茶轴对比
    本文介绍了程序员如何选择机械键盘轴体,特别是红轴和茶轴的对比。同时还介绍了U盘安装Linux镜像的步骤,以及在Linux系统中安装软件的命令行操作。此外,还介绍了nodejs和npm的安装方法,以及在VSCode中安装和配置常用插件的方法。最后,还介绍了如何在GitHub上配置SSH密钥和git的基本配置。 ... [详细]
  • GO语言 包 if..else.. for循环 switch 数组
    包1.什么是包1.新建一个文件夹,内部写很多go文件,但是包名必须一致,改文件夹就是一个包2.作用和优点包用于组织Go源代码,提供了更好的可重用性与可读性。由于包提供了代码的封装, ... [详细]
  • npminstall-Dbabelcorebabelpreset-envbabelplugin-transform-runtimebabelpolyfillbabel-loader ... [详细]
  • 先下载nodejs针对windows安装安装就行。自定义安装在对应的文件夹就行安装完之后需要在电脑的环境变量里面添加两个路径通过cmd可以查看自己node的版本号最后通过运行npm ... [详细]
  • Vue cli2.0 项目中使用Monaco Editor编辑器
    monaco-editor是微软出的一条开源web在线编辑器支持多种语言,代码高亮,代码提示等功能,与VisualStudioCode功能几乎相同。在项目中可能会用带代码编 ... [详细]
author-avatar
世卍界创意驿站肀
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有