apakah mungkin untuk mengimpor sesuatu ke modul yang menyediakan nama variabel saat menggunakan impor ES6?
Yaitu saya ingin mengimpor beberapa modul saat runtime tergantung pada nilai yang diberikan dalam konfigurasi:
import something from './utils/' + variableName;
javascript
node.js
ecmascript-6
Vytautas Butkus
sumber
sumber
Jawaban:
Tidak dengan
import
pernyataannya.import
danexport
didefinisikan sedemikian rupa sehingga dapat dianalisis secara statis, sehingga tidak dapat bergantung pada informasi waktu proses.Anda mencari API pemuat (polyfill) , tetapi saya agak tidak jelas tentang status spesifikasinya:
sumber
Selain jawaban Felix , saya akan mencatat secara eksplisit bahwa ini saat ini tidak diizinkan oleh tata bahasa ECMAScript 6 :
Sebuah ModuleSpecifier hanya bisa menjadi StringLiteral , tidak ada jenis lain dari ekspresi seperti AdditiveExpression .
sumber
const
string literal
s. Mereka dapat dianalisis secara statis, bukan? Itu akan membuat kemungkinan menggunakan kembali lokasi ketergantungan. (mis. mengimpor template dan memiliki template serta lokasi template yang tersedia).Meskipun ini sebenarnya bukan impor dinamis (misalnya dalam keadaan saya, semua file yang saya impor di bawah ini akan diimpor dan digabungkan oleh webpack, tidak dipilih saat runtime), pola yang telah saya gunakan yang mungkin membantu dalam beberapa keadaan adalah :
atau sebagai alternatif:
Saya tidak berpikir saya bisa kembali ke default semudah dengan
require()
, yang menimbulkan kesalahan jika saya mencoba mengimpor jalur template yang dibangun yang tidak ada.Contoh dan perbandingan yang baik antara Requirement dan Import dapat ditemukan di sini: http://www.2ality.com/2014/09/es6-modules-final.html
Dokumentasi yang sangat baik tentang mengekspor ulang dari @iainastacio: http://exploringjs.com/es6/ch_modules.html#sec_all-exporting-styles
Saya tertarik untuk mendengar umpan balik tentang pendekatan ini :)
sumber
Object.values(templates)
.Ada spesifikasi baru yang disebut impor dinamis untuk modul ES. Pada dasarnya, Anda hanya menelepon
import('./path/file.js')
dan Anda siap berangkat. Fungsi mengembalikan janji, yang diselesaikan dengan modul jika impor berhasil.Kasus penggunaan
Kasus penggunaan termasuk pengimporan komponen berbasis rute untuk React, Vue, dll. Dan kemampuan untuk memuat modul secara malas , setelah modul tersebut diperlukan selama runtime.
Informasi lebih lanjut
Berikut penjelasan tentang Google Developers .
Kompatibilitas browser (April 2020)
Menurut MDN , ini didukung oleh setiap browser utama saat ini (kecuali IE) dan caniuse.com menunjukkan 87% dukungan di seluruh pangsa pasar global. Sekali lagi tidak ada dukungan di IE atau non-chromium Edge.
sumber
Saya memahami pertanyaan yang secara khusus ditanyakan untuk ES6
import
di Node.js, tetapi yang berikut ini mungkin membantu orang lain mencari solusi yang lebih umum:Perhatikan jika Anda mengimpor modul ES6 dan perlu mengakses
default
ekspor, Anda perlu menggunakan salah satu dari berikut ini:Anda juga dapat menggunakan destructuring dengan pendekatan ini yang dapat menambahkan lebih banyak sintaks yang familiar dengan impor Anda yang lain:
Sayangnya, jika Anda ingin mengakses
default
serta merusak, Anda perlu melakukan ini dalam beberapa langkah:sumber
Anda dapat menggunakan notasi non-ES6 untuk melakukannya. inilah yang berhasil untuk saya:
sumber
Saya kurang suka sintaks ini, tetapi berfungsi:
alih-alih menulis
gunakan sintaks ini:
sumber
require()
adalah metode Node.JS untuk memuat file, yang merupakan versi awal.import
pernyataan adalah versi yang lebih baru, yang sekarang menjadi bagian dari sintaks bahasa resmi. Namun dalam banyak kasus, browser akan menggunakan versi sebelumnya (di belakang sains). Pernyataan Requirement juga akan menguangkan file Anda, jadi jika file dimuat untuk kedua kalinya, file tersebut akan dimuat dari memori (performa lebih baik). Cara impor memiliki keuntungannya sendiri - jika Anda menggunakan WebPack. kemudian webpack dapat menghapus referensi mati (skrip ini tidak akan diunduh ke klien).Impor dinamis () (tersedia di Chrome 63+) akan melakukan tugas Anda. Begini caranya:
sumber
Saya akan melakukannya seperti ini
sumber
./utils/test.js
panggilan dari file
sumber