Dengan ES6, saya dapat mengimpor beberapa ekspor dari file seperti ini:
import {ThingA, ThingB, ThingC} from 'lib/things';
Namun, saya suka organisasi memiliki satu modul per file. Saya berakhir dengan impor seperti ini:
import ThingA from 'lib/things/ThingA';
import ThingB from 'lib/things/ThingB';
import ThingC from 'lib/things/ThingC';
Saya ingin sekali dapat melakukan ini:
import {ThingA, ThingB, ThingC} from 'lib/things/*';
atau sesuatu yang serupa, dengan konvensi yang dipahami bahwa setiap file berisi satu ekspor default, dan setiap modul dinamai sama dengan file-nya.
Apakah ini mungkin?
javascript
ecmascript-6
es6-modules
Frambot
sumber
sumber
lib/math
adalah file yang berisi banyak ekspor. Dalam pertanyaan saya,lib/math/
adalah direktori yang berisi beberapa file, masing-masing berisi satu ekspor.Jawaban:
Saya tidak berpikir ini mungkin, tetapi afaik resolusi nama modul hingga modul loader sehingga mungkin ada implementasi loader yang mendukung ini.
Sampai saat itu, Anda dapat menggunakan "file modul" antara
lib/things/index.js
yang baru saja berisidan itu akan memungkinkan Anda untuk melakukannya
sumber
index.js
tampak seperti:import ThingA from 'things/ThingA'; export {ThingA as ThingA}; import ThingB from 'things/ThingB'; export {ThingB as ThingB};
. Mantra lain diindex.js
tidak mau mengalah.export * from
harusnya bekerja. Apakah Anda mencoba…from './ThingA'
atauexport ThingA from …
? Apa pemuat modul yang Anda gunakan?Hanya variasi pada tema yang sudah disediakan dalam jawaban, tetapi bagaimana dengan ini:
Dalam
Thing
,Di
things/index.js
,Kemudian untuk mengkonsumsi semua hal di tempat lain,
Atau hanya mengkonsumsi beberapa hal,
sumber
index.js
untuk saya. Saya menggunakan SystemJs + Babelexport ThingA from './ThingA'
alih-alihexport {default as ThingA} from './ThingA'
Jawaban saat ini menyarankan solusi tetapi disadap saya mengapa ini tidak ada, jadi saya telah membuat sebuah
babel
plugin yang melakukan ini.Instal menggunakan:
lalu tambahkan ke Anda
.babelrc
dengan:lihat repo untuk info pemasangan terperinci
Ini memungkinkan Anda untuk melakukan ini:
sekali lagi, repo berisi informasi lebih lanjut tentang apa sebenarnya yang dilakukannya, tetapi melakukannya dengan cara ini menghindari membuat
index.js
file dan juga terjadi pada waktu kompilasi untuk menghindari melakukanreaddir
s saat runtime.Juga dengan versi yang lebih baru Anda dapat melakukan persis seperti contoh Anda:
kerjanya sama seperti di atas.
sumber
./lib/things;
dan tidak diambil. Masalah yang ditimbulkannya konyol. Saya baru saja menyaksikan situasi, ketika mengubah file denganimport *
membuat babel untuk mengambil file yang ditambahkan, tetapi mengubahnya kembali, membawa masalah kembali, seperti menggunakan kembali cache dari sebelum perubahan. Gunakan dengan hati-hati.~/.babel.json
yang menyebabkan perilaku aneh ini. Juga jika Anda menggunakan seperti watcher atau hot reload Anda harus menyimpan file baru sehingga akan dikompilasi ulang dengan daftar direktori barubpwc clear-cache
karena webpack dan proses pembangunan lainnya masih akan melakukan cache secara diam-diamGugly gugly hebat! Ini lebih sulit daripada yang seharusnya.
Ekspor satu default datar
Ini adalah peluang bagus untuk menggunakan spread (
...
di{ ...Matters, ...Contacts }
bawah:Kemudian, untuk menjalankan kode yang dikompilasi babel dari baris perintah (dari root proyek /):
Ekspor satu default mirip pohon
Jika Anda memilih untuk tidak menimpa properti, ubah:
Dan hasilnya adalah:
Ekspor beberapa nama ekspor tanpa standar
Jika Anda berdedikasi untuk KERING , sintaks pada impor juga berubah:
Ini menciptakan 2 ekspor bernama tanpa ekspor default. Kemudian ubah:
Dan hasilnya:
Impor semua ekspor yang disebut
Perhatikan perusakan
import { Matters, Contacts } from './collections';
pada contoh sebelumnya.Dalam praktek
Diberikan file sumber ini:
Menciptakan
/myLib/index.js
untuk menggabungkan semua file mengalahkan tujuan impor / ekspor. Akan lebih mudah untuk membuat semuanya mendunia sejak awal, daripada membuat semuanya mendunia melalui impor / ekspor melalui index.js "file pembungkus".Jika Anda menginginkan file tertentu,
import thingA from './myLib/thingA';
dalam proyek Anda sendiri.Membuat "file pembungkus" dengan ekspor untuk modul hanya masuk akal jika Anda mengemas untuk npm atau pada proyek multi-tim multi-tahun.
Sampai sejauh ini? Lihat dokumen untuk detail lebih lanjut.
Juga, yay untuk Stackoverflow akhirnya mendukung tiga `s sebagai markup pagar kode.
sumber
Anda dapat menggunakan impor async ():
lalu:
sumber
Mirip dengan pertanyaan yang diterima tetapi memungkinkan Anda untuk menskalakan tanpa perlu menambahkan modul baru ke file indeks setiap kali Anda membuatnya:
./modules/moduleA.js
./modules/index.js
./example.js
sumber
./example.js
Saya telah menggunakannya beberapa kali (khususnya untuk membangun objek besar yang memisahkan data ke banyak file (mis. AST node)), untuk membangunnya saya membuat skrip kecil (yang baru saja saya tambahkan ke npm sehingga semua orang lain dapat menggunakannya).
Penggunaan (saat ini Anda harus menggunakan babel untuk menggunakan file ekspor):
Menghasilkan file yang mengandung:
Maka Anda cukup mengonsumsi file:
sumber
\` instead of
/ -) also as an improvment you may want to allow two options like
--filename` &&--dest
untuk memungkinkan penyesuaian di mana file yang dibuat harus disimpan dan dengan nama yang juga tidak berfungsi dengan nama file yang mengandung.
(sepertiuser.model.js
)Hanya pendekatan lain untuk jawaban @ Bergi
Penggunaan
sumber
export '...' was not found in '....
.Anda dapat menggunakan persyaratan juga:
Kemudian gunakan modulHolder Anda dengan pengontrol yang dimuat secara dinamis:
sumber
Ini tidak persis apa yang Anda minta tetapi, dengan metode ini saya dapat beralih
componentsList
di file saya yang lain dan menggunakan fungsi seperticomponentsList.map(...)
yang saya temukan sangat berguna!sumber
Jika Anda menggunakan paket web. Ini mengimpor file secara otomatis dan mengekspor sebagai api namespace.
Jadi tidak perlu memperbarui pada setiap penambahan file.
Untuk pengguna naskah;
sumber
Saya dapat mengambil dari pendekatan atilkan pengguna dan memodifikasinya sedikit:
Untuk pengguna naskah;
sumber
jika Anda tidak mengekspor default di A, B, C tetapi hanya mengekspor {} maka dimungkinkan untuk melakukannya
sumber
./thing
) dan bahkan jika ada, itu tidak akan berhasil. (Saya mencobanya, dan itu tidak berhasil.)