导入X和导入*之间的差异为node.js中的X(ES6/Babel)?

lef*_*ead 29 javascript node.js ecmascript-6 babeljs

我有一个lib用ES6编写的node.js库(用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;
Run Code Online (Sandbox Code Playgroud)

如果从我的主项目中我包含这样的库

import * as lib from 'lib';
console.log(lib);
Run Code Online (Sandbox Code Playgroud)

我可以看到正确的输出,它按预期工作{ config: ... }.但是,如果我尝试像这样包含库:

import lib from 'lib';
console.log(lib);
Run Code Online (Sandbox Code Playgroud)

它会undefined.

有人能解释一下这里发生了什么吗?这两种导入方法不应该是等价的吗?如果没有,我错过了什么区别?

log*_*yth 50

import * as lib from 'lib';
Run Code Online (Sandbox Code Playgroud)

要求一个对象具有'lib'的所有命名导出.

export var config = _config;
export var db = _db;
export var storage = _storage;
Run Code Online (Sandbox Code Playgroud)

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

import lib from 'lib';
Run Code Online (Sandbox Code Playgroud)

是要求default出口lib.例如

export default 4;
Run Code Online (Sandbox Code Playgroud)

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

export default {
  config: _config,
  db: _db,
  storage: _storage
};
Run Code Online (Sandbox Code Playgroud)


tgr*_*rrr 7

只是添加到Logan的解决方案,因为用括号理解导入,*并没有为我解决问题.

import * as lib from 'lib';
Run Code Online (Sandbox Code Playgroud)

相当于:

import {config, db, storage} as lib from 'lib';
Run Code Online (Sandbox Code Playgroud)

其中*类似于导入所有export varlib 的通配符.

export var config;
export var db;
export var storage;
Run Code Online (Sandbox Code Playgroud)

或者,使用:

import lib from 'lib';
Run Code Online (Sandbox Code Playgroud)

允许您仅访问默认导出:

// lib.js
export default storage;
Run Code Online (Sandbox Code Playgroud)

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

而:

import storage, { config, db } from './lib'
Run Code Online (Sandbox Code Playgroud)

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

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

  • 只是没有 `import {...} as ... from ...` 语法 (2认同)