Xuất / nhập ES6 trong tệp chỉ mục


202

Tôi hiện đang sử dụng ES6 trong ứng dụng React qua webpack / babel. Tôi đang sử dụng các tệp chỉ mục để thu thập tất cả các thành phần của một mô-đun và xuất chúng. Thật không may, nó trông như thế này:

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_;

Vì vậy, tôi có thể nhập nó độc đáo từ những nơi khác như thế này:

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

Rõ ràng đó không phải là một giải pháp rất hay, vì vậy tôi đã tự hỏi, liệu có cách nào khác không. Tôi dường như không thể xuất khẩu thành phần nhập khẩu trực tiếp.


Câu trả lời:


369

Bạn có thể dễ dàng xuất lại nhập mặc định:

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

Ngoài ra còn có một đề xuất cho ES7 ES8 sẽ cho phép bạn viết export Comp1 from '…';.


2
Xem thêm các mẫu tương tự ở đâyđây
Bergi

6
Ngoài đề xuất ES8, bạn có thể sử dụng tạo mã để duy trì các tệp chỉ mục. Hãy xem github.com/gajus/create-indexgithub.com/ryardley/indexr .
Gajus

@Bergi Vậy 3 dòng này làm cả nhập và xuất? Hoặc đây chỉ là xuất nhưng bạn không còn cần phải sử dụng tên Comp1_, v.v.?
nhạc nền

@musicformellons Họ trực tiếp xuất từ ​​mô-đun được tham chiếu, vâng.
Bergi

2
@amann Một tài liệu tham khảo vòng tròn của chính nó không phải là xấu, nhưng có thể dẫn đến các vấn đề tùy thuộc vào những gì mô-đun làm. Bất kể, tôi nghĩ bạn chỉ nên sử dụng mẫu này trong tệp chỉ mục của thư viện để xuất tất cả các thành phần và nếu bạn có phụ thuộc giữa các mô-đun, bạn nên nhập trực tiếp chúng thay vì nhập phần từ mẫu lớn. Cùng với đó, không có tài liệu tham khảo tròn nào được giới thiệu bởi mẫu này.
Bergi

56

Ngoài ra, hãy nhớ rằng nếu bạn cần xuất nhiều chức năng cùng một lúc, như các hành động bạn có thể sử dụng

export * from './XThingActions';

14
Đúng. Thật không may, điều này chỉ có xuất khẩu được đặt tên, tức là nó không bao gồm xuất khẩu mặc định.
ArneHugo

hãy cho tôi một (khá dễ gây hiểu lầm ... mất một chút thời gian) SyntaxError: Unexpected reserved word, câu trả lời được chấp nhận của @ Berg đã làm việc.
Frank Nocke

Bạn cũng có thể đặt tên cho xuất khẩu mặc định của mình để khắc phục vấn đề đó. Và hành động của bạn không thực sự có xuất mặc định để giải pháp này hoạt động tốt.
Barry Michael Doyle

2
thực hành tốt nhất là không sử dụng xuất mặc định trong javascript, cú pháp thêm không cần thiết. @GM có câu trả lời tốt nhất về chủ đề này cho javascript hiện đại.
mibbit

39

Quá muộn nhưng tôi muốn chia sẻ cách mà tôi giải quyết nó.

modeltệp có hai xuất khẩu được đặt tên:

export { Schema, Model };

và có controllertệp có xuất mặc định:

export default Controller;

Tôi tiếp xúc trong indextập tin theo cách này:

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

export { Schema, Model, Controller };

và giả sử rằng tôi muốn nhập tất cả chúng:

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

Điều này có hoạt động khi bạn nhập một hàm và sau đó xuất lại không? Tôi đã thử nhưng không được.
Aftab đã bắt đầu

Xin lỗi nó đã thực sự hoạt động, tôi đã mất tích / trên con đường của tôi.
Aftab đã bắt đầu

14

Đơn giản:

// 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'

Hoặc theo tên hàm:

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

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

Thêm thông tin: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export


1

Cài đặt @babel/plugin-proposal-export-default-fromqua:

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

Trong .babelrc.jsonhoặc bất kỳ loại tệp cấu hình nào của bạn

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

Bây giờ bạn có thể exporttrực tiếp từ một file-path:

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

Chúc may mắn...


Làm thế nào để làm điều đó cho Tạo-Phản ứng-Ứng dụng mà không cần đẩy ra?
Negin Basiri
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.