如何使用 SystemJS 加载命名导出
How to load named exports with SystemJS
如果我有一个库,说 utils.js
看起来像这样
exports.foo = function () {
return 'foo';
};
exports.bar = function () {
return 'bar';
};
可以如下使用
import {foo} from './libs/utils';
console.log(foo());
不是很壮观,但我感觉这个问题就是this post. Anyway I cannot get this to work in combination with 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
对象,而不是命名导出。这可以以某种方式解决吗?
UPDATE 我觉得它可以用 formats
修复
meta: {
'./libs/utils.js': {
format: 'cjs'
}
}
但到目前为止它给出了同样的问题
此行为不是 SystemJS 特定的。 SystemJS 从 0.20 版本开始就这样,因为这是 ES6 模块互操作性标准化的目标。
如您的问题,当您使用 ES6 import
导入 CommonJS 模块(通过 module.exports
导出)时,您将只能获得整个导出,而不能立即解构导出的名称.
但是,当您import
ing 模块通过 ES6 export
导出时,您将能够解构导出的名称。
所以,这一切都是设计使然。 Guy Bedford 在他的博客上写了这篇文章并引用了 NodeJS 正在进行的模块标准化:
... named exports will no longer be permitted when importing a
CommonJS module from an ES module, and is discussed at
https://github.com/nodejs/CTC/pull/60/files#diff-2b572743d67d8a47685ae4bcb9bec651R217.
That is, import { name } from 'cjs.js'
, where cjs.js
is a CommonJS
module will no longer be supported, and instead will require
import cjs from 'cjs.js'; cjs.name
.
使用 __esModule
:
的互操作解决方法
We will continue to support the __esModule
flag in interop though,
allowing lifting of named exports for these cases.
So if the cjs.js
module was written:
exports.__esModule = true;
exports.name = function () { ... }
then it would be possible to have import { name } from 'cjs.js';
, even
though cjs.js
is a CommonJS module, although this __esModule
will
eventually in the longer term be deprecated as well.
如果我有一个库,说 utils.js
看起来像这样
exports.foo = function () {
return 'foo';
};
exports.bar = function () {
return 'bar';
};
可以如下使用
import {foo} from './libs/utils';
console.log(foo());
不是很壮观,但我感觉这个问题就是this post. Anyway I cannot get this to work in combination with 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
对象,而不是命名导出。这可以以某种方式解决吗?
UPDATE 我觉得它可以用 formats
修复 meta: {
'./libs/utils.js': {
format: 'cjs'
}
}
但到目前为止它给出了同样的问题
此行为不是 SystemJS 特定的。 SystemJS 从 0.20 版本开始就这样,因为这是 ES6 模块互操作性标准化的目标。
如您的问题,当您使用 ES6 import
导入 CommonJS 模块(通过 module.exports
导出)时,您将只能获得整个导出,而不能立即解构导出的名称.
但是,当您import
ing 模块通过 ES6 export
导出时,您将能够解构导出的名称。
所以,这一切都是设计使然。 Guy Bedford 在他的博客上写了这篇文章并引用了 NodeJS 正在进行的模块标准化:
... named exports will no longer be permitted when importing a CommonJS module from an ES module, and is discussed at https://github.com/nodejs/CTC/pull/60/files#diff-2b572743d67d8a47685ae4bcb9bec651R217.
That is,
import { name } from 'cjs.js'
, wherecjs.js
is a CommonJS module will no longer be supported, and instead will requireimport cjs from 'cjs.js'; cjs.name
.
使用 __esModule
:
We will continue to support the
__esModule
flag in interop though, allowing lifting of named exports for these cases.So if the
cjs.js
module was written:exports.__esModule = true; exports.name = function () { ... }
then it would be possible to have
import { name } from 'cjs.js';
, even thoughcjs.js
is a CommonJS module, although this__esModule
will eventually in the longer term be deprecated as well.