Ini adalah file contoh saya:
<!DOCTYPE html>
<html>
<head>
<title>Test</title>
<script src="t1.js"></script>
</head>
<body></body>
</html>
t1.js:
import Test from 't2.js';
t2.js:
export const Test = console.log("Hello world");
Saat saya memuat halaman di Firefox 46, ia mengembalikan "SyntaxError: deklarasi impor hanya dapat muncul di tingkat atas modul" - tetapi saya tidak yakin berapa banyak lagi pernyataan impor tingkat atas yang bisa didapatkan di sini. Apakah kesalahan ini adalah red herring, dan apakah impor / ekspor belum didukung?
javascript
html
firefox
ecmascript-6
es6-modules
Christoph Burschka
sumber
sumber
Jawaban:
Sebenarnya kesalahan yang Anda dapatkan adalah karena Anda perlu menyatakan secara eksplisit bahwa Anda memuat modul - hanya penggunaan modul yang diizinkan:
<script src="t1.js" type="module"></script>
Saya menemukannya di dokumen ini tentang menggunakan impor ES6 di browser . Bacaan yang direkomendasikan.
Sepenuhnya didukung di versi browser tersebut (dan yang lebih baru; daftar lengkap di caniuse.com ):
Di browser lama Anda mungkin perlu mengaktifkan beberapa tanda di browser:
chrome:flags
.dom.moduleScripts.enabled
pengaturanabout:config
.about:flags
.sumber
import
tidak lagi tidak didukung.import Test from './t2.js';
'./t2.js'
dan bukan'./t2'
tanpa.js
?Ini tidak akurat lagi. Semua browser saat ini sekarang mendukung modul ES6
Jawaban asli di bawah
Dari
import
MDN :Browser tidak mendukung
import
.Berikut adalah tabel dukungan browser:
Jika Anda ingin mengimpor modul ES6, saya sarankan menggunakan transpiler (misalnya, babel ).
sumber
Hanya menggunakan ekstensi file .js saat mengimpor file menyelesaikan masalah yang sama (jangan lupa untuk menyetel
type="module
di tag skrip).Cukup tulis:
import foo from 'foo.js';
dari pada
import foo from 'foo';
sumber
Tambahkan
type=module
pada skrip yang mengimpor dan mengekspor modul akan menyelesaikan masalah ini.sumber
Anda harus menentukan jenisnya dalam skrip dan ekspor harus default .. untuk contoh dalam kasus Anda seharusnya,
<script src='t1.js' type='module'>
untuk t2.js gunakan default setelah ekspor seperti ini, ekspor default 'di sini ekspresi Anda pergi' (Anda tidak dapat menggunakan variabel di sini) . Anda dapat menggunakan fungsi seperti ini,
export default function print(){ return console.log('hello world');}
dan untuk impor, sintaks impor Anda harus seperti ini, impor cetak dari './t2.js' (gunakan ekstensi file dan ./ untuk direktori yang sama) .. Saya harap ini bermanfaat bagi Anda!
sumber
Demi argumen ...
Seseorang dapat menambahkan antarmuka modul khusus ke objek jendela global. Meski, itu tidak disarankan. Di sisi lain, DOM sudah rusak dan tidak ada yang bertahan. Saya menggunakan ini sepanjang waktu untuk memuat silang modul dinamis dan berlangganan pendengar khusus. Ini mungkin bukan jawaban- tetapi berhasil. Stack overflow sekarang memiliki module.export yang memanggil peristiwa yang disebut 'Spork' - paling tidak hingga refresh ...
// spam the global window with a custom method with a private get/set-interface and error handler... window.modules = function(){ window.exports = { get(modName) { return window.exports[modName] ? window.exports[modName] : new Error(`ERRMODGLOBALNOTFOUND [${modName}]`) }, set(type, modDeclaration){ window.exports[type] = window.exports[type] || [] window.exports[type].push(modDeclaration) } } } // Call the method window.modules() // assign a custom type and function window.exports.set('Spork', () => console.log('SporkSporSpork!!!')) // Give your export a ridiculous event subscription chain type... const foofaalala = window.exports.get('Spork') // Iterate and call (for a mock-event chain) foofaalala.forEach(m => m.apply(this)) // Show and tell... window
sumber