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

新手上路,请多包涵

我有一个 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

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

原文由 left4bread 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 487
2 个回答
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
};

原文由 loganfsmyth 发布,翻译遵循 CC BY-SA 4.0 许可协议

只是添加到 Logan 的 解决方案中,因为理解带括号的导入,\* 而没有为我解决问题。

 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;

使用 {} 也只会从模块中导入特定组件, 从而减少 Webpack 等捆绑器的占用空间。

尽管:

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

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

请参阅 Dan Abramov 的回答: 我什么时候应该使用花括号导入 ES6?

原文由 tgrrr 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题