ES2015 `import * as` 与 just plain `import` 之间的区别
Difference between ES2015 `import * as` vs just plain `import`
我刚刚通过将 import * as CodeMirror
更改为普通 import CodeMirror
来修复了一个错误。
- 我复制了this code。 (从 TypeScript 移植)
import * as CodeMirror
一直有效,直到由于其副作用而导入了插件:预期的新 fold
属性 未定义。
问题:(我试图更好地理解发生了什么)
- 这是怎么回事?此更改如何修复错误?
- 谁在将
default
属性 添加到 CodeMirror? (或者更有可能:将模块包装在另一个看起来非常相似的对象中)最有可能的嫌疑人:
- JavaScript 模块 (ES2015)
- 通天塔
- Webpack
- CoffeeScript
- 代码镜像
- 是否有更好的方法来实现我想要实现的目标?
更多详情:
此代码未按预期工作:
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.default
和 something.helloWorld
.
我刚刚通过将 import * as CodeMirror
更改为普通 import CodeMirror
来修复了一个错误。
- 我复制了this code。 (从 TypeScript 移植)
import * as CodeMirror
一直有效,直到由于其副作用而导入了插件:预期的新fold
属性 未定义。
问题:(我试图更好地理解发生了什么)
- 这是怎么回事?此更改如何修复错误?
- 谁在将
default
属性 添加到 CodeMirror? (或者更有可能:将模块包装在另一个看起来非常相似的对象中)最有可能的嫌疑人:- JavaScript 模块 (ES2015)
- 通天塔
- Webpack
- CoffeeScript
- 代码镜像
- 是否有更好的方法来实现我想要实现的目标?
更多详情:
此代码未按预期工作:
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.default
和 something.helloWorld
.