在node.js(ES6 / Babel)中inputX和input*之间的区别是X?

我有一个在ES6(用Babel编译)编写的node.js库lib ,我在其中导出以下子模块:

 "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方法是不是应该等同? 如果不是,我有什么不同?

 import * as lib from 'lib'; 

正在请求一个具有所有命名的“lib”输出的对象。

 export var config = _config; export var db = _db; export var storage = _storage; 

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

 import lib from 'lib'; 

是要求libdefault导出。 例如

 export default 4; 

会使lib === 4 。 它不会获取指定的导出。 要从默认导出中获取对象,您必须明确地执行此操作

 export default { config: _config, db: _db, storage: _storage }; 

只需添加到Logan的解决scheme,因为了解导入括号*,并没有解决我的问题。

 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; 

使用{}也只能从模块导入特定的组件, 这样可以减less像Webpack这样的捆绑软件的占用空间。

而:

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

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

请参阅Dan Abramov的回答: 何时使用ES6导入的花括号?