Vite项目构建chrome extension,实现多入口

本项目使用Vite5 + Vue3进行构建。

要使用vite工程构建浏览器插件,无非就是要实现popup页面和options页面。这就需要在项目中用到多入口打包(生成多个html文件)。

实现思路:

  1. 通过配置vite工程,使得项目打包后有两个html文件。
  2. 同时打包入口打包background.js。
  3. 在manifest.json文件中配置popup、options、background等内容。
  4. 将项目中的manifest.json文件打包至dist目录下。

第一步、创建Vue3项目并调整目录结构

复制代码
npm create vue@latest

通过此命令创建项目,创建后调整项目目录结构,由下图所示:

项目根目录的index.html打包后配置为popup,options.html配置为options。

将manifest.json放在src目录下,当然也可以放在public目录下(打包时vite自动将静态资源打包至dist目录下)。放在src目录下更符合个人的开发模式。

第二步、编写index.html和options.html

由于index.html打包后配置为popup页面,所以应该这样写:

javascript 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <link rel="icon" href="/favicon.ico">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Vite App</title>
  </head>
  <body>
    <div id="app"></div>
    <!--    引入popup的入口ts-->
    <script type="module" src="src/popup/main.ts"></script>
  </body>
</html>

同样options.html应引入src/options/main.ts

第三步、编写popup/main.ts和options/main.ts

两者的内容基本相同:

javascript 复制代码
import '../assets/main.css'

import { createApp } from 'vue'
import elementPlus from 'element-plus'
import 'element-plus/dist/index.css'
// popup页面引入Popup组件,options页面引入Options组件
import Popup from './Popup.vue'

const app = createApp(Popup)
app.use(elementPlus)
app.mount('#app')

第四步、编写vite配置文件

此文件主要实现两部分内容,其他实现读者可自行添加。

  1. 将src目录下的manifest.json打包构建时移到dist目录下。
  2. 配置多入口文件。
javascript 复制代码
import { fileURLToPath, URL } from 'node:url'

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { viteStaticCopy } from 'vite-plugin-static-copy'
import { resolve } from 'path'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
    vue(),
    viteStaticCopy({
      targets: [
          { src: 'src/*.json', dest: './' },
      ]
    })
  ],
  build: {
    rollupOptions: {
      input: {
        index: resolve(__dirname, 'index.html'),
        options: resolve(__dirname, 'options.html'),
        background: resolve(__dirname, 'src/background.ts'),
      },
      output: {
        entryFileNames: `[name].js`,
      }
    },
    outDir: 'dist',
  },
  resolve: {
    alias: {
      '@': fileURLToPath(new URL('./src', import.meta.url))
    }
  }
})

第五步、编写manifest.json文件

javascript 复制代码
{
  "name": "xxx",
  "version": "1.0",
  "description": "xxx",
  "homepage_url": "https://xxx.com",
  "manifest_version": 3,
  "icons": {
    "16": "logo.png",
    "48": "logo.png",
    "64": "logo.png",
    "128": "logo.png"
  },
  "commands": {
    "reload_extension": {
      "suggested_key": {
        "default": "Ctrl+Shift+K",
        "mac": "Command+Shift+K"
      },
      "global": true,
      "description": "Toggle My Extension"
    }
  },
  "action": {
    "default_icon": "logo.png",
    "default_popup": "index.html"
  },
  "options_page": "options.html",
  "background": {
    "service_worker": "background.js",
    "type": "module"
  },
  "permissions": [
    "management",
    "scripting",
    "notifications",
    "contextMenus",
    "webRequest",
    "storage",
    "tabs",
    "activeTab",
    "nativeMessaging"
  ]
}

通过以上的几个步骤,即可实现浏览器插件使用vue项目开发,同时支持popup页面和options页面,以及background.js。

相关推荐
paopaokaka_luck16 分钟前
非遗文物数字化系统(AI非遗问答、ONNX图像识别、协同过滤推荐、ECharts数据分析、非遗知识浏览与互动、文创商城订单闭环、文化活动报名签到、社区交流)
前端·javascript·vue.js·人工智能·数据分析·echarts
乘风gg20 分钟前
AI Coding 提效 2 倍是真的吗?到底怎么衡量效果
前端·ai编程·claude
用户9210802628621 分钟前
从对象到原型链:理解 this、构造函数和 new
前端
猫不易26 分钟前
Webpack 与 Vite:从 Loader / Plugin 到 Rolldown 统一引擎
前端·vite
YHL38 分钟前
🎯 Danci —— 用 AI 驱动开发一个全栈英语单词学习平台
前端·后端
平头哥~39 分钟前
Day 20 _ 3D 翻卡_perspective 写错人,卡片就穿帮
前端·3d·css3·学习资料
小聪7081 小时前
elpis-core 前端 Webpack 工程化实践
前端
2601_953988071 小时前
Ricon组态实时监控 - 毫秒级数据可视化
前端·物联网·数学建模·信息可视化·架构·前端框架
V158897262011 小时前
从滴滴模式看机器人租赁:撮合型租赁平台开发源码的调度系统设计思路
linux·前端·机器人
szarron1 小时前
国产手持式频谱分析仪选型攻略:TFN RC系列 vs HTOOL SA8T频谱分析仪 专业参数对比(军工/路测/调试全覆盖)
开发语言·前端·状态模式