如果我有一个lib,请说utils.js
看起来像这样
exports.foo = function () {
return 'foo';
};
exports.bar = function () {
return 'bar';
};
可以使用如下
import {foo} from './libs/utils';
console.log(foo());
不是很壮观,但我觉得这个问题是this帖子中描述的问题的根源。无论如何,我无法与SystemJS结合使用。我必须更改代码来修复它
import utils from './libs/utils';
console.log(utils.foo());
这是我的systemjs-config文件:
SystemJS.config({
map: {
'plugin-babel': 'node_modules/systemjs-plugin-babel/plugin-babel.js',
'systemjs-babel-build': 'node_modules/systemjs-plugin-babel/systemjs-babel-browser.js',
},
packages: {
'.': {
defaultJSExtensions: 'js'
}
},
transpiler: 'plugin-babel'
});
因此,似乎只能加载exports
对象而不是命名导出。这可以以某种方式修复?
更新我得到了可以通过formats修复的印象
meta: {
'./libs/utils.js': {
format: 'cjs'
}
}
但到目前为止它给出了同样的问题
答案 0 :(得分:3)
此行为不是SystemJS特有的。 SystemJS从版本0.20开始就像这样,因为这是ES6模块互操作性正在标准化的。
当您在问题中使用ES6 module.exports
导入CommonJS模块(通过import
导出)时,您将只获得整个导出,并且无法立即对导出的名称进行解构。 / p>
但是,当您import
通过ES6 export
导出的模块时,您将能够对导出的名称进行解构。
所以,这完全是设计的。 Guy Bedford在他的博客上写了这篇文章,并引用了NodeJS正在进行的模块标准化:
...导入时不再允许使用命名导出 来自ES模块的CommonJS模块,将在下面讨论 https://github.com/nodejs/CTC/pull/60/files#diff-2b572743d67d8a47685ae4bcb9bec651R217
即
import { name } from 'cjs.js'
,其中cjs.js
是CommonJS 将不再支持模块,而是需要import cjs from 'cjs.js'; cjs.name
。
使用__esModule
:
我们将继续支持互操作中的
__esModule
标志, 允许解除这些案件的指定出口。所以如果写了
cjs.js
模块:exports.__esModule = true; exports.name = function () { ... }
那么即使是
import { name } from 'cjs.js';
也是可能的 虽然cjs.js
是一个CommonJS模块,但这个__esModule
会 最终在长期内也会被弃用。