Node.js设计模式(第2版)
  • 推荐0
  • 收藏2
  • 浏览1.1K

Node.js设计模式(第2版)

Mario Casciaro, Luciano Mammino (作者)  冯康等 (译者)

  • 书  号:978-7-121-33522-8
  • 出版日期:2018-02-09
  • 页  数:436
  • 开  本:16(185*235)
  • 出版状态:上市销售
  • 原书名: Node.js Design Patterns - Second Edition
  • 原书号:9781785885587
  • 维护人:张春雨
纸质版 ¥108.00
本书通过大量示例形象地阐述了 Node.js 的哲学思想和设计模式。内容主要由六部分组成:Node 核心思想、基础设计模式、异步控制流模式、流编程、Node.js 的传统设计模式和特有设计模式、通用编程的 Web 应用以及处理复杂实际问题的高级编程技巧。这是一本值得深入品读的书籍,读者若具备一些软件设计的理论知识会有助于理解书中提出的概念,中级 Node.js 开发者也会从本书有所收获。本书尤其适用于已经接触过 Node.js 并且想在效率、设计质量和可扩展性方面获得提升的开发者。
掌握Node.js强大的组件和模式 轻松创建模块和可扩展的应用程序
前言
很多人认为Node.js 的出现是Web 开发领域十年内最大的变化,它就像是游戏规则的改变者。
之所以被喜爱不仅是因为技术上的出众能力,同时也因为它带给Web 开发新的思维方式。
首先,Node.js 应用是使用JavaScript 语言编写的,而JavaScript 又是唯一被绝大多数Web 浏览
器原生支持的编程语言。该特性使得单语言应用栈以及服务端、客户端代码共享成为可能。
Node.js 本身也促进了JavaScript 语言的兴起和发展。人们意识到,在服务端使用JavaScript 并
不像在浏览器端使用它那样糟糕,并且人们将慢慢喜欢上它的编程思维和它混合的天性,即
面向对象和函数式编程的结合。
其次,单线程和异步架构也是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 的未来,以及知道如何为其发展贡献自己的一份力量。
各章介绍
第1 章,欢迎来到Node.js 平台,本章通过讲解Node.js 本身核心的设计模式来介绍Node.js 程
序的设计,包括Node.js 的生态系统、编程思想,以及Node.js V6 版本、ES2015 和Reactor 模
式的简单介绍。
第2 章,Node.js 基础设计模式,开始介绍Node.js 异步编程和设计模式,讨论和比较了回调
函数与事件触发器(观察者模式)。本章还介绍了Node.js 的模块系统和相关模块的设计模式。
第3 章,异步控制流模式之回调函数,介绍了系列用于有效处理Node.js 中的异步控制流的
模式和技术。这一章将教你怎样使用纯JavaScript 和异步库来缓解“回调地狱”的问题。
第4 章,异步控制流模式之ES2015+,介绍了Promise、Generator 和async-await 的异步控制
流的探索进展。
第5 章,流编程,深度挖掘Node.js 中最重要的模式之一:流。本章将向你展示如何处理数
据流交换及如何将它们组合成不同的布局。
x 前言
第6 章,设计模式,本章涉及一个有争议的话题:Node.js 的传统设计模式。介绍了最流行的
传统设计模式,并展示了它们在Node.js 中的应用。同时也介绍了一些JavaScript 和Node.js
中独有的新设计模式。
第7 章,连接模块,分析了将多个模块关联到一个应用程序中的不同解决方案。在本章中我
们将学习几个设计模式,例如依赖注入容器和服务定位器。
第8 章,通用JavaScript 的Web 应用程序,探讨了现代JavaScript Web 应用最有趣的功能之一:
前、后端代码共享。本章我们将学习通用的JavaScript 基本原则,通过使用React、Webpack
和Babel 来构建一个简单的Web 应用程序。
第9 章,高级异步编程技巧,本章展示怎样使用直接可用的解决方案来解决一些常见的编码
和设计问题。
第10 章,扩展和架构模式,介绍扩展Node.js 应用的基本技术和模式。
第11 章,消息传递与集成模式,提出了最重要的消息传递模式,介绍如何构建和集成使用
ZMQ 和AMQP 的复杂的分布式系统。
你需要为本书准备什么
为了试验代码,需要安装Node.js 第6 版(或更高版本)和npm 3(或更高版本) 。一些例子还
要求使用转码器,例如Babel。还需要熟悉命令提示符,了解如何安装npm 包,还要了解怎
样运行Node.js 应用。还需要有一个文本编辑器来编写代码和一个现代浏览器进行测试。
适合读者
本书适合于已经接触过Node.js 并且想在效率、设计质量和可扩展性方面获得提升的开发者。
由于本书也包含一些基本概念,因此你只需要通过一些基本例子了解相关技术即可。中级
Node.js 的开发者也会从本书有所收获。
具备一些软件设计理论背景知识也会有助于理解本书提出的概念。
本书假定你有Web 应用开发、JavaScript、Web 服务、数据库和数据结构的相关知识。
前言xi
约定
在本书中,你会发现许多文本样式,这些样式用于区分不同种类的信息。下面是一些这些样
式的例子和它们表示的含义。
代码块设置如下:
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
新术语和重要词汇会以粗体显示。
xii

目录

目录
第1 章欢迎来到Node.js 平台. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Node.js 的哲学思想2
小核心2
小模块2
小接触面3
简单和实用3
认识Node.js 6 和ES2015 4
let 和const 关键字5
箭头函数6
类语法8
增强的对象字面量10
Map 和Set 集合11
WeakMap 和WeakSet 集合13
模板字面量14
其他ES2015 特性14
Reactor 模式15
I/O 是缓慢的15
阻塞I/O 15
非阻塞I/O 16
事件多路分解器17
Reactor 模式简介19
Node.js-libuv 的非阻塞I/O 引擎20
Node.js 的秘诀21
总结21
第2 章Node.js 基础设计模式. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
回调模式24
CPS(Continuation Passing Style) 24
同步或异步26
Node.js 回调约定31
模块系统及其模式34
揭示模块模式34
Node.js 模块解释35
模块定义模式42
观察者模式49
EventEmitter 类49
创建和使用EventEmitter 50
传播错误51
使任何对象可观察51
同步和异步事件53
EventEmitter 与回调54
组合回调和EventEmitter 55
总结55
第3 章异步控制流模式之回调函数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
异步编程的困难56
创建一个简单的网络蜘蛛57
回调地狱59
使用纯JavaScript 60
回调规则60
应用回调规则61
顺序执行63
并行执行68
有限制的并行执行73
async 库77
顺序执行78
并行执行81
有限制的并行执行81
总结83
xiv 目录
第4 章异步控制流模式之ES2015+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
promise 84
什么是promise 85
Promises/A+ 实现87
Node.js 风格函数的promise 化88
顺序执行90
并行执行93
有限制的并行执行93
在公共API 中暴露callback 和promise 95
generator 97
generator 基础97
generator 的异步控制流100
顺序执行104
并行执行106
有限制的并行执行108
使用Babel 的async await 111
安装和运行Babel 112
比较113
总结114
第5 章流编程. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
流的重要性115
缓冲和流116
空间效率117
时间效率118
组合性121
开始学习流122
流的分类122
可读流123
可写流127
双向流(Duplex stream) 132
变换流132
使用管道拼接流135
使用流处理异步流程137
顺序执行138
无序并行执行139
无序有限制的并行执行143
顺序并行执行145
目录xv
管道模式146
组合流146
复制流149
合并流150
复用和分解152
总结159
第6 章设计模式. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
工厂模式161
创建对象的通用接口161
一种封装的机制162
构建一个简单的代码分析器164
可组合的工厂函数166
扩展169
揭示构造函数170
只读事件触发器171
扩展172
代理模式173
实现代理模式的方法174
不同方法的比较176
创建日志记录的写入流176
生态系统中的代理模式——函数钩子与面向行为编程(AOP) 178
ES2015 中的Proxy 对象178
扩展180
装饰者模式(Decorator) 180
实现装饰者模式的方法181
装饰一个LevelUP 数据库182
扩展185
适配器模式(Adapter) 185
通过文件系统API 来使用LevelUP 数据库186
扩展189
策略模式(Strategy) 189
支持多种格式的配置对象190
扩展193
状态模式193
实现一个基本的自动防故障套接字194
模板模式(Template) 199
配置管理器模板199
xvi 目录
扩展201
中间件(Middleware) 202
Express 中的中间件202
设计模式中的中间件203
为?MQ 创建中间件框架204
在Koa 中使用生成器的中间件210
命令模式(Command) 213
灵活的设计模式214
总结218
第7 章连接模块. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
模块和依赖221
Node.js 中最常见的依赖221
内聚和耦合222
有状态的模块222
连接模块模式224
硬编码依赖224
依赖注入229
服务定位器234
依赖注入容器239
连接插件243
插件作为包243
扩展点245
插件控制与应用程序控制的扩展245
实现注销插件248
总结256
第8 章通用JavaScript 的Web 应用程序. . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
与浏览器端共享代码258
共享模块258
Webpack 简介262
Webpack 的魔力263
Webpack 的优点264
使用ES2015 和Webpack 265
跨平台开发基础267
运行时代码分支268
构建时代码分支269
模块交换271
目录xvii
用于跨平台开发的设计模式273
React 介绍274
第一个React 组件275
JSX 是什么277
配置Webpack 以实现JSX 转换279
在浏览器中渲染280
React 路由库281
创建通用JavaScript 应用程序286
创建可用的组件287
服务端渲染289
通用渲染和路由293
通用数据检索294
总结304
第9 章高级异步编程技巧. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
需要异步初始化的模块305
规范解决方案306
预初始化队列307
题外话311
异步批处理和缓存312
实现没有缓存或批处理的服务器312
异步请求批处理314
异步请求缓存316
使用promise 进行批处理和缓存319
运行CPU 绑定的任务322
解决子集和问题322
交叉使用setImmediate 325
使用多进程328
总结335
第10 章扩展与架构模式. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
应用程序扩展介绍337
扩展Node.js 应用程序337
可扩展性的三个维度337
克隆和负载均衡339
集群模块340
处理有状态通信348
使用反向代理进行扩展350
xviii 目录
使用服务注册表354
对等负载均衡360
分解复杂的应用程序362
单体式架构362
微服务架构364
微服务架构中的集成模式367
总结372
第11 章消息传递与集成模式. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
消息系统的基础375
单向和请求/应答模式375
消息类型376
异步消息和队列377
对等或基于代理的消息378
发布/订阅模式379
构建简约的实时聊天应用程序380
使用Redis 作为消息代理383
使用?MQ 对等发布/订阅385
持久订阅者389
管道和任务分配模式396
?MQ 扇出/扇入模式397
使用AMQP 实现管道和竞争消费者模式401
请求/应答模式406
关联标识符406
返回地址410
总结415

读者评论

相关博文

  • 聊聊Node.js 的哲学思想

    聊聊Node.js 的哲学思想

    管理员账号 2018-06-15

    ** 每个平台都有它自己的哲学:大众普遍接受的一套原理和准则,影响平台演化的一种做事思想,以及应用程序该如何开发与设计。这些原则中的有些原则源于技术本身,有些是被它的生态系统激活了,有些是社区中的种种趋势,以及一些其他的不同的意识形...

    管理员账号 2018-06-15
    442 0 1 0

相关图书

写给大忙人的现代JavaScript

(德国)HORSTMANN, CAY S. (作者) 浙江阿里巴巴聚橙技术发展有限公司 (译者)

本书是一本简明的现代 JavaScript 教程,不仅涵盖函数式编程、JS 语法、JS 库等基础性内容,还介绍了国际化、异步编程、标准模块系统、元编程等较为复杂...

¥109.00

JavaScript 二十年

王译锋 (作者)

本书主要讲述了从 1995 年到 2015 年这20年间,JavaScript在创建、设计和演变方面所经历的过程。全书分为4个部分,每个部分都涵盖了 JavaS...

¥79.00

JavaScript语言精髓与编程实践(第3版)

周爱民 (作者)

本书详细讲述JavaScript作为一种混合式语言的各方面特性,包括过程式、面向对象、函数式和动态语言特性等,在动态函数式语言特性方面有着尤为细致的讲述。本书主...

¥144.00

狼书(卷2):Node.js Web应用开发

桑世龙 (作者)

目前市面的nodejs书籍基于0.10的为多,而基于最新4.X的非常少,本书是唯一一本基于node.js 4.0以上版本的书。而Koa是下一代node web的...

¥69.30

狼书(卷1):更了不起的Node.js

狼叔 桑世龙 (作者)

Node.js开发简单,性能极好,一经发布便成了明星级项目。随着大前端领域的蓬勃发展,跨平台开发、API构建、Web应用开发等场景愈加常见,Node.js也成为...

¥55.30

Koa与Node.js开发实战

Node.js 10已经进入LTS时代!其应用场景已经从脚手架、辅助前端开发(如SSR、PWA等)扩展到API中间层、代理层及专业的后端开发。Node.js在企...

¥49.00