前言
很多人认为Node.js 的出现是Web 开发领域十年内□大的变化,它就像是游戏规则的改变者。之所以被喜爱不仅是因为技术上的出众能力,同时也因为它带给Web 开发新的思维方式。
首先,Node.js 应用是使用 语言编写的,而 又是□□被绝大多数Web 浏览器原生支持的编程语言。该特性使得单语言应用栈以及服务端、客户端代码共享成为可能。Node.js 本身也促进了 语言的兴起和发展。人们意识到,在服务端使用 并不像在浏览器端使用它那样糟糕,并且人们将慢慢喜欢上它的编程思维和它混合的天性,即面向对象和函数式编程的结合。
其次,单线程和异步架构也是Node.js 带来的革命性变化。除了性能和可扩展性方面的明显优势外,其改变了开发者处理程序并发和并行的方式。队列取代了互斥锁,回调函数和事件
机制取代了多线程,因果关系取代了同步性。
□后也是□重要的一点,Node.js 拥有一套完整的生态系统:npm 包管理器、不断增长的模块数量、热情活跃的开发社区,以及基于简单、实用主义和极端模块化而产生的独特文化。然而,因为这些特性,Node.js 开发给人一种与其他服务端语言开发非常不一样的感受,刚开始接触Node.js 的开发者,会经常困惑于如何有效地解决一些□常见的设计和代码编写问题。
常见的问题有:“如何组织代码?”“设计这个系统的□好方法是什么?”“怎样使我的程序更加模块化?”“我该怎样高效实现大量的异步调用?”“我该如何确保我的程序随着规模增大会一直稳定运行,不会崩溃?”或者更简单的问题,“Node.js 开发的正确方式是什么?”幸运的是,Node.js 已经成为一个非常成熟的开发平台,以上大部分问题都能通过设计模式、被证明有效的编码技巧或者他人提供的经验来解决。本书的目的就是指导你学习并掌握Node.js 开发的一些设计模式、编码技巧和实践经验,告诉你解决这些常见问题的有效方法并教会你如何从这些方法出发,解决你自己遇到的特定问题。通过阅读本书,你将掌握以下这些内容:
• Node.js 的开发方式
如何使用正确的思维方式去解决一个Node.js 开发设计问题。比如你会学习到,传统设计模式在Node.js 开发中的不同体现,或者如何设计提供单一功能的模块。
• 一整套解决常见Node.js 设计和编码问题的设计模式
你会学习到一整套像“瑞士军刀”一样功能多样、实用的设计模式,并且你能即学即用,解决日常遇到的程序开发和设计问题。
• 如何编写模块化、高效率的Node.js 程序
你将会了解开发大规模并且结构组织合理的Node.js 程序的基本方法,并能运用这些方法去解决不属于现有设计模式范畴的新问题。
在本书中,你会看到一些真实项目中用到的库和技术,比如LevelDb、Redis、RabbitMQ、ZMQ 及Express 等。这些会用来作为示例阐述某个设计模式或者方法,除了让例子更加实用外,它们同时会让你对Node.js 的生态系统以及它解决问题的一套方法有所了解。无论你正使用或打算在你的工作、非正式项目或者开源项目中使用Node.js,认识和使用众所周知的设计模式和技术能够让你通过一种通用的语言和他人共享你的代码和设计,不仅如此,这还会帮助你更好地了解Node.js 的未来,以及知道如何为其发展贡献自己的一份力量。
各章介绍
□□ 章,欢迎来到Node.js 平台,本章通过讲解Node.js 本身核心的设计模式来介绍Node.js 程序的设计,包括Node.js 的生态系统、编程思想,以及Node.js V6 版本、ES2015 和Reactor 模
式的简单介绍。
第2 章,Node.js 基础设计模式,开始介绍Node.js 异步编程和设计模式,讨论和比较了回调函数与事件触发器(观察者模式)。本章还介绍了Node.js 的模块系统和相关模块的设计模式。
第3 章,异步控制流模式之回调函数,介绍了系列用于有效处理Node.js 中的异步控制流的模式和技术。这一章将教你怎样使用纯 和异步库来缓解“回调地狱”的问题。
第4 章,异步控制流模式之ES2015+,介绍了Promise、Generator 和async-await 的异步控制流的探索进展。
第5 章,流编程,深度挖掘Node.js 中□重要的模式之□:□。本章将向你展示如何处理数据流交换及如何将它们组合成不同的布局。
第6 章,设计模式,本章涉及一个有争议的话题:Node.js 的传统设计模式。介绍了□流行的传统设计模式,并展示了它们在Node.js 中的应用。同时也介绍了一些 和Node.js中独有的新设计模式。
第7 章,连接模块,分析了将多个模块关联到一个应用程序中的不同解决方案。在本章中我们将学习几个设计模式,例如依赖注入容器和服务定位器。
第8 章,通用 的Web 应用程序,探讨了现代 Web 应用□有趣的功能之一:前、后端代码共享。本章我们将学习通用的 基本原则,通过使用React、Webpack
和Babel 来构建一个简单的Web 应用程序。
第9 章,高级异步编程技巧,本章展示怎样使用直接可用的解决方案来解决一些常见的编码和设计问题。
□□0 章,扩展和架构模式,介绍扩展Node.js 应用的基本技术和模式。
□□1 章,消息传递与集成模式,提出了□重要的消息传递模式,介绍如何构建和集成使用ZMQ 和AMQP 的复杂的分布式系统。你需要为本书准备什么为了试验代码,需要安装Node.js 第6 版(或更高版本)和npm 3(或更高版本) 。一些例子还要求使用转码器,例如Babel。还需要熟悉命令提示符,了解如何安装npm 包,还要了解怎样运行Node.js 应用。还需要有一个文本编辑器来编写代码和一个现代浏览器进行测试。
适合读者
本书适合于已经接触过Node.js 并且想在效率、设计质量和可扩展性方面获得提升的开发者。由于本书也包含一些基本概念,因此你只需要通过一些基本例子了解相关技术即可。中级
Node.js 的开发者也会从本书有所收获。具备一些软件设计理论背景知识也会有助于理解本书提出的概念。
本书假定你有Web 应用开发、、Web 服务、数据库和数据结构的相关知识。
约定
在本书中,你会发现许多文本样式,这些样式用于区分不同种类的信息。下面是一些这些样式的例子和它们表示的含义。
代码块设置如下:
const zmq = require('zmq')
const sink = zmq.socket('pull');
sink.bindSync("tcp://*:5001");
sink.on('message', buffer => {
console.log(`Message from worker: ${buffer.toString()}`);
});
当希望读者特别注意代码块的特定部分时,以粗体显示该部分:
function produce() {
//...
variationsStream(alphabet, maxLength)
.on('data', combination => {
//...
const msg = {searchHash: searchHash, variations: batch};
channel.sendToQueue('jobs_queue', new Buffer(JSON.stringify(msg)));
//...
})
//...
}
任何命令行输入或输出设置如下:
node replier
node requestor
新术语和重要词汇会以粗体显示。