在 Chrome 61 中,添加了对 JavaScript 模块的支持。现在我运行的是 Chrome 63。
我正在尝试在 Chrome 扩展内容脚本中使用 import
/export
语法来使用模块。
在manifest.json
中:
"content_scripts": [ { "js": [ "content.js" ], } ]
在my-script.js
中(与content.js
同一目录):
'use strict'; const injectFunction = () => window.alert('hello world'); export default injectFunction;
在content.js
中:
'use strict'; import injectFunction from './my-script.js'; injectFunction();
我收到此错误:未捕获的语法错误:意外的标识符
如果我将导入语法更改为 import {injectFunction} from './my-script.js';
我收到此错误: Uncaught SyntaxError: Unexpected token {
< /p>
在 Chrome 扩展中的 content.js
中使用此语法是否存在问题(因为在 HTML 中您必须使用
语法),还是我做错了什么? Google 忽略对扩展的支持似乎很奇怪。
使用动态
import()
函数。与使用
元素的不安全解决方法不同,此解决方法在相同的安全 JS 环境(内容脚本的隔离世界)中运行,您导入的模块仍然可以访问全局变量以及初始内容脚本的函数,包括内置的
chrome
API,例如chrome.runtime.sendMessage
。在
content_script.js
中,它看起来像您还需要在清单的Web 可访问资源中声明导入的脚本:
// ManifestV3
// ManifestV2
了解更多详情:
chrome.runtime.getURL
李>希望有帮助。
免责声明
首先,需要说明的是,自 2018 年 1 月起,内容脚本不支持模块。此解决方法通过将模块
script
标记嵌入到返回的页面中来避开限制到您的扩展程序。这是一个不安全的解决方法!
网页脚本(或其他扩展)可以通过在
Object.prototype
和其他原型上使用 setter/getter、代理来利用您的代码并提取/欺骗数据函数和/或全局对象,因为script
元素内的代码在页面的 JS 上下文中运行,而不是在默认情况下运行内容脚本的安全隔离 JS 环境中。一个安全的解决方法是此处的另一个答案中显示的动态
import()
。解决方法
这是我的
manifest.json
:请注意,我在
web_accessible_resources
中有两个脚本。这是我的
content.js
:这会将
main.js
作为模块脚本插入网页中。我的所有业务逻辑现在都在
main.js
中。要使此方法发挥作用,
main.js
(以及我将导入
的所有脚本)必须位于中清单中的 web_accessible_resources
。用法示例:
my-script.js
在
main.js
中,这是导入脚本的示例:这有效!没有抛出任何错误,我很高兴。 :)