Node.js编程之道

  Node.js易于掌握,但是难于精通,本文介绍的设计模式和最佳实践可以避免常见的陷阱,帮助你构建更稳定的应用程序。

结构

  NodeJS的模块是构建应用程序的基本构建块,这些模块非常灵活能够使用在任何地方,你需要遵循下面指南来使用这些模块。

  构建小的模块,构建模块的目的只有一个,每个模块只为一个目标构建,建设小型而专用的模块是Node.js的核心,借用Unix的优点,NodeJS鼓励使用更小更简单的代码块以构建复杂且强大的功能,但是请注意,不要为一些帮助性质的函数和类构建模块,代码分离不一定降低复杂性,它可能会导致碎片化。

  只有构建实实在在需要的模块,才能将一个个实用功能分离成新模块,让自己的代码更干净,我们是追求更简单的代码,而不是更多的更小的大量文件。

  通过组合实现复杂功能的构建,我们经常使用很多NPM模块,但是你不必了解模块内部细节,你可以通过继承和组合的方式综合已经成熟的模块,通过使用接口,避免与接口实现子类细节打交道,这样我们可以在不必关心每个模块底层细节的基础上组合成更复杂的系统。

 

异步

  V8引擎能让Node一次并发处理每个请求,相比堵塞调用,Node能够在等待响应的同时处理其他请求,这会导致Socket IO等需要堵塞等待的资源调用不再堵塞影响整个应用程序,但是因为只有一个线程负责一切,繁重的CPU计算如加密和数据分析会让这个唯一线程变得很忙,不能再处理其他事情,又变得需要等待堵塞了,所以,大部分Node.js应用必须尽可能地将需要计算的繁重工作委托给后端任务或API专门去完成,这样保持Node.js轻量,能够一直在飞.....

  因为异步代码扮演主要角色,那么就特别要注意维护保持它,嵌入式回调(回调陷阱 回调地狱)确实很容易编写,但是他们难于阅读和维护。 变量碰撞,作用域串联或者你在一个代码块中有100种不同可能的代码路径等等,易于阅读的异步代码确实难以编写(可通过Promise Task.js等方式实现顺序化编程),对回调地狱进行重构,保持代码可阅读性会帮助你减轻很多头疼的问题。

  尽早的return,Node社区有很多最佳实践来回避回调地狱,Returning early尽可能早返回是一个编码风格的选择,但是能够见底嵌套代码的复杂性,使用小的简单的if语句替代复杂的嵌套If-else语句,一旦条件满足尽可能早返回return,这会保持代码路径相当简单和线性化,降低负载逻辑路径的产生概率。

  遵循标准callback模式,Error-first回调是另外一个Node.js模式,分离创建的两个模块可以很好地在一起工作,回调的潜在危险是你很容易失去了对应用的控制,为了使得每个模块能够安全地返回控制权到你的回调中,你可以使用error-first回调模式,这会让你无需深挖每个模块对象内部细节而让代码变得易于阅读和理解。详细见:Node.js的Error-first回调模式

  通过控制流程获得帮助,虽然标准回调模式能够帮助你减轻回调混乱,但是有时还需要借助一些库包来实现流程的顺序控制,比如async库包能让你控制回调的顺序和行为,并行或串行,Promise会取代回调让你的异步代码变得可读,也就是说,能让你以传统顺序编程的方式编写异步代码。

Node.js教程系列

Node.js的测试

Node.js的单例设计

Node.js设计定制类型

Node.js的require()的工作原理

Node.js最佳实践

美国航空航天局NASA的JavaScript编码规范