首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用SystemJS加载命名导出

如何用SystemJS加载命名导出
EN

Stack Overflow用户
提问于 2017-02-23 10:24:52
回答 1查看 1.4K关注 0票数 3

如果我有一个库,比如utils.js,如下所示

代码语言:javascript
复制
exports.foo = function () {
    return 'foo';
};

exports.bar = function () {
    return 'bar';
};

如下所示:

代码语言:javascript
复制
import {foo} from './libs/utils';

console.log(foo());

不是很壮观,但我觉得这个问题是文章中描述的问题的根源。无论如何,我不能让它与SystemJS一起工作。我必须修改代码才能修复它

代码语言:javascript
复制
import utils from './libs/utils';

console.log(utils.foo());

下面是我的systemjs文件:

代码语言:javascript
复制
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对象,而不能加载命名的导出。这件事能解决吗?

更新I给人的印象是它可以用格式修复

代码语言:javascript
复制
    meta: {
    './libs/utils.js': {
        format: 'cjs'
    }
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-04 06:59:03

此行为不是SystemJS特有的。自0.20版本以来,SystemJS的行为就像这样,因为这是ES6模块互操作性标准化的标准。

当您正在使用CommonJS import导入module.exports模块(通过ES6 import导出)时,您将只获得整个导出,并且无法立即对导出的名称进行重构。

但是,当您是通过import export导出的ES6 ing模块时,您将能够对导出的名称进行重构。

所以,这都是故意的。盖伊·贝德福德( Guy )在他的博客上写道,他提到了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 =函数() {.} 这样就有可能拥有import { name } from 'cjs.js';,尽管cjs.js是一个CommonJS模块,尽管这个__esModule最终也会被废弃。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42412965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档