2015-07-13 3 views
11

У меня есть node.js библиотека lib написана в ES6 (скомпилирован с Babel), в котором я экспортировать следующие подмодули:Разница между импортом X и импортом * как X в 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; 

Если от моего основного проекта я включил библиотеку как этот

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

Я вижу правильный выход и работает как ожидалось { config: ... }. Однако, если я пытаюсь включить библиотеку так:

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

будет undefined.

Может кто-нибудь объяснить, что здесь происходит? Не эквивалентны ли эти два метода импорта? Если нет, то какая разница, я не хватает?

ответ

24
import * as lib from 'lib'; 

просит объект со всем указанным экспортом 'lib'.

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

назван экспорт, поэтому вы получаете такой объект, как вы.

import lib from 'lib'; 

просит для default экспорта lib. например

export default 4; 

сделает lib === 4. Он не получает именованный экспорт. Для того, чтобы получить объект от экспорта по умолчанию, вы должны явно сделать

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

Просто добавив к Logan's решения, потому что понимание импорта со скобками, * и без решить проблему для меня.

import * as lib from 'lib'; 

является эквивалентом:

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

Если * похож на групповой символ, который импортирует все export var из Lib.

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

В качестве альтернативы, с помощью:

import lib from 'lib'; 

Позволяет получить доступ только экспорт по умолчанию:

// lib.js 
export default storage; 

Использование {} также импортирует только определенные компоненты из модуля, which reduces the footprint with bundlers like Webpack.

Пока:

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

будет импортировать все модули, в том числе export default storage;

ответ знакомства Dan Абрамова: When should I use curly braces for ES6 import?

+0

только что нет 'импорта {...} ... от ...' синтаксиса – Bergi

+0

отредактирована. Вы правы, нет оператора распространения для {...}, я должен был использовать и т. Д. Вместо этого. – tgrrr

+0

(Разумеется, синтаксиса с распространением/отдыхом не существует, поскольку это не объект литерала/деструктурирования). Тем не менее в импорте нет синтаксиса '{...} as ...', поэтому «* совпадает с *» не имеет смысла. (Я не думаю, что вы имели в виду "* производит ту же синтаксическую ошибку, что и" ") – Bergi

0

import X from Y; является синтаксисом.

import lib from 'lib';

равно

import {default as lib } from 'lib';