ES6: "import * as alias"与"import alias"有何不同?

41

在这两种方式中,有什么不同吗?

import utils from 'utils'

import * as utils from 'utils'

对于情况 A:

//utils.js
export function doSomething()
{
//...
}

情况B:

//utils.js
export function doSomething()
{
//...
}
export default function doSomethingDefault()
{
//...
}

更新:

我被vscode的智能感知功能误导了,但是按照建议,在node+babel上进行了小测试,结果显示出了差异:

//index.js
import utilsCaseA from './utils1'
import * as utilsCaseAWildcard from './utils1'
var utilsCaseARequire = require('./utils1')

import utilsCaseB from './utils2'
import * as utilsCaseBWildcard from './utils2'
var utilsCaseBRequire = require('./utils2')

var compareObjects = 
{
    utilsCaseA, utilsCaseAWildcard, utilsCaseARequire,utilsCaseB,utilsCaseBWildcard,utilsCaseBRequire
};
console.log(compareObjects);

在此输入图片描述


当然可以。只需尝试 console.log(utils) 即可看到区别。 - Bergi
我刚刚修改了我的问题,请看一下。对于“情况A”,我没有看到任何区别。我有什么遗漏吗? - Philipp Munin
看看 utils 是什么样子。是的,有所不同! - Bergi
1
你说得对,Case A 的默认导入未定义。我被 vscode 的智能感知误导了。谢谢! - Philipp Munin
2个回答

40

根据您的例子:

情况A:

//utils.js
export function doSomething()
{
//...
}

案例B:

//utils.js
export function doSomething()
{
//...
}
export default function doSomethingDefault()
{
//...
}

结果:

import utils from 'utils'
utils() // (Case A: undefined, Case B: doSomethingDefault)

import * as utils from 'utils'
utils // (Case A: utils = { doSomething: function }, Case B: utils = { doSomething: function, default: function })

import { doSomething } from 'utils'
doSomething() // (both Case A and Case B: doSomething = doSomething)
在Case A和Case B之间的区别在于,在Case A中import utils from 'utils',因为没有默认导出,utils将会是undefined。而在Case B中,utils将指代doSomethingDefault。当使用import * as utils from 'utils'时,在Case A中,utils将有一个方法(doSomething),而在Case B中,utils将有两个方法(doSomethingdefault)。

我们应该使用export default吗?因为它可以在创建库时替代我们的默认模块。 - Bippan Kumar

18

import utils from 'utils' 导入了 'utils' 包的默认对象。undefined 在提供的情况下。

import * as utils from 'utils' 导入了整个模块 exports 对象,包括默认导出和所有可用的命名导出。


我刚刚修改了我的问题,请看一下。对于“情况A”,我没有看到任何区别。我有什么遗漏吗? - Philipp Munin
@PhilippMunin 如果你在两种情况下都记录 utils,你会看到它们之间的差异。 - Yury Tarabanko
谢谢。如果您不介意,我将标记inostia的回复作为答案 - 这样他会更加受鼓舞。 - Philipp Munin
@PhilippMunin 当然。在编辑后,他的回答更为相关。 - Yury Tarabanko
1
@PhilippMunin:我认为这个答案更简洁明了。 - Dan Dascalescu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接