2015-07-13 20 views
11

Tôi có một thư viện Node.js lib viết bằng ES6 (biên soạn với Babel) trong đó tôi xuất submodules sau:Sự khác nhau giữa nhập X và nhập * dưới dạng X trong node.js (ES6/Babel)?

"use strict"; 

import * as _config from './config'; 
import * as _db from './db'; 
import * as _storage from './storage'; 

export var config = _config; 
export var db = _db; 
export var storage = _storage; 

Nếu từ dự án chính của tôi tôi bao gồm các thư viện như thế này

import * as lib from 'lib'; 
console.log(lib); 

Tôi có thể thấy đầu ra phù hợp và nó hoạt động như mong đợi { config: ... }. Tuy nhiên, nếu tôi cố gắng đưa thư viện như thế này:

import lib from 'lib'; 
console.log(lib); 

nó sẽ là undefined.

Ai đó có thể giải thích những gì đang xảy ra ở đây? Không phải hai phương thức nhập được cho là tương đương? Nếu không, tôi còn thiếu gì khác biệt?

Trả lời

24
import * as lib from 'lib'; 

đang yêu cầu đối tượng có tất cả xuất khẩu có tên là 'lib'.

export var config = _config; 
export var db = _db; 
export var storage = _storage; 

được đặt tên là xuất, đó là lý do bạn kết thúc với một đối tượng như bạn đã làm.

import lib from 'lib'; 

yêu cầu xuất defaultlib. ví dụ.

export default 4; 

sẽ làm lib === 4. Nó không tìm nạp các hàng xuất khẩu có tên. Để có được một đối tượng từ việc xuất khẩu mặc định, bạn sẽ phải làm một cách rõ ràng

export default { 
    config: _config, 
    db: _db, 
    storage: _storage 
}; 
2

Chỉ cần thêm vào dung dịch Logan's vì sự hiểu biết nhập khẩu với dấu ngoặc, * và không giải quyết một vấn đề đối với tôi.

import * as lib from 'lib'; 

là tương đương với:

import {config, db, storage} as lib from 'lib'; 

Trường hợp * là tương tự như một ký tự đại diện là hàng nhập khẩu tất cả các export var từ lib.

export var config; 
export var db; 
export var storage; 

Ngoài ra, sử dụng:

import lib from 'lib'; 

Cho phép bạn chỉ truy cập vào xuất khẩu mặc định:

// lib.js 
export default storage; 

Sử dụng {} cũng chỉ nhập khẩu linh kiện cụ thể từ các mô-đun, which reduces the footprint with bundlers like Webpack.

Trong khi:

import storage, { config, db } from './lib' 

sẽ nhập khẩu tất cả các module bao gồm export default storage;

trả lời Xem Dan Abramov của: When should I use curly braces for ES6 import?

+0

Chỉ là không có 'nhập {...} như ... từ ... 'cú pháp – Bergi

+0

Edited. Bạn nói đúng, không có toán tử spread cho {...}, tôi nên sử dụng etc thay thế. – tgrrr

+0

(Tất nhiên không có cú pháp lây lan/nghỉ ngơi, vì đây không phải là đối tượng theo nghĩa đen/phá hoại). Tuy nhiên không có cú pháp '{…} như…' trong nhập khẩu, vì vậy "* giống như *" là vô nghĩa. (Tôi không nghĩ rằng bạn có nghĩa là "* sản xuất các lỗi cú pháp tương tự như *") – Bergi

0

import X from Y; là một đường cú pháp.

import lib from 'lib';

bằng

import {default as lib } from 'lib';

Các vấn đề liên quan