es6模块兼容实战
最近写了点es6的代码,这个小文算是对es6模块开发使用的一个小总结,并不涉及到es6的介绍
代码的开发环境中可能很好的支持es6,比如你用了iojs,但是在模块被别人使用的时候可能是nodejs v0.11.xx,这个时候模块的运行环境是没有es6支持的,解决这个问题可以在模块发布前做一次编译。
安装babel
npm install --save babel
如果使用了生成器(一般用es6的肯定会使用co啦),那还需要有babel-runtime
npm install --save babel-runtime
开发的时候用es6尽情的玩耍就行了,只需要在发布前进行编译,这样对开发者而言也不是什么负担,在package.json的scripts里增加
...
"scripts": {
"prepublish": "mkdirp es5; babel --optional runtime lib --out-dir es5"
}
...
上面是把整个lib目录里文件编译到es5目录,因为一般的入口文件都是直接引入lib的,我们还需要在入口文件里判断一下:
/* jshint evil:true */
/* global gen*/
function isSupportGenerator() {
try {
eval('var gen = function *(){}');
return gen.constructor.name === 'GeneratorFunction';
} catch (e) {
return false;
}
}
var _exports;
if (isSupportGenerator()) {
_exports = require('./lib');
} else {
_exports = require('./es5');
}
module.exports = _exports;
这个判断是否支持Generator的代码来自雪卒的代码
同时也不要忘记了在.gitignore
里加上es5,这些编译的代码我们是不需要在git里维护的。
最后,需要加上.npmignore
文件,因为如果没有这个文件的话,npm发布包的时候会按.gitignore
文件里的列表忽略目录,显然,发布出去的模块,我们是需要es5目录的。