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