node.js (ES6 / Babel) 中 import X 和 import * as X 的区别?

Difference between import X and import * as X in node.js (ES6 / Babel)?

我有一个用 ES6 编写的 node.js 库 lib(用 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

有人可以解释这里发生了什么吗?这两种导入方法不应该是等价的吗?如果不是,我缺少什么区别?

import * as lib from 'lib';

正在请求一个包含 'lib'.

的所有命名导出的对象
export var config = _config;
export var db = _db;
export var storage = _storage;

被命名为 exports,这就是为什么你最终得到一个像你那样的对象。


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';

其中 * 类似于从 lib.

导入所有 export var 的通配符
export var config;
export var db;
export var storage;

或者,使用:

import lib from 'lib';

只允许您访问默认导出:

// lib.js
export default storage;

使用 {} 也仅从模块导入特定组件,

同时:

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

将导入所有模块,包括 export default storage;

查看 Dan Abramov 的回答:

import X from Y;是语法糖。

import lib from 'lib';

等于

import { default as lib } from 'lib';