Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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';