这篇文章给大家介绍如何成为一个更好的Node.js开发者,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
小编主要讨论一些进行Node.js开发的实践和建议,这些建议不仅仅适合开发者, 还适合那些管理与维护Node.js基础架构的工作人员。遵循本文提供的这些建议, 能够让你更好的进行日常的开发工作。
回调约定, 同时支持Promise
在去年,我们可能会推荐你为你的模块暴露错误优先的回调接口。但是随着生成器函数的正式标准化,并且异步函数也即将到来, 因此我们现在建议你在编写模块的接口时应该暴露支持Promise的的错误优先的回调函数。
为什么需要这样?首先回调接口是为了提供向后兼容性,为了能够在未来能够获得更好的兼容性,需要同时提供Promise支持。
你可以参考下面的例子来进一步的理解具体应该如何进行编程。在这个例子中readPackage函数读取了package.json文件, 并同时通过Promise和回调接口返回了它的内容。
const fs = require('fs'); function readPackage (callback) { // as of now we do not have default values in Node.js callback = callback || function () {} return new Promise((resolve, reject) => { fs.readFile('./package.json', (err, data) => { if (err) { reject(err); return callback(err); } resolve(data); return callback(null, data); }) }) } module.exports.readPackage = readPackage;
异步模式
在Node.js中,很长一段时间你只有两种方法来管理异步流:回调或者流(Stream)。对于回调函数而言, 你可以使用类似于async这类库, 对于流而言,有through、bl、highland等库可以选择。
但是随着Promise、生成器、异步函数等被逐渐引入进标准的ECMAScript,JS中的流程控制也得到了极大的改善。
错误处理
错误处理在应用开发过程中起着至关重要的作用:确定应用崩溃的时间,或者仅仅是打印错误信息,确保应用继续运行都是有一定难度的。
为了能够更简单的说明这个问题,我们决定将其分为两种:程序员错误(programmer errors)和运算错误(operational errors)。
程序员错误就是我们所说的bug,由于你不知道程序运行的确切状态因此当出现错误时你***立刻停止应用的运行(crash the process)。
另一方面,运算错误是由于系统或者远程服务本身所导致的问题。例如:请求超时和内存不足等。基于错误发生的特点,你可以对症下药, 然后重试,例如文件丢失,你可以去创建相应的文件。
在回调中进行错误处理
如果一个错误发生在异步操作的过程中,错误对象应该作为异步函数的第一个参数进行传递。你必须始终要检查该错误对象并进行错误处理。
在前面的有关回调约定的例子里面已经展示了如何在回调函数中进行错误的优先处理。
在Promise中进行错误处理
如果是下面的代码片段会发生什么情况?
Promise.resolve(() => 'John') .then(() => { throw new Error('ops'); }) .catch((ex) => { console.log(ex); }) .then(() => { throw new Error('ups'); console.log(Doe'); })
在第3行会抛出一个异常。
catch会处理它,并且在stdout中打印出:[Error: ops]
执行继续,并且在第9行会抛出一个新的错误
没有了
的确没有什么了 ; 第一个被抛出的错误将会是静默的。你需要注意,你应该始终以一个catch语句作为promise链的第一环。 这会为你解决很多头疼的问题。像下面这样:
Promise.resolve(() => 'John') .then(() => { throw new Error('ops'); }) .catch((ex) => { console.log(ex); }) .then(() => { throw new Error('ups'); console.log(Doe'); }) .catch((ex) => { console.log(ex); });
现在会输出如下内容:
[Error: ops] [Error: ops]
使用JavaScript标准风格
在过去几年中,我们会使用JSHint、JSCS、ESLint等非常有用的代码质量工具来尽可能的自动化检查我们的代码。
最近,当谈到代码风格的时候,我们使用feross的JavaScript标准风格。
原因是它非常的简单:无需任何配置文件,只需要将其放到项目中。主要包括如下一些规则:
使用2个空格作为缩进
字符串使用单引号 – 除了为了避免转义
不要包括没有被使用的变量
没有分号
永远不要以 ( 或者 [ 作为一行的开始
关键字后加空格 if (condition) { ... }
函数名后加空格 function name (args) { ... }
始终使用===代替==,但是可以使用obj == null来检查null || undefined。
始终要处理Node.js的err函数参数
始终要为浏览器全局变量增加window前缀,除了document和navigator
尽可能避免使用类似于open、length、evet、name等走位浏览器全局变量。
当然,如果你的 编辑器只支持ESLint的话,这里有一个ESLint的规则库用于使用标准风格,即eslint-plugin-standard。 安装了这个插件后,你的.eslintrc文件可以是下面这样的:
{ "plugins": [ "standard" ], }
12-Factor应用(The Twelve-Factor Application)
如今,软件通常会作为一种服务来交付,它们被称为网络应用程序,或软件即服务(SaaS)。 12-Factor应用宣言描述了进行Web应用开发的***实践:
基准代码:一份基准代码,多份部署
依赖:显示声明依赖
配置:在环境中存储配置
后端服务:把后端服务当作附加资源
构建、发布、运行:严格分离构建和运行
进程:以一个或多个无状态进程运行应用
端口绑定:通过端口绑定提供服务
并发:通过进程模型进行扩展
易处理:快速启动和优雅终止可***化健壮性
开发环境与线上环境等价:尽可能的保持开发、预发布、线上环境相同
日志:把日志当作事件流
管理进程:后端管理任务当作一次性进程运行
这套理论适用于任意语言和后端服务(数据库、消息队列、缓存等)开发的应用程序。
开始新的项目
始终通过npm init命令来开始一个新项目。这可以为你的项目创建一个初始的package.json。
如果你想跳过初始的提问并直接使用默认的配置,只需要运行npm init --yes即可。
监控你的应用
当发生某个故障或是故障即将发生时,及时的通知你,能够为你挽回损失。
为了进行应用的监控,你可以使用类似的SaaS产品或是开源软件。在开源软件方面,主要包括:Zabbix, Collected, ElasticSearch和Logstash。
如果你不想要自己进行部署,可以考虑使用线上的服务,你可以尝试使用Trace, 它是我们公司开发的Node.js和微服务监控解决方法。
语义版本控制是一种为了兼容性空啊率的使用三段式版本号的正式约定,即:major.minor.patch,分别为主版本,次版本,补丁。
如果是一个不会向后兼容(backward-compatible)的API变化使用主版本号。当添加新的特性且API变化是向后兼容的时候使用次版本号。 如果只是对Bug进行修复可以使用包版本号。
幸运的是,你可以使用semantic-release这个模块自动化你的JavaScript的模块发布。
关于如何成为一个更好的Node.js开发者就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。