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" } }
文件名始终小写