Chrome-Erweiterung: ES6-Module in Inhaltsskripte importieren
P粉141035089
2023-08-27 22:19:00
<p>In <strong>Chrome 61</strong> wurde Unterstützung für JavaScript-Module hinzugefügt. Jetzt verwende ich Chrome 63. </p>
<p>Ich versuche, ein Modul in einem Chrome-Erweiterungsinhaltsskript mit der Syntax <code>import</code>/<code>export</code> zu verwenden. </p>
<p>In<strong><code>manifest.json</code></strong>: </p>
<pre class="brush:php;toolbar:false;">"content_scripts": [
{
„js“: [
„content.js“
],
}
]</pre>
<p>In<strong><code>my-script.js</code></strong> (mit <strong><code>content.js</code></strong> im gleichen Verzeichnis ): </p>
<pre class="brush:php;toolbar:false;">'use strict';
const injectFunction = () => window.alert('hello world');
export default injectFunction;</pre>
<p>In<strong><code>content.js</code></strong>: </p>
<pre class="brush:php;toolbar:false;">'use strict';
injectFunction aus './my-script.js' importieren;
injectFunction();</pre>
<p>Ich erhalte diese Fehlermeldung:<strong><code>Unabgefangener Syntaxfehler: Unerwarteter Bezeichner</code></strong></p>
<p>Wenn ich die Importsyntax in <code>import {injectFunction} from './my-script.js' ändere;</code> erhalte ich diese Fehlermeldung: <strong><code>Uncaught SyntaxError : Unerwartetes Token {</code></strong><
</p><p>Gibt es ein Problem bei der Verwendung dieser Syntax in <strong><code>content.js</code></strong> in der Chrome-Erweiterung (da Sie in HTML </p></strong> verwenden müssen)? ;code>
<script type="module" src="script.js "></code> oder mache ich etwas falsch? Es erscheint seltsam, dass Google die Unterstützung für Erweiterungen ignoriert. </p></script>
</code></p>
使用动态
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
中,这是导入脚本的示例:这有效!没有抛出任何错误,我很高兴。 :)