随着愈来愈多的库升级至 babel6,将项目升级至 babel6 迫在眉睫。在这里总结将 项目升级至 babel6 的过程当中遇到的问题,供你们参考。node
babel-cli 命令行
babel-core node api 以及 require hook
babel-polyfill 提供es2015的环境react
babel6 默认再也不默认支持 es2015 以及 react。 须要手动在 .babelrc 中添加presets。
所谓的 presets 其实就是一些同类plugin打包的结果,方便进行添加。es6
{ "presets": ["es2015", "react"] }
preset 是须要从 npm 中安装的。npm
npm install babel-preset-es2015 babel-preset-react --save-dev
stage 再也不是配置项,以 presets 的形式添加。api
npm install babel-preset-stage-0 --save-dev
源码babel
import a from 'a'; export default a;
babel5 编译后的结果ui
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _a = require('a'); var _a2 = _interopRequireDefault(_a); exports['default'] = _a2['default']; module.exports = exports['default'];
babel6 编译后的结果命令行
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _a = require('a'); var _a2 = _interopRequireDefault(_a); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } exports.default = _a2.default;
能够发现babel6
对 export default
的编译结果发生了变化,少了这句代码module.exports = exports['default'];
,再也不将结果放置在 module.exports
中。
所以 export default
的模块再也不能经过 require
来引用了,只能经过 import
引入。而且不能经过解构的形式来引入 export defaut
的模块。code
example对象
// 文件 a.js const a = 1; export default a; // 文件 b.js var a = require('./a.js');
编译后执行会产生 bug, 由于 a.default 才是须要的模块的对象。
能够经过如下方式来调用。
var a = require('module').default;
不管是 export default
仍是 moudle.exports
的模块都能经过 import
引入,所以仍是尽可能经过 import
来引入模块吧!
example
// 文件 a.js export default { a: 1, b: 2 } // 文件 b.js import { a, b } from 'a.js'
使用 babel6 进行编译后执行会报错, 缘由同上,导出的 object 实际上是放在 default 属性中的。
修改方法:
// 文件 a.js export const a = 1; // 导出变量 // 导出方法 export function b() { } // 文件 b.js import { a, b } from 'a.js'
或者
// 文件 a.js export default { a: 1, b: 2 } // 文件 b.js import obj from 'a.js'; const { a, b } = obj;
目前只发现了这些坑,目前项目已经迁移至 babel6
正常运行了一段时间,没有发现新的问题了。 欢迎你们补充~