ES2015 `import * as` 与 just plain `import` 之间的区别

Difference between ES2015 `import * as` vs just plain `import`

我刚刚通过将 import * as CodeMirror 更改为普通 import CodeMirror 来修复了一个错误。

问题:(我试图更好地理解发生了什么)


更多详情:

此代码未按预期工作:

import * as CodeMirror from 'codemirror'
import 'codemirror/addon/fold/indent-fold.js'  # should add `fold` object to `CodeMirror`

console.log typeof CodeMirror          ## 'object'
console.log typeof CodeMirror.fold     ## 'undefined'
console.log typeof CodeMirror.default  ## 'function'  

## Work-around:
console.log typeof CodeMirror.default.fold  ## 'object'

此代码按预期工作:

import CodeMirror from 'codemirror'
import 'codemirror/addon/fold/indent-fold.js'  # should add `fold` object to `CodeMirror`

console.log typeof CodeMirror          ## 'function'
console.log typeof CodeMirror.fold     ## 'object'
console.log typeof CodeMirror.default  ## 'undefined'

我已经研究过这些资源,但它们并没有帮助我完全理解发生了什么:

import * as CodeMirror from 'codemirror' 导入所有 命名导出 并将它们命名空间到一个名为 CodeMirror.

的对象中

import CodeMirror from 'codemirror' 导入 默认导出

假设您有一个名为 'test-module' 的非常简单的模块,其中包含:

var test = 'test';
export default test;
export function helloWorld () { ... };

当你这样做时:

import something from 'test-module';

您只导入了 'some-module' 的默认导出。在本例中,它是字符串测试。默认导出可以是任何东西,对象,函数等

当你这样做时:

import {helloWorld} from 'test-module';

您专门导入了一个名为 'helloWorld' 的 'test-module' 成员,而不是默认导出。在本例中,它是函数 'helloWorld'.

如果你这样做了:

import {something} from 'test-module';

'something' 将是 'undefined',因为没有使用该名称的导出。

import * as something from 'test-module';

正在请求一个包含 'test-module'.

的所有命名导出的对象

然后您可以以 something.name 访问 'test-module' 中的任何导出。在这种情况下,它们将是 something.defaultsomething.helloWorld.