Sambungan Chrome: Import modul ES6 dalam skrip kandungan
P粉141035089
P粉141035089 2023-08-27 22:19:00
0
2
585
<p>Dalam <strong>Chrome 61</strong>, sokongan untuk modul JavaScript telah ditambahkan. Sekarang saya menjalankan Chrome 63. </p> <p>Saya cuba menggunakan modul dalam skrip kandungan sambungan Chrome menggunakan sintaks <kod>import</kod>/<kod>eksport</kod> </p> <p>Dalam<strong><kod>manifest.json</code></strong>: </p> <pre class="brush:php;toolbar:false;">"content_scripts": [ { "js": [ "content.js" ], } ]</pre> <p>Dalam<strong><kod>my-script.js</code></strong> (dengan <strong><code>content.js</code></strong> direktori yang sama ): </p> <pre class="brush:php;toolbar:false;">'gunakan ketat'; const injectFunction = () => window.alert('hello world'); eksport lalai injectFunction;</pre> <p>Dalam<strong><kod>kandungan.js</kod></strong>: </p> <pre class="brush:php;toolbar:false;">'gunakan ketat'; import injectFunction daripada './my-script.js'; injectFunction();</pre> <p>Saya mendapat ralat ini:<strong><kod>Ralat sintaks tidak ditangkap: Pengecam tidak dijangka</kod></strong></p> <p>Jika saya menukar sintaks import kepada <kod>import {injectFunction} daripada './my-script.js';</code> saya mendapat ralat ini: <strong><code>Uncaught SyntaxError : Token yang tidak dijangka {</code></strong>< </p><p>Adakah terdapat masalah menggunakan sintaks ini dalam <strong><kod>kandungan.js</code></strong> dalam sambungan Chrome (kerana dalam HTML anda perlu menggunakan < ;kod> <script type="module" src="script.js "></code> Nampaknya pelik bahawa Google mengabaikan sokongan untuk sambungan. </p></script> </code></p>
P粉141035089
P粉141035089

membalas semua(2)
P粉739079318

Gunakan fungsi dinamik import().

Tidak seperti penyelesaian yang tidak selamat menggunakan elemen 元素的不安全解决方法不同,此解决方法在相同的安全 JS 环境(内容脚本的隔离世界)中运行,您导入的模块仍然可以访问全局变量以及初始内容脚本的函数,包括内置的 chrome API,例如 chrome.runtime.sendMessage

chrome terbina dalam, seperti

chrome.runtime.sendMessage. content_script.js

Dalam

content_script.js ia kelihatan seperti

(async () => {
  const src = chrome.runtime.getURL("your/content_main.js");
  const contentMain = await import(src);
  contentMain.main();
})();
Anda juga perlu mengisytiharkan skrip yang diimport dalam

Sumber Boleh Akses Web

manifes:

// ManifestV3

  "web_accessible_resources": [{
     "matches": ["<all_urls>"],
     "resources": ["your/content_main.js"]
   }],

// ManifestV2

  "web_accessible_resources": [
     "your/content_main.js"
  ]
    Ketahui butiran lanjut:
  • Cara menggunakan "import" ES6 dengan sambungan Chrome
  • Contoh kerja import ES6 dalam sambungan Chrome
  • chrome.runtime.getURL李>chrome.runtime.getURL

🎜Semoga ini membantu. 🎜
P粉797004644

Penafian

Pertama sekali, adalah penting untuk ambil perhatian bahawa mulai Januari 2018, skrip kandungan tidak menyokong modul. Penyelesaian ini memintas sekatan pada sambungan anda dengan membenamkan teg modul script ke dalam halaman yang dikembalikan.

Ini adalah penyelesaian yang tidak selamat!

Skrip web (atau sambungan lain) boleh mengeksploitasi kod anda dan mengekstrak/menipu data dengan menggunakan setters/getters, proksi pada Object.prototype dan prototaip lain Object.prototype 和其他原型上使用 setter/getter、代理来利用您的代码并提取/欺骗数据函数和/或全局对象,因为 scriptfungsi dan/atau objek global, Kerana kod dalam elemen

berjalan dalam konteks JS halaman, bukan dalam persekitaran JS terpencil selamat yang menjalankan skrip kandungan secara lalai.

Penyelesaian yang selamat ialah dinamik import() ditunjukkan dalam jawapan lain

di sini.

Penyelesaian

Ini milik sayamanifest.json

:

    "content_scripts": [ {
       "js": [
         "content.js"
       ]
    }],
    "web_accessible_resources": [
       "main.js",
       "my-script.js"
    ]
web_accessible_resourcesSila ambil perhatian bahawa saya mempunyai dua skrip dalam .

Ini milik sayacontent.js

:

    'use strict';
    
    const script = document.createElement('script');
    script.setAttribute("type", "module");
    script.setAttribute("src", chrome.extension.getURL('main.js'));
    const head = document.head || document.getElementsByTagName("head")[0] || document.documentElement;
    head.insertBefore(script, head.lastChild);
main.jsIni akan memasukkan ke dalam halaman web sebagai skrip modul.

main.jsSemua logik perniagaan saya kini masuk

.

main.js(以及我将导入的所有脚本)必须位于中清单中的 web_accessible_resourcesUntuk kaedah ini berfungsi,

(dan semua skrip yang saya import)

mesti ada dalam web_accessible_resources dalam manifes dalam . my-script.js Contoh penggunaan:

main.js

    'use strict';
    
    const injectFunction = () => window.alert('hello world');
    
    export {injectFunction};
Dalam

ini ialah contoh skrip import: 🎜
    'use strict';
    
    import {injectFunction} from './my-script.js';
    injectFunction();
🎜Ini berkesan! Tiada kesilapan yang dilemparkan dan saya gembira. :)🎜
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan