ES6 mengekspor / mengimpor dalam file indeks


202

Saat ini saya menggunakan ES6 di aplikasi Bereaksi via webpack / babel. Saya menggunakan file indeks untuk mengumpulkan semua komponen modul dan mengekspornya. Sayangnya, yang terlihat seperti ini:

import Comp1_ from './Comp1.jsx';
import Comp2_ from './Comp2.jsx';
import Comp3_ from './Comp3.jsx';

export const Comp1 = Comp1_;
export const Comp2 = Comp2_;
export const Comp3 = Comp3_;

Jadi saya bisa mengimpornya dari tempat lain seperti ini:

import { Comp1, Comp2, Comp3 } from './components';

Jelas itu bukan solusi yang sangat bagus, jadi saya bertanya-tanya, apakah ada cara lain. Saya sepertinya tidak dapat mengekspor komponen yang diimpor secara langsung.


Jawaban:


369

Anda dapat dengan mudah mengekspor kembali impor default:

export {default as Comp1} from './Comp1.jsx';
export {default as Comp2} from './Comp2.jsx';
export {default as Comp3} from './Comp3.jsx';

Ada juga proposal untuk ES7 ES8 yang akan membuat Anda menulis export Comp1 from '…';.


2
Lihat juga pola yang serupa di sini dan di sini
Bergi

6
Selain proposal ES8, Anda dapat menggunakan pembuatan kode untuk memelihara file indeks. Lihatlah github.com/gajus/create-index dan github.com/ryardley/indexr .
Gajus

@Bergi Jadi 3 baris ini melakukan impor dan ekspor? Atau apakah ini hanya mengekspor tetapi Anda tidak perlu lagi mengutak-atik nama Comp1_ dll?
musicformellons

@musicformellons Mereka langsung mengekspor dari modul yang direferensikan, ya.
Bergi

2
@amann Referensi melingkar itu sendiri tidak buruk, tetapi dapat menyebabkan masalah tergantung pada apa yang dilakukan modul. Apapun, saya pikir Anda hanya harus menggunakan pola ini dalam file indeks perpustakaan Anda untuk mengekspor semua komponen, dan jika Anda memiliki dependensi antar-modul Anda harus mengimpornya secara langsung daripada mengimpor bagian dari yang besar. Dengan itu, tidak ada referensi melingkar yang diperkenalkan oleh pola ini.
Bergi

56

Juga, ingatlah bahwa jika Anda perlu mengekspor beberapa fungsi sekaligus, seperti tindakan yang dapat Anda gunakan

export * from './XThingActions';

14
Iya. Sayangnya ini hanya membutuhkan ekspor yang dinamai, yaitu tidak termasuk ekspor standar.
ArneHugo

dapatkan saya (cukup menyesatkan ... luangkan waktu sejenak) SyntaxError: Unexpected reserved word, jawaban yang diterima @ Bergi berhasil.
Frank Nocke

Anda juga dapat memberi nama ekspor default untuk mengatasi masalah itu. Dan tindakan Anda seharusnya tidak benar-benar memiliki ekspor default sehingga solusi ini berfungsi dengan baik.
Barry Michael Doyle

2
Praktik terbaik adalah tidak menggunakan ekspor default dalam javascript, sintaks tambahan yang tidak perlu. @ GM memiliki jawaban terbaik di utas ini untuk javascript modern.
mibbit

39

Terlambat tetapi saya ingin membagikan cara saya menyelesaikannya.

Memiliki modelfile yang memiliki dua nama ekspor:

export { Schema, Model };

dan memiliki controllerfile yang memiliki ekspor default:

export default Controller;

Saya membuka indexfile dengan cara ini:

import { Schema, Model } from './model';
import Controller from './controller';

export { Schema, Model, Controller };

dan dengan asumsi bahwa saya ingin mengimpor semuanya:

import { Schema, Model, Controller } from '../../path/';

Apakah ini berfungsi ketika Anda mengimpor suatu fungsi dan kemudian mengekspornya kembali? Saya mencoba tetapi tidak.
Aftab Naveed

Maaf itu benar-benar berfungsi, saya hilang / di jalur saya.
Aftab Naveed

14

Secara sederhana:

// Default export (recommended)
export {default} from './MyClass' 

// Default export with alias
export {default as d1} from './MyClass' 

// In >ES7, it could be
export * from './MyClass'

// In >ES7, with alias
export * as d1 from './MyClass'

Atau dengan nama fungsi:

// export by function names
export { funcName1, funcName2, …} from './MyClass'

// export by aliases
export { funcName1 as f1, funcName2 as f2, …} from './MyClass'

Info lebih lanjut: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export


1

Instal @babel/plugin-proposal-export-default-frommelalui:

yarn add -D @babel/plugin-proposal-export-default-from

Di Anda .babelrc.jsonatau di salah satu dari Jenis File Konfigurasi

module.exports = {
  //...
  plugins: [
     '@babel/plugin-proposal-export-default-from'
  ]
  //...
}

Sekarang Anda dapat exportlangsung dari file-path:

export Foo from './components/Foo'
export Bar from './components/Bar'

Semoga berhasil...


Bagaimana cara melakukannya untuk Buat-Bereaksi-Aplikasi tanpa mengeluarkan?
Negin Basiri
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.