Разница между импортом X и импортом * как X в node.js (ES6 / Babel)?

У меня есть библиотека node.js lib написано в 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,

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

3 ответа

Решение
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
};

Просто добавляю к решению Логана, потому что понимание импорта в скобках * и без решения проблемы для меня.

import * as lib from 'lib';

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

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

Где * похож на шаблон, который импортирует все export var из библиотеки

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

В качестве альтернативы, используя:

import lib from 'lib';

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

// lib.js
export default storage;

Использование {} также импортирует только определенные компоненты из модуля, что сокращает использование таких пакетов, как Webpack.

В то время как:

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

импортирует все модули, включая export default storage;

См. Ответ Дана Абрамова: когда я должен использовать фигурные скобки для импорта ES6?

import X from Y; это синтаксис сахара.

import lib from 'lib';

равно

import {default as lib } from 'lib';

Другие вопросы по тегам