在node.js(ES6 / Babel)中导入X和将 * 作为X导入之间的区别?

lymnna71  于 2022-12-08  发布在  Babel
关注(0)|答案(3)|浏览(156)

我有一个用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
有人能解释一下这里发生了什么吗?这两个导入方法不应该是等价的吗?如果不是,我错过了什么区别?

mjqavswn

mjqavswn1#

import * as lib from 'lib';

正在要求具有所有'lib'具名汇出的对象。

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

是命名的导出,这就是为什么最终会得到一个对象。

import lib from 'lib';

正在请求libdefault导出。
例如:

export default 4;

它不会提取命名的导出。要从默认导出中获取对象,您必须显式执行

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

u0sqgete2#

只是添加到Logan's解决方案,因为理解导入与括号,* 和没有为我解决了一个问题。

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;

使用{}也只能从模块which reduces the footprint with bundlers like Webpack.导入特定组件
同时:

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

将导入包括export default storage;在内的所有模块
请看丹·阿布拉莫夫的回答:When should I use curly braces for ES6 import?

nc1teljy

nc1teljy3#

import X from Y;是一种语法糖。
import lib from 'lib';
等于
import { default as lib } from 'lib';

相关问题