Vite 中文文档 Vite 中文文档
指南
GitHub (opens new window)
指南
GitHub (opens new window)
  • vite

    • 指引
    • 为什么选 Vite
    • 开始
    • 功能
    • 命令行界面
    • 使用插件
    • 依赖预构建
    • 静态资源处理
    • 构建生产版本
    • 部署静态站点
    • 环境变量和模式
    • 服务端渲染
    • 后端集成
    • 与其他工具比较
    • 故障排除
    • 从 v3 迁移
  • API

  • 配置参考

  • vite

  • API

  • 配置参考

vite-chrome-extension


又快又爽的开发 Chrome 扩展程序

前言


当你去写一个没有框架来支持的浏览器插件 你是不是有以下这些烦恼:😤😤😤

❌代码臃肿

❌操作DOM

❌好看的样式

❌第三方库支持

❌维护成本

等等一些开发中,一点都不爽的体验方式让你“笨窥”。

关于 Chrome 扩展程序


Chrome 扩展程序本质上只是一组可以自定义 Google Chrome 浏览器体验的文件。Chrome 扩展程序有几种不同的类型;有些在满足某个特定条件时激活。 例如:当你来到商店的结账页面时;当你点击图标时弹出;当你每次打开新标签时都会出现。 查看更多

摘要


我们要把事情简单化,因此在本次文档中,我们将使用构建工具 Vite 来帮我去完成最终的输出格式,以及使用框架来帮我们去丰富具体实现内容。因此构建 Chrome 扩展程序的构建过程是我们去完成最终的目标,具体好玩的内容可以在基础之上任意发挥。

使用 Vite 来构建


使用 Vite 具体要做些什么

在开发 Chrome 扩展程序 使用构建工具的目的是为了将我们所需的格式进行一个输出。

1. 初始化仓库


本次介绍中,我们一贯使用了自己熟悉的 React + TypeScript 的来进行开发。

Let's go

  1. ``` shell
  2. npm init vite@latest

  3. cd vite-project
  4. npm install
  5. npm run dev
  6. ```

➜  npm init vite@latest

👌Project name: vite-project

👌Select a framework: › react

👌Select a variant: › react-ts

我们的目录已经生成好了

👇👇👇

  1. ``` sh
  2. '|-- vite-project',
  3. '    |-- .gitignore',
  4. '    |-- index.html',
  5. '    |-- package-lock.json',
  6. '    |-- package.json',
  7. '    |-- tsconfig.json',
  8. '    |-- vite.config.ts',
  9. '    |-- src',
  10. '        |-- App.css',
  11. '        |-- App.tsx',
  12. '        |-- favicon.svg',
  13. '        |-- index.css',
  14. '        |-- logo.svg',
  15. '        |-- main.tsx',
  16. '        |-- vite-env.d.ts',

  17. ```

2. 创建 manifest.json 文件


  1. ``` json
  2. {
  3.     "name": "Vite Chrome Extension",
  4.     "version": "1.0",
  5.     "manifest_version": 3,
  6.     "action": {
  7.         "default_icon": {
  8.             "16": "assets/icon16.png",
  9.             "48": "assets/icon48.png",
  10.             "128": "assets/icon128.png"
  11.         },
  12.         "default_title": "Popup",
  13.         "default_popup": "index.html"
  14.     }
  15. }
  16. ```

由此看出,在JSON 中,我们只是有一个默认的弹框和浏览器的图标的相对路径地址。 注:本次文档中使用了Chrome V3 版本

将文件放置 src/manifes.json 中,后面我们将使用 Copy 的方案进行输出。

3. 创建  background.js  和 contentScript.js 文件


background.js 它是整个 Chrome 扩展程序中的一个运行脚本,一般用作于全局的使用。

contentScript.js 它是运行在浏览器窗口,页面打开、刷新则会运行的脚本。

同样,在 src 目录中创建他们,后面我们将根据 Vite 选择 Entry 的方式进行输出。

最后再创建一个资源文件 assets

最终目录 👇👇👇

  1. ``` sh
  2. '|-- vite-project',
  3.   '    |-- .gitignore',
  4.   '    |-- index.html',
  5.   '    |-- package-lock.json',
  6.   '    |-- package.json',
  7.   '    |-- tsconfig.json',
  8.   '    |-- vite.config.ts',
  9.   '    |-- src',
  10.   '        |-- App.tsx',
  11.   '        |-- background.ts', 添加background.ts
  12.   '        |-- contentScript.ts', 添加contentScript.ts
  13.   '        |-- index.css',
  14.   '        |-- main.tsx',
  15.   '        |-- manifest.json', 添加manifest.json
  16.   '        |-- vite-env.d.ts',
  17.   '        |-- assets', // 资源文件

  18. ```

4. 安装相关依赖


  1. ``` shell
  2. npm install @types/chrome -D
  3. npm install @types/node -D
  4. npm install rollup-plugin-copy -D
  5. ```

5. 配置 tsconfig.ts


安装依赖中的chrome类型导入到开发中。

  1. ``` js
  2. {
  3.   "compilerOptions": {
  4.     "baseUrl": "./",
  5.     "target": "ESNext",
  6.     "useDefineForClassFields": true,
  7.     "lib": ["DOM", "DOM.Iterable", "ESNext"],
  8.     "allowJs": false,
  9.     "skipLibCheck": false,
  10.     "esModuleInterop": false,
  11.     "allowSyntheticDefaultImports": true,
  12.     "strict": true,
  13.     "forceConsistentCasingInFileNames": true,
  14.     "module": "ESNext",
  15.     "moduleResolution": "Node",
  16.     "resolveJsonModule": true,
  17.     "noEmit": true,
  18.     "paths": {
  19.       "@/*": ["src/*"],
  20.     },
  21.     "jsx": "react-jsx",
  22.     ������
  23.     "types": [
  24.       "@types/chrome",
  25.     ]
  26.   },
  27.   "include": ["./src"]
  28. }
  29. ```

6. 修改 vite.config.ts


主要是使用 Copy 和 Entry 的方式去进行输出到 dist 目录中。

  1. ``` js
  2. import { defineConfig } from "vite";
  3. import { resolve } from "path";
  4. import react from "@vitejs/plugin-react";
  5. import copy from "rollup-plugin-copy";

  6. // https://vitejs.dev/config/
  7. export default defineConfig({
  8.   resolve: {
  9.     alias: {
  10.       "@": resolve(__dirname, "src"),
  11.     },
  12.   },
  13.   plugins: [
  14.     react(),
  15.     copy({
  16.       targets: [
  17.         { src: "src/manifest.json", dest: "dist" },
  18.         { src: "src/assets", dest: "dist" },
  19.       ],
  20.       hook: "writeBundle",
  21.     }),
  22.   ],
  23.   build: {
  24.     rollupOptions: {
  25.       input: ["index.html", "src/background.ts", "src/contentScript.ts"],
  26.       output: {
  27.         chunkFileNames: "[name].[hash].js",
  28.         assetFileNames: "[name].[hash].[ext]",
  29.         entryFileNames: "[name].js",
  30.         dir: "dist",
  31.       }
  32.     },
  33.   },
  34. });
  35. ```

最后让我们去 build 它,如你所愿。

生成产物的目录结构👇👇👇

  1. ``` sh
  2.     |-- dist
  3.     |   |-- background.js
  4.     |   |-- contentScript.js
  5.     |   |-- index.458f9883.css
  6.     |   |-- index.html
  7.     |   |-- index.js
  8.     |   |-- manifest.json
  9.     |   |-- vendor.9eee4efe.js
  10.     |   |-- assets

  11. ```

开始优化页面


一个简单的插件框架已经做好了,接下来我们可以进行对于页面进行修改。 我们可以从库开始选择我们想完成的一款 Chrome 扩展程序,去安装一下吧。

安装你想要的第三方库


  1. ``` shell
  2. npm install antd
  3. npm install react-router-dom
  4. npm install less -D
  5. npm install vite-plugin-style-import -D
  6. ```

安装相关依赖后,我们可以开始建立路由,可以在页面中使用模块导入样式。

  1. ``` sh
  2. import styles from "./index.module.less";

  3. ```

按需加载样式


回到 vite.config.json 文件 plugins

  1. ``` js
  2. styleImport({
  3.   libs: [
  4.     {
  5.       libraryName: "antd",
  6.       esModule: true,
  7.       resolveStyle: (name) => `antd/es/${name}/style/css`,
  8.     },
  9.   ],
  10. }),
  11. ```

页面布局


写到这里就不去展示插件的布局了,我们可以像 web 应用一下简单,大家自由发挥,Chrome 扩展程序弹框的宽高可以设定 body 的宽高来完成。 在开发插件过程中,我们还可以启动 dev 服务来看你的整个试图,不妨试试 npm run dev 。

下面是一个已经完成好的 Chrome 扩展程序,里面的布局可以看出,可以把它做成一个 “插件集合”,我们可以将所有的插件分很多模块。 那这样运用在开发、调试、业务等场景中,那就很完美。

查看更多

开发过程中带来的体验


✅页面发挥丰富

✅代码优雅

✅模块开发

✅开发调试方便

✅插件互相集成

✅常规web应用开发

最后补充


本次介绍的目标是为了开发Chrome 扩展程序变得更爽,此外还有更多关于 Vite 构建的过程优化值得去研究,也可以写一写 Rollup Plugin 来支持最终的输出,在这里不多做介绍。

又快又爽,简单点😺😺😺

附:代码仓库示例
Last Updated: 2023-05-23 11:11:51