Babel 6更改了导出默认值的方式

时间:2015-11-03 17:57:36

标签: ecmascript-6 commonjs babeljs

之前,babel会添加第module.exports = exports["default"]行。它不再这样做了。在我能做之前,这意味着什么:

var foo = require('./foo');
// use foo

现在我必须这样做:

var foo = require('./foo').default;
// use foo

并不是什么大不了的事(而且我猜这是应该一直以来的)。 问题是我有很多代码依赖于以前的工作方式(我可以将大部分代码转换为ES6导入,但不是全部转换)。任何人都可以给我提示如何使旧的方式工作,而不必通过我的项目并解决这个问题(甚至一些关于如何编写codemod来执行此操作的指令将非常光滑)。

谢谢!

示例:

输入:

const foo = {}
export default foo

使用Babel 5输出

"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
var foo = {};
exports["default"] = foo;
module.exports = exports["default"];

使用Babel 6(和es2015插件)输出:

"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
var foo = {};
exports["default"] = foo;

请注意,输出中唯一的区别是module.exports = exports["default"]

修改

您可能对我在解决我的具体问题后撰写的博文感兴趣:Misunderstanding ES6 Modules, Upgrading Babel, Tears, and a Solution

4 个答案:

答案 0 :(得分:104)

如果你想要CommonJS导出行为,你需要直接使用CommonJS(或者在另一个答案中使用插件)。这种行为被删除了,因为它引起了混淆并导致无效的ES6语义,有些人依赖于这种语义。

export default {
  a: 'foo'
};

然后

import {a} from './foo';

这是无效的ES6,但由于您正在描述的CommonJS互操作性行为而起作用。不幸的是,支持这两种情况是不可能的,并且允许人们编写无效的ES6是一个比让你做.default更糟糕的问题。

另一个问题是,如果用户以后添加了一个命名导出,例如

,则会出现意外情况
export default 4;

然后

require('./mod');
// 4

export default 4;
export var foo = 5;

然后

require('./mod')
// {'default': 4, foo: 5}

答案 1 :(得分:89)

您还可以使用this plugin来恢复旧的export行为。

答案 2 :(得分:32)

对于图书馆作者,您可以解决此问题。

我通常有一个入口点index.js,这是我从package.json的主要字段指向的文件。除了重新导出lib的实际入口点之外,它什么也没做:

export { default } from "./components/MyComponent";

要解决babel问题,我将其更改为import语句,然后将默认值分配给module.exports

import MyComponent from "./components/MyComponent";
module.exports = MyComponent;

我的所有其他文件都保留为纯ES6模块,没有解决方法。所以只有入口点需要稍微改变:)

这适用于commonjs要求,也适用于ES6导入,因为babel似乎没有放弃反向互操作(commonjs - > es6)。 Babel注入以下函数来修补commonjs:

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 

我花了好几个小时与此作斗争,所以我希望这可以节省别人的努力!

答案 3 :(得分:1)

我遇到过这样的问题。这是我的解决方案:

// SRC / arithmetic.js

export var operations = {
  add: function (a, b) {
      return a + b;
  },

  subtract: function (a, b) {
      return a - b;
  }
};

// SRC / main.js

import { operations }  from './arithmetic';

let result = operations.add(1, 1);

console.log(result);