2016 年,新 Node 项目注意点

2016年开发 Node 项目,会有什么不一样吗?! 当然随着语言,工具,运行环境,开发方式的不断变化,你的 Node 项目当然也需要不断的与时俱进,那么我们就依次来看看需要注意哪些问题吧。

目录

现在开始使用 ES2015

异步函数支持回调惯例和Promise新写法

异步模式

错误处理

使用标准的 JavaScript 代码风格

Web 应用开发的十二条军规

始终用 npm init 开始新项目

文件名始终小写

智能的 .npmrc 和正确的版本管理做法

及时更新依赖

选择合适的数据库

监控你的应用程序

使用构建系统

NPM 生命周期钩子

管好垃圾回收

使用长期支持的 Node.js 版本

使用语义化的版本号

持续学习和跟上潮流

现在开始使用 ES2015

箭头函数
模板字符串
rest参数,扩展运算符(spread),函数默认值
变量的解构赋值
generator 和 promises
maps,sets 和 symbols

这些新语法大部分都被 Node.js V4 支持(参考)[https://nodejs.org/en/docs/es6/]
在服务器端的推荐使用新的 node 解释器支持的语法,或者可以用babel作为compile层(具体做法参考脚手架

// 从 express's req.query 解构 特定参数 ?page=2&size=10&word=测试 let {page, size, word} = req.query;

异步函数支持回调惯例和Promise新写法

过去,当Promise没有成为Node默认搭载的语法时,推荐模块通过导出 error-first callback 的接口形式。但是现在通常需要支持两种形式:

const fs = require('fs') function readPackage(callback=noop) { return new Promise((resolve, reject)=>{ fs.readFile('./package.json', (err, data)=>{ if(err) { reject(err) return callback(err) } resolve(data) return callback(null, data) }) }) }

异步模式

过去很长时间,在 node 中一般有两种方式来管理异步流:callback回调和 streams 流
前者可以用辅助我们异步操作的 async 类库
后者可以用through, bl or highland 这些类库
但是随着 es6的 generator和promise的到来,甚至es7的 await/async 内建关键字的到来,情况变了。 详细请看

错误处理

完善合理的错误处理让你的服务更加强健。知道何时crash,然后是仅仅catch后忽略,还是记下调用栈打入log后重试,甚至是需要重启?
我们通常需要区别对待 programmer error, operational errors:
前者直接重启(事实上在开发阶段就该发现,并且线上通过 logger 定位),因为程序员写的bug,如果不及时重启会导致应用的状态难以推演,从而发生更多更大的问题
而后者,通常不是bug,而是没有考虑全的case。如外部请求超时了,外部依赖的数据库连不上了,甚至所在运行的机器磁盘写满了,要访问写入的文件暂时不存在了。这些case一般需要在程序里加上特定的fallback/polyfill 来处理。如对于超时的重试几次,对于不存在的文件先试着创建新文件,对于总是塞满磁盘的log,通过logstash和logrotate去处理。

回调中的错误处理

error-first 约定的callback,始终记得在函数开始检查第一个err是否存在,然后进行合适的处理(当然也可以通过 next(e) 传入到调用栈的最后统一处理)

Promise中的错误处理

始终记得在 promise 调用链的最后加上 catch 来处理异常

使用标准的 JavaScript 代码风格

过去我们使用 jslint, jshint, jscs 来作为我们的代码风格检查工具,但是随着 es6 的流行,还有一些新的习惯的养成,我们推荐使用 eslint 工具,同时配合 eslint-plugin-standard 插件

{ "plugins": [ "standard" ], }

Web 应用开发的十二条军规

来自于 Rails 社区的血泪经验,但是大部分也是适用于我们Node项目 (一些实践可能在新的docker部署下会有小调整)

始终用 npm init 开始新项目

通过 npm init 来初始化你的node项目,通过promt 确定你的项目名称,开发者信息等(当然你可以通过 --yes 旗标来跳过)
Tip: 主要你应该总是显示指名你的node engines 版本(node -v),确保你的开发环境,测试环境和线上环境是用同一版本的 node.

{ "engines": { "node": "4.2.1" } }

文件名始终小写

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/79a7de387d7f46a8e3b81995cc21227d.html