it-swarm.com.ru

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

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

26
left4bread
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
};
44
loganfsmyth

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

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?

5
tgrrr

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

import lib from 'lib';

равно

import {default as lib } from 'lib';

0
foxiris