在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';
是要求lib
的default
导出。 例如
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导入的花括号?