Разница между импортом 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';