使用CommonJS模块汇总导出未命名的函数作为模块?

时间:2016-08-18 03:45:15

标签: javascript node.js ecmascript-6 commonjs rollupjs

我有一个名为inner.js的CommonJS模块,它定义了一个函数,然后将该函数导出为整个模块:

// inner.js, a legacy CommonJS module
var foo = function() { return 42; };
module.exports = foo;

在Node中,我可以很容易地验证它的工作原理。

> var inner = require('./inner.js');
> inner() // prints 42

但这是我想在ES6模块中使用的遗留模块,名为outer.js

// outer.js, an ES6 module
import * as inner from "./inner.js";
export function bar() { return inner(); }

我看到rollup-plugin-commonjs在这些情况下常用,但是当CommonJS inner.js模块将函数导出为整个模块时,我无法使用它。如果在运行汇总并将结果转储到loadme.js之后,我尝试运行加载ES6外部模块并尝试调用最初在内部CommonJS模块中定义的函数,我收到错误:

> var outer = require('./loadme.js')
undefined
> outer.bar()
TypeError: inner$2 is not a function
    at Object.bar (/.../so-rollup-question/loadme.js:27:25)

我认为我只是无法正确加载CommonJS模块,使模块本身作为一个函数运行。我对UMD不熟悉,无法通过检查汇总输出获得任何有意义的信息。

这篇文章的其余部分是关于最低限度的例子。

这是我非常简单的index.js

// index.js
export {bar} from "./outer.js";

由我的汇总配置读取:

// rollup.config.js
import npm from "rollup-plugin-node-resolve";
import commonjs from 'rollup-plugin-commonjs';

export default {
  entry : "index.js",
  format : "umd",
  moduleName : "sphereModule",
  plugins : [ npm({jsnext : true}), commonjs() ],
  dest : "loadme.js"
};

我有一个complete clonable repository来证明这个问题。

1 个答案:

答案 0 :(得分:3)

直接分配到module.exports基本上等同于具有默认导出。因此,按如下方式导入模块应该有效:

import inner from "./inner.js";