Разница между импортом 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
.
Может кто-нибудь объяснить, что здесь происходит? Не эквивалентны ли эти два метода импорта? Если нет, то какую разницу я не вижу?
Ответы
Ответ 1
import * as lib from 'lib';
запрашивает объект со всем указанным экспортом 'lib'.
export var config = _config;
export var db = _db;
export var storage = _storage;
называются export, поэтому вы получаете такой объект, как вы.
import lib from 'lib';
запрашивает экспорт default
экспорта lib
. например.
export default 4;
сделает lib === 4
. Он не получает именованный экспорт. Чтобы получить объект из экспорта по умолчанию, вам придется явно делать
export default {
config: _config,
db: _db,
storage: _storage
};
Ответ 2
Просто добавив в решение Logan, потому что понимаем импорт с помощью скобок * и не решая проблему для меня.
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;
Использование {} также импортирует только определенные компоненты из модуля, который уменьшает площадь с помощью таких устройств, как Webpack.
В то время как:
import storage, { config, db } from './lib'
будет импортировать все модули, включая export default storage;
См. ответ Дэн Абрамов:
Когда следует использовать фигурные скобки для импорта ES6?
Ответ 3
import X from Y;
представляет собой синтаксический сахар.
import lib from 'lib';
равно
import {default as lib } from 'lib';