使用来自 Web 扩展的 content_scripts 的 ES 模块(附加组件)

Gin*_*pei 6 javascript firefox-addon google-chrome-extension

由于最新的 Firefox 支持没有标志的 ES 模块以及 Chrome,我想使用import/export作为我的网络扩展(附加组件)。只需使用<script type="module">.

你如何让模块在内容脚本中工作?

我尝试并看到以下内容:

(1)只写import在acript在声明content_scripts.jsmanifest.json

import Foo from './foo.js';
Run Code Online (Sandbox Code Playgroud)

(Chrome) 未捕获的语法错误:意外的标识符

Firefox 无法正常工作。

(2) 跑通 tabs.executeScript()

browser.tabs.executeScript(undefined, {
  file: "foo.js",
});
Run Code Online (Sandbox Code Playgroud)

(Chrome) 未捕获的语法错误:意外的标识符

(Firefox) 错误:导入声明只能出现在模块的顶层

(3) 插入一个用创建的脚本元素 type="module"

const el = document.createElement("script");
el.src = browser.extension.getURL("foo.js");
el.type = "module";
document.body.appendChild(el);
Run Code Online (Sandbox Code Playgroud)

(Chrome) Uncaught (in promise) ReferenceError: browser is not defined

(Firefox) ReferenceError: 浏览器未定义

你有什么其他想法吗?

icl*_*126 3

一种简单的解决方案是使用一些捆绑程序来捆绑您的内容脚本。
这听起来可能很复杂,但是使用像Rollup这样的捆绑器,您可以使用超级简单的“rollup.config.js”文件轻松完成此操作:

export default {
  input: 'content_script.js',
  output: {
    file: 'bundle_content_script.js',
    format: 'iife',
  },
};
Run Code Online (Sandbox Code Playgroud)

Rollup 只会用实际代码替换您的导入,因此没有样板并且代码仍然可读。

您可能还想阅读:

  1. 捆绑器比较:https://medium.com/@ajmeyghani/javascript-bundlers-a-comparison-e63f01f2a364

  2. 捆绑多个脚本:https://github.com/rollup/rollup/issues/703

使用捆绑器还会加快加载时间,对我来说它从 335 毫秒下降到 63 毫秒(但我现在有 100 多个模块)。