Saya perlu melakukan sesuatu seperti:
if (condition) {
import something from 'something';
}
// ...
if (something) {
something.doStuff();
}
Kode di atas tidak dikompilasi; itu melempar SyntaxError: ... 'import' and 'export' may only appear at the top level
.
Saya mencoba menggunakan System.import
seperti yang ditunjukkan di sini , tetapi saya tidak tahu dari mana System
asalnya. Apakah ini proposal ES6 yang akhirnya tidak diterima? Tautan ke "API terprogram" dari artikel itu mencampakkan saya ke laman dokumen yang tidak digunakan lagi .
javascript
module
ecmascript-6
ericsoco
sumber
sumber
package.json
; sayagulpfile
kemudian memeriksa apakah ketergantungan itu ada sebelum melakukan beberapa langkah membangun.webpack
danbabel
untuk transpile es6 ke es5. Proyek sepertiwebpack-rewire
dan sejenisnya tidak membantu di sini - github.com/jhnns/rewire-webpack/issues/12 . Salah satu cara untuk menetapkan uji ganda ATAU untuk menghapus dependensi yang bermasalah bisa berupa impor bersyarat.webpack
digunakan untuk mengubah stylesheet ke dalam modul yang memasukkan gaya yang relevan ke dalam DOM ketika mereka diimpor) tetapi modul juga perlu dijalankan di luar browser (misalnya untuk pengujian unit).Jawaban:
Kami memiliki proposal impor dinamis sekarang dengan ECMA. Ini dalam tahap 3. Ini juga tersedia sebagai babel-preset .
Mengikuti adalah cara untuk melakukan rendering bersyarat sesuai kasus Anda.
Ini pada dasarnya mengembalikan janji. Resolusi janji diharapkan memiliki modul. Proposal juga memiliki fitur lain seperti beberapa impor dinamis, impor default, impor file js dll. Anda dapat menemukan informasi lebih lanjut tentang impor dinamis di sini .
sumber
if (condition) { import('something') .then(({ somethingExported }) => { console.log(somethingExported); }); }
npm run build
saya masih mendapatkan kesalahan:SyntaxError: ... 'import' and 'export' may only appear at the top level
Jika mau, Anda bisa menggunakan persyaratan. Ini adalah cara untuk memiliki pernyataan persyaratan bersyarat.
sumber
require()
itu bukan bagian dari JavaScript standar - ini adalah fungsi bawaan di Node.js, jadi hanya berguna di lingkungan itu. OP tidak memberikan indikasi bekerja dengan Node.js.Anda tidak dapat mengimpor secara kondisional, tetapi Anda dapat melakukan yang sebaliknya: mengekspor sesuatu secara kondisional. Itu tergantung pada kasus penggunaan Anda, jadi penyelesaian ini mungkin bukan untuk Anda.
Anda dapat melakukan:
api.js
apiConsumer.js
Saya menggunakannya untuk mengejek lib analytics seperti mixpanel, dll ... karena saya tidak dapat memiliki beberapa build atau frontend kami saat ini. Bukan yang paling elegan, tetapi bekerja. Saya hanya punya beberapa 'jika' di sana-sini tergantung pada lingkungan karena dalam kasus mixpanel, perlu inisialisasi.
sumber
Sepertinya jawabannya adalah, sampai sekarang, Anda tidak bisa.
http://exploringjs.com/es6/ch_modules.html#sec_module-loader-api
Saya pikir maksudnya adalah untuk memungkinkan analisis statis sebanyak mungkin, dan modul yang diimpor dengan syarat mematahkannya. Juga layak disebutkan - Saya menggunakan Babel , dan saya rasa itu
System
tidak didukung oleh Babel karena API pemuat modul tidak menjadi standar ES6.sumber
require()
adalah cara untuk mengimpor beberapa modul pada waktu berjalan dan sama-sama memenuhi syarat untuk analisis statis sepertiimport
jika digunakan dengan jalur literal string. Ini diperlukan oleh bundler untuk memilih dependensi untuk bundel.Untuk resolusi modul dinamis dengan dukungan analisis statis lengkap, modul indeks pertama dalam pengindeks (index.js) dan pengindeks impor dalam modul host.
sumber
require()
itu bukan bagian dari JavaScript standar - ini adalah fungsi bawaan di Node.js, jadi hanya berguna di lingkungan itu. OP tidak memberikan indikasi bekerja dengan Node.js.Perbedaan penting jika Anda menggunakan mode impor dinamis Webpack
eager
:sumber
import
mengembalikan janji.mengaburkannya dalam eval bekerja untuk saya, menyembunyikannya dari analisa statis ...
sumber
eval
sini, @TormodHaugene?eval
tidak digunakan . Secara umum: jika Anda merasa perlu menggunakaneval
, Anda mungkin melakukan kesalahan dan harus mengambil langkah mundur untuk mempertimbangkan alternatif Anda. Mungkin ada beberapa skenario di mana penggunaannyaeval
benar, tetapi Anda kemungkinan besar belum menemukan salah satu dari situasi itu.require()
itu bukan bagian dari JavaScript standar - ini adalah fungsi bawaan di Node.js, jadi hanya berguna di lingkungan itu. OP tidak memberikan indikasi bekerja dengan Node.js.Saya dapat mencapai ini menggunakan fungsi yang dipanggil langsung dan memerlukan pernyataan.
sumber
require()
itu bukan bagian dari JavaScript standar - ini adalah fungsi bawaan di Node.js, jadi hanya berguna di lingkungan itu. OP tidak memberikan indikasi bekerja dengan Node.js.Impor bersyarat juga dapat dicapai dengan terner dan
require()
s:const logger = DEBUG ? require('dev-logger') : require('logger');
Contoh ini diambil dari ES Lint global-membutuhkan dokumen: https://eslint.org/docs/rules/global-require
sumber
require()
itu bukan bagian dari JavaScript standar - ini adalah fungsi bawaan di Node.js, jadi hanya berguna di lingkungan itu. OP tidak memberikan indikasi bekerja dengan Node.js.Lihat contoh ini untuk pemahaman yang jelas tentang cara kerja impor dinamis.
Modul Impor Contoh Dinamis
Untuk memiliki Pengertian Dasar tentang mengimpor dan mengekspor Modul.
Modul JavaScript Github
Modul Javascript MDN
sumber
Tidak bisa!
Namun, setelah menabrak masalah itu harus membuat Anda memikirkan kembali bagaimana Anda mengatur kode Anda.
Saya kira salah satu alasan mereka menjatuhkan dukungan pada ES6 dan seterusnya adalah fakta bahwa kompilasi akan sangat sulit atau tidak mungkin.
sumber