2015-07-13 11 views
11

mam node.js biblioteka lib napisany w ES6 (skompilowany z Babel), w których mogę eksportować następujące submodules:Różnica między importem X a importem * jako X w pliku 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; 

Jeśli z moim głównym projekcie obejmują biblioteki jak ten

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

Widzę prawidłowe wyjście i działa zgodnie z oczekiwaniami { config: ... }. Jednak, gdy próbuję włączyć bibliotekę takiego:

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

to będzie undefined.

Czy ktoś może wyjaśnić, co się tutaj dzieje? Czy dwie metody importu nie są równoważne? Jeśli nie, to jakiej różnicy brakuje mi?

Odpowiedz

24
import * as lib from 'lib'; 

prosi o obiekt ze wszystkimi wymienionymi eksportami "lib".

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

są eksportowane nazwane, dlatego kończy się na obiekcie podobnym do Ciebie.

import lib from 'lib'; 

prosi o eksporcie libdefault. na przykład

export default 4; 

wykonałby lib === 4. Nie pobiera nazwanych eksportów. Aby uzyskać obiekt z domyślnym eksportem, trzeba jawnie robić

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

Wystarczy dodać do Logan's rozwiązanie, ponieważ zrozumienie import ze wspornikami * i bez rozwiązany problem dla mnie.

import * as lib from 'lib'; 

jest odpowiednikiem:

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

Jeżeli * jest podobna do zamiennika, który importuje wszystkie export var od lib.

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

Alternatywnie, przy użyciu:

import lib from 'lib'; 

Pozwala na dostęp tylko do domyślnego wywóz:

// lib.js 
export default storage; 

Korzystanie {} również importuje tylko konkretne składniki z modułem which reduces the footprint with bundlers like Webpack.

While:

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

by zaimportować wszystkie moduły w tym export default storage;

odpowiedzi Zobacz Dan Abramov za: When should I use curly braces for ES6 import?

+0

Tylko że nie ma 'import {...} as ... z ...' składni – Bergi

+0

obróbce. Masz rację, nie ma operatora rozprzestrzeniania dla {...}, zamiast tego powinienem użyć etc. – tgrrr

+0

(Oczywiście nie ma składni rozłożenia/odpoczynku, ponieważ nie jest to dosłowne/destrukturyzacja obiektu). Nadal nie ma składni "{...} as ..." w imporcie, więc "* jest takie samo jak *" jest bez znaczenia. (Nie sądzę, że miałeś na myśli "* powoduje taki sam błąd składni jak *") – Bergi

0

import X from Y; jest cukrem składnia.

import lib from 'lib';

jest równa

import {default as lib } from 'lib';

Powiązane problemy