电子书推荐BecomeaninjawithAngularWebDevelopmentwithNodeandExpress,2ndEditionBuildingServer-sideandMicroserviceswithGo:BuildingModernBackendsandMicroservicesUsingGo,DockerandKubernetesAIforSportsBasicLinux终端提示和技巧:学习在命令行上快速工作人工智能金融:基于Python的指南使用Python和Qt5创建简单的GUI应用程序实践中的分布式跟踪:检测、分析和调试微服务[C编程:学习编码](http://www.iebukes.com/c-prog...)EffectivePython:90SpecificWaystoWriteBetterPython,2ndEdition[]()[]()使用Babel来使用实验性的JavaScript特性Babel转译器(Transpiler)是使用最新的JavaScript特性或尝试新的JavaScript特性的领先工具。由于您可能从未见过转译器这个词,它意味着将源代码从一种语言重写为另一种语言。它就像一个编译器,Babel将计算机源代码转换成另一种形式,但Babel生成的不是直接可执行的机器代码,而是JavaScript。也就是说,它将JavaScript代码转换为JavaScript代码,在您意识到Babel的输出可以针对较旧的JavaScript版本之前,这似乎不是很有用。更简单地说,Babel可以配置为将使用ES2015、ES2016、ES2017(等)特性的代码重写为符合ES5的JavaScript代码。由于ES5JavaScript兼容旧计算机上的所有Web浏览器,因此开发人员可以使用现代JavaScript编写前端代码,然后使用Babel将其转换为在旧浏览器上执行ES5JavaScript代码。要了解有关Babel的更多信息,请访问https://babeljs.io/。NodeGreen网站明确指出,Node.js支持几乎所有的ES2015、2016和2017特性。所以,事实上,我们不再需要在我们的Node.js项目中使用Babel。你可能需要支持旧的Node.js版本,你可以使用Babel来实现这一点。对于网络浏览器来说,支持ECMAScript的最新特性还需要很长时间。这并不是说网络浏览器制造商采用新功能的速度很慢,因为Google、Mozilla和Microsoft团队都在积极采用最新功能。不幸的是,Apple的Safari团队在采用新功能方面似乎进展缓慢。然而,更慢的是用户更新浏览器的速度。因此,现代JavaScript程序员需要熟悉Babel。我们没有准备好示例代码来演示这些功能,但我们可以仔细查看Babel工具设置。有关安装文档的更多信息,请访问http://babeljs.io/docs/setup/并单击CLI按钮。为了简要介绍Babel,我们将使用它来转换我们之前看到的脚本以在Node.js6.x上运行。在这些脚本中,我们使用了Node.js6.x不支持的异步函数。在命令框中打开ls.js和ls2.js目录,输入以下命令:$npminstallbabel-cli\babel-plugin-transform-es2015-modules-commonjs\babel-plugin-transform-async-to-生成器命令将安装Babel软件以及几个转换插件。Babel有一个插件系统,您可以在其中启用项目所需的转译器。我们在此示例中的主要目标是将前面显示的异步函数转换为生成器函数。生成器是ES2015引入的新功能,为实现异步功能奠定了基础。由于Node.js6.x既没有fs.promises函数也没有util.promisify函数,我们需要做一些替换来创建一个名为ls2-old-school.js的文件:constfs=require('fs');constfs_readdir=dir=>{returnnewPromise((resolve,reject)=>{fs.readdir(dir,(err,fileList)=>{if(err)reject(err);elseresolve(fileList);});});};异步函数listFiles(){try{letdir='.';如果(process.argv[2])dir=process.argv[2];constfiles=awaitfs_readdir(dir);for(letfnoffiles){console.log(fn);}}catch(err){console.error(err);}}列表文件();我们有与之前看到的相同示例,但有一些更改。fs_readdir函数创建一个Promise对象,然后调用fs.readdir以确保根据获得的结果拒绝或解决Promise。这或多或少是util.promisify函数所做的。因为fs_readdir返回一个承诺,wait关键字可以做正确的事情并等待请求成功或失败。此代码应在支持异步功能的Node.js版本上按原样运行。但令我们感兴趣的是,我们添加了fs_readdir函数,因为它在旧Node.js版本上的工作方式。fs_readdir中使用的模式是在异步函数的上下文中使用面向回调的函数所需的模式。接下来,创建一个名为.babelrc的文件,内容如下:{"plugins":["transform-es2015-modules-commonjs","transform-async-to-generator"]}这个文件指示Babel使用我们之前安装的A命名转换插件。顾名思义,它将一个异步函数变成了一个生成器函数。由于我们安装了babelcli,因此安装了一个babel命令,以便我们可以键入以下内容:$./node_modules/.bin/babel-help要转换代码,请运行以下命令:$./node_modules/.bin/babells2-old-school.js-ols2-babel.js此命令传输命名文件,生成新文件ls2-babel.js。新文件如下所示:“使用严格”;函数_asyncToGenerator(fn){返回函数(){vargen=fn.apply(this,arguments);returnnewPromise(function(resolve,reject){functionstep(key,arg){try{varinfo=gen[key](arg);varvalue=info.value;}catch(error){拒绝(错误);return;}if(info.done){resolve(value);}else{returnPromise.resolve(value).then(function(value){step("next",value);},function(err){步骤("throw",err);});}}returnstep("next");});};}constfs=require('fs');constfs_readdir=dir=>{returnnewPromise((resolve,reject)=>{fs.readdir(dir,(err,fileList)=>{if(err)reject(err);elseresolve(fileList);});});};_asyncToGenerator(function*(){vardir='.';if(process.argv[2])dir=process.argv[2];constfiles=yieldfs_readdir(dir);for(letfnoffiles){console.log(fn);}})().catch(err=>{console.error(err);});这段代码不容易让人阅读。相反,它意味着编辑原始源文件,然后将其转换为目标JavaScript引擎。主要需要注意的是,传输的代码使用了生成器函数(表示函数*表示生成器函数)而不是异步函数,并且使用了yield关键字而不是wait关键字。生成器函数是什么以及yield关键字的确切作用并不重要;唯一需要注意的是yield大致相当于wait,而_asyncToGenerator函数实现了类似于异步函数的东西。否则,传输的代码相当干净,看起来与原始代码非常相似。传输的脚本运行如下:$nvmuse4Nowusingnodev4.9.1(npmv2.15.11)$node--versionv4.9.1$nodels2-babel.babelrcapp.jsls.jsls2-babel.jsls2-old-school.jsls2.jsnode_modules换句话说,它与异步版本运行相同,但在较旧的Node.js版本上运行。使用类似的过程,您可以转换使用现代ES2015(以及其他)结构编写的代码,以便它可以在旧的Web浏览器中运行。在本节中,我们了解了JavaScript语言的进步,特别是异步函数,以及如何在旧版Node.js或旧版Web浏览器中将这些功能与Babel一起使用。总结在本章中,您学到了很多关于安装Node.js和使用Node.js的命令行工具运行Node.js服务器的知识。我们还轻松地介绍了很多细节,我将在本书后面介绍这些细节,所以请多多包涵。具体来说,我们介绍了下载和编译Node.js源代码、在您的主目录中安装用于开发或在系统目录中部署的Node.js,以及安装npm(Node.js使用的事实上的标准包管理设备)。我们还看到了如何运行Node.js脚本或Node.js服务器。然后我们查看了ES2015、2016和2017中的新功能。最后,我们查看了如何使用Babel在代码中实现这些功能。现在我们已经了解了如何设置我们的开发环境,我们已经准备好开始使用Node.js实现应用程序。第一步是学习Node.js应用程序和模块的基本构建块,这意味着仔细研究Node.js模块、如何使用它们以及如何使用npm管理应用程序依赖项。我们将在下一章介绍所有这些内容。
