Skip to content

WXT 模板

基于 WXT + Vue 3 + TypeScript 的现代化浏览器扩展开发模板,提供完整的开发工具链和最佳实践。

技术栈

  • WXT - 现代化的浏览器扩展开发框架
  • Vue 3 - 渐进式 JavaScript 框架
  • TypeScript - JavaScript 的超集,提供类型安全
  • Vite - 快速的构建工具
  • Tailwind CSS - 实用优先的 CSS 框架
  • Chrome Extension API - 浏览器扩展 API

快速开始

创建项目

bash
# 初始化项目
vup init my-project

# 进入项目目录
cd my-project

# 添加 WXT 应用
vup add my-extension
# 选择 WXT 模板

开发

bash
# 安装依赖
pnpm install

# Chrome 扩展开发
pnpm dev

# Firefox 扩展开发
pnpm dev:firefox

开发服务器将在 http://localhost:9306 启动

构建

bash
# Chrome 扩展构建
pnpm build

# Firefox 扩展构建
pnpm build:firefox

# 打包扩展
pnpm zip

项目结构

my-extension/
├── src/
│   ├── entrypoints/             # 扩展入口点
│   │   ├── background.ts        # 后台脚本
│   │   ├── content.ts           # 内容脚本
│   │   ├── newtab.html          # 新标签页
│   │   ├── newtab/              # 新标签页组件
│   │   │   ├── main.ts          # Vue 应用入口
│   │   │   └── App.vue          # 新标签页组件
│   │   ├── options.html         # 设置页面
│   │   ├── options/             # 设置页面组件
│   │   │   ├── main.ts          # Vue 应用入口
│   │   │   └── App.vue          # 设置页面组件
│   │   └── popup/               # 弹窗页面
│   │       ├── index.html       # 弹窗 HTML
│   │       ├── main.ts          # Vue 应用入口
│   │       ├── App.vue          # 弹窗组件
│   │       └── style.css        # 弹窗样式
│   ├── components/              # 共享组件
│   ├── composables/             # Vue 组合式函数
│   ├── assets/                  # 静态资源
│   └── manifest.ts              # 扩展清单配置
├── public/                      # 公共资源
│   └── icon/                    # 扩展图标
├── wxt.config.ts                # WXT 配置文件
├── package.json                 # 项目配置
└── tsconfig.json                # TypeScript 配置

核心特性

🎯 TypeScript 支持

完整的 TypeScript 支持,提供类型安全和智能提示:

typescript
// 组件中使用 TypeScript
<script setup lang="ts">
interface ExtensionSettings {
  theme: 'light' | 'dark';
  autoSave: boolean;
}

const settings = ref<ExtensionSettings>({
  theme: 'light',
  autoSave: true,
});
</script>

📱 多入口点支持

WXT 支持多种扩展入口点:

  • 弹窗页面 (popup) - 点击扩展图标显示
  • 新标签页 (newtab) - 替换浏览器新标签页
  • 设置页面 (options) - 扩展配置界面
  • 后台脚本 (background) - 扩展后台逻辑
  • 内容脚本 (content) - 页面注入脚本

🎨 现代化 UI

基于 Tailwind CSS 的现代化界面:

vue
<template>
  <div class="popup-container">
    <div class="success-section">
      <div class="success-visual">
        <img src="/wxt.svg" alt="WXT Logo" class="wxt-logo" />
        <img
          src="@_shared/assets/images/vup.svg"
          alt="VUP Logo"
          class="vup-logo"
        />
      </div>
    </div>
  </div>
</template>

<style scoped>
.popup-container {
  @apply w-96 min-h-96 bg-gradient-to-br from-blue-500 to-purple-600;
  @apply text-white p-5;
}

.wxt-logo,
.vup-logo {
  @apply w-12 h-12 drop-shadow-lg;
  @apply transition-transform duration-300 hover:scale-110;
}
</style>

🔧 扩展功能

丰富的扩展功能支持:

typescript
// 后台脚本
export default defineBackground(() => {
  console.log('Background script loaded');

  // 监听扩展安装
  chrome.runtime.onInstalled.addListener(() => {
    console.log('Extension installed');
  });
});

// 内容脚本
export default defineContentScript({
  matches: ['*://*.google.com/*'],
  main() {
    console.log('Content script loaded on Google');
  },
});

🏪 状态管理

使用 Vue 3 的响应式系统:

typescript
// 扩展设置管理
const useExtensionSettings = () => {
  const settings = ref({
    theme: 'light',
    autoSave: true,
  });

  const updateSettings = (newSettings: Partial<typeof settings.value>) => {
    settings.value = { ...settings.value, ...newSettings };
    chrome.storage.sync.set({ settings: settings.value });
  };

  return { settings, updateSettings };
};

开发工具

代码质量

  • ESLint - 代码质量检查
  • Prettier - 代码格式化
  • TypeScript - 类型检查

开发命令

bash
# 开发服务器
pnpm dev                    # Chrome 扩展开发
pnpm dev:firefox           # Firefox 扩展开发

# 构建
pnpm build                 # Chrome 扩展构建
pnpm build:firefox         # Firefox 扩展构建

# 打包
pnpm zip                   # Chrome 扩展打包
pnpm zip:firefox           # Firefox 扩展打包

# 代码质量
pnpm lint                  # 代码检查
pnpm lint:fix              # 自动修复问题
pnpm format                # 代码格式化

热重载

WXT 提供极速的热重载体验:

  • 修改 Vue 文件时自动刷新
  • 修改 TypeScript 文件时热更新
  • 保持扩展状态

扩展开发

弹窗页面

vue
<template>
  <div class="popup-container">
    <h1>{{ title }}</h1>
    <button @click="openNewTab" class="action-btn">打开新标签页</button>
  </div>
</template>

<script setup lang="ts">
const title = ref('VUP 1.5x 扩展');

const openNewTab = () => {
  chrome.tabs.create({ url: chrome.runtime.getURL('/newtab.html') });
};
</script>

新标签页

vue
<template>
  <div class="newtab-container">
    <div class="hero-section">
      <h1>VUP 1.5x</h1>
      <p>基于 WXT + Vue 3 的现代化浏览器扩展</p>
    </div>
  </div>
</template>

<script setup lang="ts">
// 新标签页逻辑
</script>

设置页面

vue
<template>
  <div class="options-container">
    <h1>扩展设置</h1>
    <form @submit.prevent="saveSettings">
      <label>
        <input v-model="settings.theme" type="radio" value="light" />
        浅色主题
      </label>
      <label>
        <input v-model="settings.theme" type="radio" value="dark" />
        深色主题
      </label>
      <button type="submit">保存设置</button>
    </form>
  </div>
</template>

<script setup lang="ts">
const settings = ref({
  theme: 'light',
});

const saveSettings = () => {
  chrome.storage.sync.set({ settings: settings.value });
};
</script>

内容脚本

typescript
export default defineContentScript({
  matches: ['*://*.google.com/*'],
  main() {
    // 在 Google 页面上注入内容
    const button = document.createElement('button');
    button.textContent = 'VUP 1.5x';
    button.onclick = () => {
      console.log('Button clicked!');
    };

    document.body.appendChild(button);
  },
});

配置管理

WXT 配置

typescript
// wxt.config.ts
import { defineConfig } from 'wxt';

export default defineConfig({
  srcDir: 'src',
  modules: ['@wxt-dev/module-vue'],
  dev: {
    server: {
      port: 9306,
      host: '0.0.0.0',
    },
  },
  vite: () => ({
    css: {
      postcss: path.resolve(__dirname, '../../postcss.config.js'),
      preprocessorOptions: {
        scss: {
          additionalData: `
            @import "tailwindcss/base";
            @import "tailwindcss/components";
            @import "tailwindcss/utilities";
          `,
        },
      },
    },
  }),
});

扩展清单

typescript
// src/manifest.ts
import { defineManifest } from '@wxt/sdk';

export default defineManifest({
  name: 'VUP 1.5x',
  description: '基于 WXT + Vue 3 的现代化浏览器扩展开发模板',
  version: '1.1.0',
  manifest_version: 3,
  icons: {
    16: '/icon/16.png',
    32: '/icon/32.png',
    48: '/icon/48.png',
    96: '/icon/96.png',
    128: '/icon/128.png',
  },
  action: {
    default_popup: '/popup.html',
    default_title: 'VUP 1.5x 扩展',
  },
  background: {
    service_worker: '/background.js',
  },
  content_scripts: [
    {
      matches: ['<all_urls>'],
      js: ['/content.js'],
    },
  ],
  options_page: '/options.html',
  chrome_url_overrides: {
    newtab: '/newtab.html',
  },
  permissions: ['storage', 'activeTab', 'tabs'],
  host_permissions: ['<all_urls>'],
});

最佳实践

扩展开发

  • 使用 TypeScript 提供类型安全
  • 合理使用 Chrome Extension API
  • 遵循浏览器扩展开发规范
  • 优化扩展性能

状态管理

  • 使用 Chrome Storage API 持久化数据
  • 合理使用 Vue 3 响应式系统
  • 避免在内容脚本中存储大量数据

样式开发

  • 优先使用 Tailwind CSS 类
  • 考虑不同浏览器的兼容性
  • 使用扩展特定的样式作用域

性能优化

  • 合理使用内容脚本
  • 避免阻塞主线程
  • 优化扩展包大小

部署

开发测试

bash
# 构建扩展
pnpm build

# 在 Chrome 中加载扩展
# 1. 打开 chrome://extensions/
# 2. 开启"开发者模式"
# 3. 点击"加载已解压的扩展程序"
# 4. 选择 .output/chrome-mv3 目录

生产发布

bash
# 打包扩展
pnpm zip

# 上传到 Chrome Web Store 或 Firefox Add-ons

部署到 Vercel

WXT 应用可以部署到 Vercel。详细的部署配置和步骤请参考 Vercel 部署指南

相关资源