Skip to content

浏览器支持

WebExtend 旨在帮助你轻松构建跨浏览器扩展程序。本指南涵盖了你需要了解的有关浏览器兼容性、配置和开发工作流程的所有信息。

浏览器目标

WebExtend 支持以下浏览器扩展目标。

TargetDescriptionStatus
chrome-mv3Chrome Manifest V3默认、稳定
firefox-mv2Firefox Manifest V2对于 Firefox,推荐使用 MV2 版本
firefox-mv3Firefox Manifest V3实验性支持,不能用于 dev 环境中
safari-mv3Safari Manifest V3实验性支持
edge-mv3Edge Manifest V3稳定
opera-mv3Opera Manifest V3稳定

当构建目标为 chrome-mv3 时,对应的构建产物可以在 Chromium 系列的浏览器中使用(包括 Chrome、Edge、Brave、Opera 等)。

可以为 web-extend 的下列子命令传递 --target-t 标志来指定目标。

shell
web-extend dev -t firefox-mv2
web-extend build -t firefox-mv2
web-extend preview -t firefox-mv2
web-extend zip -t firefox-mv2

环境变量

Webextend 会在代码构建时注入一个环境变量 import.meta.env.WEB_EXTEND_TARGET,这有助于处理不同浏览器之间的特异性。

src/background.js
js
const target = import.meta.env.WEB_EXTEND_TARGET || "";

// Chrome-specific code
if (target.includes("chrome")) {
  chrome.sidePanel
    .setPanelBehavior({ openPanelOnActionClick: true })
    .catch((error) => console.error(error));
}

// Firefox-specific code
if (target.includes("firefox")) {
  browser.sidebarAction
    .setPanel({ url: "sidepanel.html" })
    .catch((error) => console.error(error));
}

浏览器兼容性

在开发跨浏览器扩展时,可能会遇到两类兼容性问题:

  1. maifest.json 配置项兼容
  2. 扩展 API 兼容

Manifest 配置

WebExtend 会基于文件系统和构建目标,自动解析和生成 manifest.json,因此无需额外处理不同浏览器之间 Manifest 配置的差异性。

此外,可以自定义 manifest 兼容性,示例如下:

web-extend.config.js
js
import { defineConfig } from "@rsbuild/core";

export default defineConfig({
  manifest: ({ target, mode }) => {
    return {
      // ...
    }
  }
});

参考文档:

Extension API

WebExtend 不会处理 Extension API,如果需要兼容多个浏览器,需要在源码中手动处理。

Extension API 文档:

适用于 Chromium

可以直接使用 chrome API。

ts
chrome.storage.local.set({ key: "value" });
chrome.runtime.sendMessage({ type: "message" });

推荐包: @types/chrome

适用于 Firefox

使用 webextension-polyfill 包:

js
import browser from "webextension-polyfill";

browser.storage.local.set({ key: "value" });
browser.runtime.sendMessage({ type: "message" });

推荐包:

浏览器运行

运行以下命令,WebExtend 将自动打开浏览器并运行扩展。如果目标为 firefox-mv2firefox-mv3,会打开 Firefox 浏览器,否则会打开 Chrome 浏览器。

shell
# developemnt
npx web-extend dev --open

# production
npx web-extend preview

上述能力基于 web-extrun 命令实现。如果需要自定义运行器的配置,可以在根目录下创建一个 web-ext.config.[m|c]js 文件。

典型案例

打开特定链接

在浏览器启动时,打开一个指定的链接。示例如下:

web-ext.config.js
js
import { defineWebExtConfig } from "web-extend";

export default defineWebExtConfig({
  run: {
    startUrl: "https://www.google.com",
  },
});

打开特定浏览器

设置一个 Chromium 或 Firefox 的可执行路径,来打开一个指定的浏览器。示例如下:

web-ext.config.js
js
import { defineWebExtConfig } from "web-extend";

export default defineWebExtConfig({
  run: {
    firefox: "/path/to/firefox",
    chromiumBinary: "/path/to/chrome",
  },
});

保存浏览器配置

web-ext 会在每次启动浏览器时创建一个新的临时的用户资料,可以指定一个路径。当下次再次打开浏览器时,将会使用之前保存的用户配置信息。

js
// web-ext.config.js
import { defineWebExtConfig } from "web-extend";

export default defineWebExtConfig({
  run: {
    args: ["--user-data-dir=path/to/profile"],
  },
});
js
// web-ext.config.js
import { resolve } from "node:path";
import { defineWebExtConfig } from "web-extend";

export default defineWebExtConfig({
  run: {
    chromiumProfile: resolve("/path/to/profile"),
    keepProfileChanges: true,
  },
});

基于 MIT 许可发布