Chrome 擴充功能:在內容腳本中匯入 ES6 模組
P粉141035089
2023-08-27 22:19:00
<p>在 <strong>Chrome 61</strong> 中,加入了對 JavaScript 模組的支援。現在我跑的是 Chrome 63。 </p>
<p>我正在嘗試在 Chrome 擴充內容腳本中使用 <code>import</code>/<code>export</code> 語法來使用模組。 </p>
<p>在<strong><code>manifest.json</code></strong>:</p>
<pre class="brush:php;toolbar:false;">"content_scripts": [
{
"js": [
"content.js"
],
}
]</pre>
<p>在<strong><code>my-script.js</code></strong>(與<strong><code>content.js</code></strong><code>content.js</code></strong>同一目錄):</p>
<pre class="brush:php;toolbar:false;">'use strict';
const injectFunction = () => window.alert('hello world');
export default injectFunction;</pre>
<p>在<strong><code>content.js</code></strong>:</p>
<pre class="brush:php;toolbar:false;">'use strict';
import injectFunction from './my-script.js';
injectFunction();</pre>
<p>我收到此錯誤:<strong><code>未捕獲的語法錯誤:意外的識別碼</code></strong></p>
<p>如果我將導入語法更改為<code>import {injectFunction} from './my-script.js';</code> 我收到此錯誤: <strong><code>Uncaught SyntaxError: Unexpected token {</code></strong>< /p>
</p><p>在Chrome 擴充功能中的<strong><code>content.js</code></strong> 中使用此語法是否有問題(因為在HTML 中您必須使用< ;code>
<script type="module" src="script.js "></code> 文法),還是我做錯了什麼? Google 忽略對擴充功能的支援似乎很奇怪。 </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
中,這是匯入腳本的範例:這有效!沒有拋出任何錯誤,我很高興。 :)