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