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目录的。


推荐文章