WXT:下一代前端 Web 扩展框架强势来袭!

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!

1.什么是 WXT

WXT 是一个免费的开源框架,用于以传统、直观且安全的方式为所有浏览器构建 Web 扩展。WXT 基于 Nuxt,旨在通过 TypeScript、自动导入和完整的项目结构提供同样出色的 DX。

An open source tool that makes Chrome Extension development faster than ever .

WXT 具有以下特征:

  • 支持所有浏览器
  • ? 同时支持 MV2 和 MV3
  • ? 具有 HMR 和快速重新加载功能的开发模式,当更改无法热重新加载时,例如:内容脚本或后台脚本,它们会单独重新加载,以防止重新加载整个扩展并减慢开发周期。
  • 基于文件的入口点
  • 支持 TypeScript
  • 自动导入
  • 自动发布
  • 与前端框架无关:可与 Vue、React、Svelte 等配合使用
  • ? 快速启动一个新项目
  • 打包分析
  • ?? 下载并打包远程 URL 导入
  • 生产环境 Ready:生产版本针对商店审查进行了优化,在版本之间更改尽可能少的文件。此外,WXT 在使用打包器时完全支持 Firefox 的源代码要求,将自动创建并上传源代码的 ZIP 文件。

WXT 将开发者体验放在首位。通过提供压缩和发布工具、一流的开发模式、完整的项目结构等,简化了 chrome 扩展开发过程。 WXT 使得迭代速度更快,开发功能而不是构建脚本,并支持使用 JS 生态系统提供的一切。

目前 WXT 在 Github 通过 MIT 协议开源,有超过 1.6k 的 star,是一个值得关注的前端开源项目。

2.如何使用 WXT

2.1 WXT 基础使用

首先需要安装相应的依赖:

pnpx wxt@latest init <project-name>
// pnpm
npx wxt@latest init <project-name>
// npm

WXT 支持开发者选择 vanilla、Vue、React、Svelte、Solid 等诸多开发模板。所有模板默认为 TypeScript,开发者可以将文件扩展名重命名为 .js 以改用 JavaScript。

WXT 的行为可以通过 wxt.config.ts 文件进行配置。在此文件中,开发者可以添加 Vite 插件、更改项目的目录结构以及在 manifest.json 上设置字段。

import {defineConfig} from 'wxt';

export default defineConfig({
  // My WXT config
});

同时,WXT 允许开发者根据自己的喜好编辑多个目录:

  • root(默认:process.cwd())- WXT 项目的根目录
  • srcDir(默认:)- 所有源代码的位置
  • EntrypointsDir(默认值:/entrypoints)- 包含所有入口点的文件夹。
  • publicDir(默认:/public) - 包含公共资产的文件夹

比如,如果希望 src/ 目录包含所有源代码,并且希望重命名 entrypoints 为 entries,可以按照下面的方式进行配置:

// 目录结构
<rootDir>
├─ src/
│  └─ entries/
│     ├─ background.ts
│     └─ ...
└─ wxt.config.ts
// 文件配置
import {defineConfig} from 'wxt';
export default defineConfig({
  srcDir: 'src',
  entrypointsDir: 'entries',
});

在 WXT 开发浏览器扩展时,添加 Vue、React 或 Svelte 等框架非常简单。只需要在 wxt.config.ts 文件中,安装框架的 Vite 插件并将其添加到配置中即可。

// 支持 Vue
import {defineConfig} from 'wxt';
import vue from '@vitejs/plugin-vue';

export default defineConfig({
  vite: () => ({
    plugins: [vue()],
  }),
});

以下配置添加对 React 支持:

import {defineConfig} from 'wxt';
import react from '@vitejs/plugin-react';
// 添加 React 插件
export default defineConfig({
  vite: () => ({
    plugins: [react()],
  }),
});

以下配置添加对 Svelte 支持:

import {defineConfig} from 'wxt';
import {svelte} from '@sveltejs/vite-plugin-svelte';
// 添加 Svelte 插件
export default defineConfig({
  vite: () => ({
    plugins: [svelte()],
  }),
});

在内部,WXT 在单个构建期间多次运行 vite build。但是,WXT 无法在每个构建之间共享某些插件的相同实例,因此使用一个函数为每个构建返回每个插件的全新实例。

2.2 支持 Storage API

WXT 提供了一个简化的 API 来替换 browser.storage.* API,可以使用从 wxt/storage 自动导入的 storage 或手动导入:

import {storage} from 'wxt/storage';

所有存储键都必须以其存储区域为前缀,比如下面的代码:

// ? 抛出错误
await storage.getItem('installDate');

// ? This is good
await storage.getItem('local:installDate');

还可以使用 local:、session:、sync: 或 Managed:。 如果使用 TypeScript,则可以向大多数方法添加类型参数来指定键值的预期类型:

await storage.getItem<number>('local:installDate');
await storage.watch<number>(
  'local:installDate',
  (newInstallDate, oldInstallDate) => {
    // ...
  },
);
await storage.getMeta<{v: number}>('local:installDate');

2.3 支持远程代码

WXT 将自动下载并打包带有 url: 前缀的导入,因此扩展不依赖于远程代码,这是 Google 对 MV3 的要求。比如下面是使用 Google Analytics 代码示例:

// utils/google-analytics.ts
import 'url:https://www.googletagmanager.com/gtag/js?id=G-XXXXXX';
window.dataLayer = window.dataLayer || [];
// NOTE: 这一行和 google 的文档有差异
window.gtag = function () {
  dataLayer.push(arguments);
};
gtag('js', new Date());
gtag('config', 'G-XXXXXX');

然后可以将其导入 HTML 文件以启用 Google Analytics:

// popup/main.ts
import '~/utils/google-analytics';

gtag('event', 'event_name', {
  key: 'value',
});

更多关于 WXT 的用法可以参考文末资料,本文不再过多展开。

3.本文总结

本文主要和大家介绍 WXT, 其是一个免费的开源框架,用于以传统、直观且安全的方式为所有浏览器构建 Web 扩展。WXT 基于 Nuxt,旨在通过 TypeScript、自动导入和完整的项目结构提供同样出色的 DX。因为篇幅问题,关于 WXT 只是做了一个简短的介绍,但是文末的参考资料提供了大量优秀文档以供学习,如果有兴趣可以自行阅读。如果大家有什么疑问欢迎在评论区留言。

参考资料

https://github.com/wxt-dev/wxt

https://wxt.dev/

https://wxt.dev/guide/installation.html

https://wxt.dev/guide/storage.html

原文链接:,转发请注明来源!