如何使用具有多个页面和入口点的 React 和 TypeScript 设置 chrome 扩展?

How to set up a chrome extension using React and TypeScript with multiple pages and entry points?

有很多关于此主题的问题和教程,但其中 none 涵盖了 chrome 扩展的所有用例,因为其中大多数假设只有一个入口点。

先决条件如下:

多个"single page applications":

1) popup.html 用于扩展弹出页面

2) options.html 用于选项页面

3) custom.html 这是一个自定义 .html 文件,扩展可以引用 "locally"

这些文件中的每一个都是 React 操纵 DOM 的入口点,但它们的行为彼此独立。

非 React TypeScript 文件

它们不得与任何其他脚本捆绑在一起,并被编译成自己的 JavaScript 文件,例如编译成 background.jsbackground.ts(参考在 manifest.json).

我认为这对于 TypeScript、React 和 Webpack 是可行的,但我不确定如何处理。

我找到了一个解决方案,但它没有使用 create-react-appwebpack。看起来 parcel 无需任何配置即可开箱即用地支持多个入口点。

假设目录结构如下:

├── chrome
│   └── background.ts
├── html
│   ├── custom.html
│   ├── options.html
│   └── popup.html
├── manifest.json
├── package.json
├── react
│   ├── custom.tsx
│   ├── options.tsx
│   └── popup.tsx

使用 Parcel.js 你只需要做:

parcel build html/*.html react/*.tsx chrome/*.ts

并且它将处理多个入口点。我创建了一个包含该方法模板的 repository,它包含一个完全可运行的示例。

有一个完全符合您需求的自定义 CRA 模板:complex-browserext-typescript

用法:

npx create-react-app my-app --template complex-browserext-typescript

默认设置 4 个与 page-like 扩展组件关联的入口点:

  • popup (src/index.tsx) - 扩展的弹出页面,替换 默认索引入口点。
  • 选项 (src/options.tsx) - 扩展的选项页面。
  • 背景 (src/background.ts) - 背景脚本。
  • 内容 (src/content.ts) - 内容脚本。

但是,可以选择从编译中排除除弹出窗口之外的任何上述组件,以及添加额外的 HTML 页面。

有关用法示例,请参阅 this article