babel6 升級總結
隨著越來越多的庫升級至 babel6,將項目升級至 babel6 迫在眉睫。在這里總結將 poiop 升級至 babel6 的過程中遇到的問題,供大家參考。
babel 分離為多個包
preset 機制
babel6 默認不再默認支持 es2015 以及 react。 需要手動在 .babelrc 中添加presets。
{ "presets": ["es2015", "react"] }
preset 是需要從 npm 中安裝的。
npm install babel-preset-es2015 babel-preset-react --save-dev
stage 不再是配置項,以 presets 的形式添加。
npm install babel-preset-stage-0 --save-dev
export default 編譯結果變化
源碼
import a from 'a'; export default a;
babel5編譯后的結果
'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 的編譯結果發生了變化,少了這句代碼 exports['default'] = _a2['default'] ,不再將結果放置在 module.exports 中。
因此 export default 的模塊不再能通過 require 來引用了,只能通過 import 引入。并且不能通過解構的形式來引入 export defaut 的模塊。
可能碰到的問題
require es6 模塊產生bug
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 正常運行了一段時間,沒有發現新的問題了。 歡迎大家補充~
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!