如何使用SystemJS加载命名导出

时间:2017-02-23 10:24:53

标签: javascript ecmascript-6 babeljs systemjs node-modules

如果我有一个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'
    }
}

但到目前为止它给出了同样的问题

1 个答案:

答案 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会   最终在长期内也会被弃用。