本文主要讨论一些Node.js开发的最佳实践和建议,这些建议不仅适用于开发者,也适用于管理和维护Node的人。js基础设施人员。遵循本文提供的建议可以让您的日常开发工作变得更好。使用ES20152015年夏天,ES2015(即ES6)最终稿正式发布。该版本为JavaScript语言增加了大量新的语言特性,主要包括:箭头函数、模板字符串、rest运算符、参数传播生成器、promisesmaps、setsymbols等诸多特性。如需更完整的新功能列表,您可以阅读KyleSimpson的ES6andBeyond。其中大部分已添加到Node.jsv4中。在客户端,您还可以在Babel的帮助下使用ES6的所有新功能,Babel是一个JavaScript转译器。目前在服务端,我们倾向于只使用最新稳定版本新增的特性,这样就不需要转译代码,避免了那些让我们头疼的潜在问题。有关Node.js中ES6的更多信息,您可以访问官方网站:https://nodejs.org/en/docs/es6/-第一个回调接口。但是随着生成器函数的正式标准化和异步函数的出现,我们现在建议您编写模块接口,以公开Promise感知的错误优先回调。为什么这是必要的?首先,回调接口是为了提供向后兼容性。为了以后获得更好的兼容性,需要同时提供Promise的支持。您可以参考以下示例进一步了解如何编程。在此示例中,readPackage函数读取package.json文件并通过Promise和回调接口返回其内容。constfs=require('fs');functionreadPackage(callback){//asofnowwedonothavedefaultvaluesinNode.jscallback=callback||function(){}returnnewPromise((resolve,reject)=>{fs.readFile('./package.json',(err,data)=>{if(err){reject(err);returncallback(err);}resolve(data);returncallback(null,data);})})}module.exports.readPackage=readPackage;异步模式在Node.js中,很长一段时间您只有两种方法来管理异步流:回调或流。对于回调函数,您可以使用像async这样的库。streams可以选择through、bl、highland等库。但是随着Promise、generator、异步函数等逐渐被引入标准的ECMAScript,JS中的流程控制也有了很大的提升。关于异步JavaScript的发展历程,可以参考这篇关于异步JavaScript发展的博文。错误处理错误处理在应用程序开发过程中起着至关重要的作用:确定应用程序何时崩溃,或简单地打印一条错误消息,并确保应用程序继续运行可能很困难。为了更简单的解释这个问题,我们决定将其分为两种:程序员错误和操作错误。程序员错误就是我们所说的bug,因为你不知道程序执行的确切状态,所以当错误发生时,你必须立即停止应用程序的运行(使进程崩溃)。另一方面,操作错误是由系统或远程服务本身引起的问题。比如:请求超时,内存不足等。可以根据错误的特点,对症下药,重试。比如文件丢失了,可以创建对应的文件。回调中的错误处理如果在异步操作期间发生错误,则应将错误对象作为异步函数的第一个参数传递。您必须始终检查错误对象并进行错误处理。在前面的回调约定示例中,展示了如何在回调函数中确定错误的优先级。Promise中的错误处理以下代码片段会发生什么情况?Promise.resolve(()=>'John').then(()=>{thrownewError('ops');}).catch((ex)=>{console.log(ex);}).then(()=>{thrownewError('ups');console.log(Doe');})将在第3行抛出异常。catch将处理它并打印到标准输出:[Error:ops]Executioncontinuesandanewerror将在第9行抛出什么都没有-***抛出的错误将是无声的。你需要注意,你应该始终有一个catch语句作为承诺链的最后一个环节。这将为您省去很多麻烦。像这样:Promise.resolve(()=>'John').then(()=>{thrownewError('ops');}).catch((ex)=>{console.log(ex);}).then(()=>{thrownewError('ups');console.log(Doe');}).catch((ex)=>{console.log(ex);});现在会输出如下:[Error:ops][Error:ops]使用JavaScript标准风格在过去的几年里,我们会使用JSHint、JSCS、ESLint等非常有用的代码质量工具来尽可能地自动检查我们的代码.最近说到代码风格,我们使用ferossJavaScript标准风格。原因是它非常简单:您不需要任何配置文件,只需将其放入您的项目中即可。它主要包括以下规则:使用2个空格作为缩进字符串使用单引号——除非避免转义}函数名后跟空格函数名(args){...}总是用===代替==,但是可以用obj==null来检查null||undefined。总是处理Node的err函数参数.js的应该总是给浏览器全局变量添加window前缀,document和navigator除外。尽量避免使用open,length,evet,name等浏览器全局变量。当然,如果你的编辑器只支持ESLint的话,这里是一个使用标准风格的ESLint规则库,即eslint-plugin-standard,安装这个插件后,你的.eslintrc文件可以是这样的:{"plugins":["standard"],}12-FactorApplication(十二因素应用程序)如今,软件通常作为服务交付,称为Web应用程序或软件即服务(SaaS)。12-FactorApplicationManifesto描述了Web应用程序开发的最佳实践:基准代码:一个基准代码,多个部署依赖项:显示声明依赖项配置:在环境中存储配置后端服务:将后端服务视为附加资源构建、发布、运行:严格分离构建和运行进程:将应用程序作为一个或多个无状态进程运行端口绑定:通过端口绑定提供服务最大化健壮性开发环境等同于线上环境:保持开发、预发布和线上环境相同尽可能日志:把日志当作一个事件流管理进程:把后端管理任务当作一次性进程来运行这个理论适用于任何语言开发的应用程序和后端服务(数据库、消息队列、缓存等)。).开始一个新项目总是使用npminit命令开始一个新项目。这会为您的项目创建一个初始package.json。如果您想跳过最初的问题并直接进入默认配置,只需运行npminit--yes。监控您的应用当发生故障或即将发生故障时,它会及时通知您,可以挽救您的损失。对于应用程序监控,可以使用类似的SaaS产品或开源软件。在开源软件方面,主要包括:Zabbix、Collected、ElasticSearch和Logstash。如果不想自己部署,可以考虑使用在线服务。你可以试试Trace,这是我们公司开发的Node.js和微服务监控方案。使用构建系统尽可能地自动化一切。没有什么比让开发人员做grunt应该做的事情更无聊和恼人的了,这不仅浪费时间,而且毫无意义。现在JavaScript的这类工具非常丰富,有Grunt、Gulp、Webpack,你只需要知道几个就可以了。在RisingStack中,大部分新的前端开发项目使用Webpack来自动化构建,其他类型使用gulp来自动化任务。对于初学者来说,Webpack可能需要花费很多时间来理解,因此我强烈建议您阅读WebpackCookbook。使用最新的长期支持(LTS)版本的Node为了获得更好的稳定性和新特性,我们建议您使用最新的LTS(长期支持)版本的Node,即发布号为偶数的版本。当然,您也可以免费使用最新的实验版本,称为奇数发行版稳定版。如果您需要处理多个项目并使用不同的Node.js版本,建议您使用Node版本管理器-nvm。更多信息,您可以参考Node.js官方网站上的发布信息:WhatYouShouldKnowaboutNode.jsv5andMore每周更新您的项目依赖项养成每周更新一次项目依赖项的习惯。为此,您可以使用npmoutdated或ncu包。选择合适的数据库当我们谈论Node.js和数据库时,您可能首先想到的技术是MongoDB。当然,这没什么问题,但您不应该直接使用它。在这样做之前,您需要问自己和您的团队几个问题。包括以下内容:应用程序是否具有结构化数据?应用程序会进行事务处理吗?数据需要保存多长时间?也许您只需要Redis,或者如果您有结构化数据,则可能需要PostgrelSQL。如果你需要在Node.js中使用SQL,你可以看看knex。使用语义版本控制(SemanticVersioning)语义版本控制是一种正式的协议,为了兼容性使用一个三段的版本号,即:major.minor.patch,分别是majorversion,minorversion,和patch。如果它是一个不会向后兼容(backward-compatible)的API变更,则使用主版本号。添加新功能时使用次要版本号,并且API更改向后兼容。如果您只是修复错误,则可以使用包版本号。幸运的是,您可以使用语义发布模块自动发布JavaScript模块。继续阅读在JavaScript和Node.js的世界里,掌握最新的新闻和技术发展是一项挑战。为方便起见,请确保您订阅了以下内容:Node.js每周时事通讯微服务每周时事通讯ChangelogWeekly-OpenSourceNews
