Node本身已经支持了一些ES6语法,但是importexport,还有asyncawait(Node8已经支持)等一些语法,我们还是不能用。为了使用这些新特性,我们需要使用babel将ES6转ES5的语法安装babelnpminstallbabel-cli-g基础知识babel的配置文件是.babelrc{"presets":[]}新建demo文件夹,文件夹下新建1.jsconstarr=[1,2,3];arr.map(item=>item+1);并新建一个.babelrc配置文件{"presets":[]}在??终端运行babel1.js-odist.js可以看到文件夹下新建了一个dist.js,就是后面的文件巴贝尔转码。不过dist.js目前并没有变,因为我们在配置文件中没有声明转码规则,所以babel无法转码,安装转码插件npminstall--save-devbabel-preset-es2015babel-preset-stage-0修改配置文件{"presets":["es2015","stage-0"]}es2015可以转码es2015的语法规则,stage-0可以转码ES7语法(比如asyncawait)并运行终端babel1.js-odist.js再次查看箭头函数转码vararr=[1,2,3];arr.map(function(item){returnitem+1;});让我们试试asyncawaitasyncfunctionstart(){constdata=awaittest();console.log(data);}functiontest(){returnnewPromise((resolve,reject)=>{resolve('ok');})}转码文件'usestrict';varstart=function(){var_ref=_asyncToGenerator(/*#__PURE__*/regeneratorRuntime.mark(function_callee(){变量数据;returnregeneratorRuntime.wrap(function_callee$(_context){while(1){switch(_context.prev=_context.next){case0:_context.next=2;returntest();case2:data=_context.sent;console.log(data);case4:case'end':return_context.stop();}}},_callee,this);}));returnfunctionstart(){return_ref.apply(this,arguments);}};}();function_asyncToGenerator(fn){returnfunction(){vargen=fn.apply(this,arguments);returnnewPromise(function(resolve,reject){functionstep(key,arg){try{varinfo=gen[key](arg);varvalue=info.value;}catch(error){拒绝(错误);返回;}如果(信息完成){解决(值);}其他{返回承诺。resolve(value).then(function(value){step("next",value);},function(err){step("throw",错误);});}}返回步骤(“下一步”);});};}functiontest(){returnnewPromise(function(resolve,reject){resolve('ok');});}再试一次importexportutil.jsexportdefaultfunctionsay(){console.log('2333');}1.jsimportsayfrom'./util';say();这次要同时转码1.js和util.js,我们可以转码整个文件夹babeldemo-ddist在新生成的dist文件夹下,有转码后的文件可以看到转码后,仍然使用module.exportscommonjs模块加载babel-preset-env上面的转码。其实上面的转码有一个缺陷,就是babel默认会把所有的代码都转成es5,也就是说即使node支持let关键字,转码后也会转成var。我们可以使用babel-preset-env插件,它会自动检测当前node版本,只转码node不支持的语法。很方便npminstall--save-devbabel-preset-env.babelrc{"presets":[["env",{"targets":{"node":"current"}}]]}1.jsclassF{say(){}}consta=1;babel1.js-odist.js编译完成后,"usestrict";classF{say(){}}consta=1;可以看到,class和const没有转码,因为当前node版本(8.9.3)支持这种语法。在实际项目中使用ES6语法,Koa2需要Nodev7.6.0或以上版本支持异步语法。同时,我们还想在Koa2中使用import模块编写npminstall--save-devbabel-registerpminstallkoa--save新建一个文件夹apputil.jsexportfunctiongetMessage(){returnnewPromise((resolve,reject)=>{resolve('HelloWorld!');})}app.jsimportKoafrom'koa';import{getMessage}from'./util'constapp=newKoa();app.use(asyncctx=>{constdata=awaitgetMessage();ctx.body=data;});app.listen(3000);如果直接启动该文件肯定会报错nodeapp。我们需要一个入口文件来转码index.jsrequire("babel-register");require("./app.js");nodeindex可以访问http://localhost:3000/查看页面!babel-register是实时转码的,所以在实际发布的时候要先对整个app文件夹进行转码babelapp-ddist这个时候只要启动dist节点下的app.jsapp
