新書推薦:
《
积极心理学
》
售價:NT$
254.0
《
自由,不是放纵
》
售價:NT$
250.0
《
甲骨文丛书·消逝的光明:欧洲国际史,1919—1933年(套装全2册)
》
售價:NT$
1265.0
《
剑桥日本戏剧史(剑桥世界戏剧史译丛)
》
售價:NT$
918.0
《
中国高等艺术院校精品教材大系:材料的时尚表达??服装创意设计
》
售價:NT$
347.0
《
美丽与哀愁:第一次世界大战个人史
》
售價:NT$
653.0
《
国家豁免法的域外借鉴与实践建议
》
售價:NT$
857.0
《
大单元教学设计20讲
》
售價:NT$
347.0
內容簡介:
本书中使用好的办法来实现各种设计模式以创造高效且健壮的Node.js应用程序。本书首先介绍Node.js的基础知识,包括异步事件驱动架构以及基本的设计模式。然后,介绍怎样用callback (回调)、Promise以及async/await机制来构建异步的控制流模式。其次,介绍Node.js的stream (流)并演示stream的强大功能,使读者能充分地利用这些功能。本书分析了三大类设计模式,即创建型的设计模式、结构型的设计模式以及行为型的设计模式,并介绍了怎样在JavaScript语言及Node.js平台中充分运用这些模式。后,书中研究了一些比较高端的概念,例如UniversalJavaScript、Node.js程序的扩展问题以及消息传递模式等,以帮助读者打造企业级的分布式应用程序。
本书适合已了解Node.js技术,同时希望在程序的效率、设计及可扩展程度方面有所提高的开发者。阅读本书需要读者掌握Web应用程序、WebService、数据库与数据结构方面的开发技术。
關於作者:
Mario Casciaro是一位软件工程师和企业家,对技术,科学和开源知识充满热情。Mario毕业于软件工程硕士学位,并开始了他在IBM的职业生涯。目前,Mario是Sponsorama.com的联合创始人兼首席执行官,该平台通过企业赞助来帮助在线项目筹集资金,还是版Node.js设计模式的作者。Luciano Mammino是一位软件工程师,出生于1987年。他从12岁开始使用父亲的旧Intel 386(仅提供DOS操作系统和qBasic解释器)进行编码。在获得计算机科学硕士学位之后,他主要是作为网络开发人员发展了自己的编程技能,主要是为意大利各地的公司和初创公司担任自由职业者。在担任CTO和Sbaam.com在意大利和爱尔兰的联合创始人长达三年的创业后,在Smartbox担任高级PHP工程师。他喜欢开发开源库并喜欢使用Symfony和Express这样的框架。
目錄 :
目录
前言
第1章 Node.js平台 1
1.1 Node.js开发理念 1
1.1.1 小核心 2
1.1.2 小模块 2
1.1.3 小接触面 (小暴露面) 3
1.1.4 简单实用 3
1.2 Node.js的工作原理 4
1.2.1 I/O是慢速操作 4
1.2.2 阻塞式I/O 4
1.2.3 非阻塞式的I/O 5
1.2.4 事件多路分离 6
1.2.5 reactor模式 8
1.2.6 Node.js的I/O引擎———Libuv 10
1.2.7 Node.js的全套结构 10
1.3 Node.js平台之中的JavaScript 11
1.3.1 放心地使用版的JavaScript 11
1.3.2 模块系统 12
1.3.3 访问操作系统中的各项服务 12
1.3.4 运行原生代码 13
1.4 小结 14
第2章 模块系统 15
2.1 为什么需要模块 15
2.2 JavaScript与Node.js的模块系统 16
2.3 模块系统及其模式 17
2.4 CommonJS模块 19
2.4.1 自制的模块加载器 19
2.4.2 定义模块 21
2.4.3 module.exports与exports 22
2.4.4 require函数是同步函数 23
2.4.5 模块解析算法 23
2.4.6 模块缓存 25
2.4.7 循环依赖 26
2.5 定义模块所用的模式 30
2.5.1 命名导出模式 30
2.5.2 函数导出模式 31
2.5.3 类导出模式 32
2.5.4 实例导出模式 33
2.5.5 通过monkeypatching模式修改其他模块或全局作用域 34
2.6 ECMAScript模块 (ESM) 35
2.6.1 在Node.js平台中使用ESM 36
2.6.2 命名导出模式与命名引入 36
2.6.3 默认导出与默认引入 39
2.6.4 混用命名导出与默认导出 40
2.6.5 模块标识符 41
2.6.6 异步引入 42
2.6.7 详细解释模块的加载过程 44
2.6.8 修改其他模块 51
2.7 ESM与CommonJS之间的区别以及交互使用技巧 55
2.7.1 ESM是在严格模式下运行的 55
2.7.2 ESM不支持CommonJS提供的某些引用 55
2.7.3 在其中一种模块系统里面使用另一种模块 56
2.8 小结 57
第3章 回调与事件 58
3.1 Callback (回调)模式 58
3.1.1 continuation-passing风格 (CPS) 59
3.1.2 某个函数究竟是同步函数,还是异步函数? 62
3.1.3 在Node.js里面定义回调的惯例 68
3.2 Observer(观察者)模式 72
3.2.1 EventEmitter 73
3.2.2 创建并使用EventEmitter 74
3.2.3 播报错误信息 75
3.2.4 让任何一个对象都能为监听器所观察 75
3.2.5 EventEmitter与内存泄露 77
3.2.6 同步事件与异步事件 78
3.2.7 EventEmitter与callback(回调)之间的对比 80
3.2.8 把回调与事件结合起来 81
3.3 小结 82
3.4 习题 82
第4章 利用回调实现异步控制流模式 84
4.1 异步编程所遇到的困难 84
4.1.1 创建简单的网页爬虫 85
4.1.2 callbackhell 87
4.2 涉及回调的编程技巧与控制流模式 88
4.2.1 编写回调逻辑时所应遵循的原则 89
4.2.2 运用相关的原则编写回调 89
4.2.3 顺序执行 92
4.2.4 平行执行 98
4.2.5 限制任务数量的平行执行 104
4.3 async库 112
4.4 小结 113
4.5 习题 113
第5章 利用Promise与async/await实现异步控制流模式 115
5.1 Promise 116
5.1.1 什么是Promise? 116
5.1.2 Promises/A 与thenable 119
5.1.3 PromiseAPI 119
5.1.4 创建Promise 121
5.1.5 把回调方案改写成Promise方案 122
5.1.6 顺序执行与迭代 124
5.1.7 平行执行 128
5.1.8 限制任务数量的平行执行 129
5.2 async/await 132
5.2.1 async函数与await表达式 133
5.2.2 用async/await处理错误 134
5.2.3 顺序执行与迭代 137
5.2.4 平行执行 139
5.2.5 限制任务数量的平行执行 141
5.3 无限递归的Promise解析链所引发的问题 145
5.4 小结 148
5.5 习题 149
第6章 用Stream编程 150
6.1 理解stream在Node.js平台中的重要作用 150
6.1.1 缓冲模式与流模式 151
6.1.2 流模式在空间占用方面的优势 152
6.1.3 流模式在处理时间方面的优势 154
6.1.4 stream之间的组合 157
6.2 开始学习Stream 160
6.2.1 流对象的体系结构 161
6.2.2 Readable流 (可读流) 161
6.2.3 Writable流 (可写流) 169
6.2.4 Duplex流 (双工流/读写流) 175
6.2.5 Transform流 (传输流) 176
6.2.6 PassThrough流 183
6.2.7 lazystream (惰性流) 188
6.2.8 用管道连接流对象 189
6.3 用stream实现异步控制流模式 193
6.3.1 顺序执行 194
6.3.2 无序的平行执行 196
6.3.3 无序且带有并发上限的平行执行模式 201
6.3.4 有序的平行执行 203
6.4 管道模式 205
6.4.1 组合stream 205
6.4.2 拆分stream (fork模式) 210
6.4.3 合并stream (merge模式) 211
6.4.4 多路复用与解多路复用 (mux/demux模式) 213
6.5 小结 220
6.6 习题 221
第7章 创建型的设计模式 222
7.1 Factory(工厂)模式 223
7.1.1 把对象的创建流程与该流程的实现方式解耦 223
7.1.2 强化封装效果 225
7.1.3 构建一款简单的codeprofiler(代码测评工具) 226
7.1.4 Node.js大环境之中的工厂模式 229
7.2 Builder(生成器/建造者)模式 229
7.2.1 实现URL对象生成器 233
7.2.2 Node.js大环境之中的Builder模式 237
7.3 RevealingConstructor模式 238
7.3.1 构建不可变的缓冲区 239
7.3.2 Node.js大环境之中的RevealingConstructor模式 242
7.4 Singleton (单例/单件)模式 243
7.5 管理模块之间的依赖关系 247
7.5.1 用Singleton模式管理模块之间的依赖关系 247
7.5.2 用DI(依赖注入)管理模块之间的依赖关系 250
7.6 小结 255
7.7 习题 256
第8章 结构型的设计模式 258
8.1 Proxy(代理)模式 258
8.1.1 怎样实现Proxy模式 259
8.1.2 创建带有日志功能的 Writable流 270
8.1.3 用Proxy实现ChangeObserver模式 271
8.1.4 Node.js大环境之中的Proxy模式 274
8.2 Decorator(修饰器)模式 274
8.2.1 实现Decorator模式的几种办法 275
8.2.2 用Decorator模式来修饰LevelUP数据库 279
8.2.3 Node.js大环境之中的Decorator模式 282
8.3 Proxy模式与Decorator模式之间的区别 283
8.4 Adapter(适配器)模式 284
8.4.1 通过fs式的API来使用LevelUP 284
8.4.2 Node.js大环境之中的Adapter模式 288
8.5 小结 289
8.6 习题 290
第9章 行为型的设计模式 291
9.1 Strategy(策略)模式 292
9.1.1 处理各种格式的配置信息 293
9.1.2 Node.js大环境之中的Strategy模式 297
9.2 State(状态)模式 297
9.3 Template(模板)模式 304
9.3.1 用Template模式重新实现配置管理器 305
9.3.2 Node.js大环境之中的Template模式 308
9.4 Iterator(迭代器)模式 308
9.4.1 iterator协议 309
9.4.2 iterable协议 311
9.4.3 在JavaScript语言内建的机制之中使用iterator与iterable 314
9.4.4 Generator(生成器) 316
9.4.5 asynciterator(异步迭代器) 321
9.4.6 asyncgenerator(异步生成器) 324
9.4.7 asynciterator(异步迭代器)与Node.js平台的stream (流) 325
9.4.8 Node.js大环境中的Iterator模式 326
9.5 Middleware(中间件)模式 327
9.5.1 Express里面的中间件 327
9.5.2 从模式的角度谈中间件 328
9.5.3 创建针对ZeroMQ的中间件框架 330
9.5.4 Node.js大环境之中的 Middleware模式 337
9.6 Command(命令)模式 337
9.6.1 Task模式 339
9.6.2 用复杂一些的办法实现Command 340
9.7 小结 344
9.8 习题 344
第10章 用UniversalJavaScript开发 Web应用程序 347
10.1 让Node.js与浏览器共用同一套代码 348
10.2 跨平台开发的基础知识 360
10.2.1 在运行程序的时候做代码分支 360
10.2.2 在构建程序的时候做代码分支 362
10.2.3 模块交换 (模块替换) 365
10.2.4 适用于跨平台开发的设计模式 366
10.3 React简介 367
10.3.1 React编程入门 369
10.3.2 用其他写法取代react.createElement 371
10.3.3 有状态的Reactcomponent 373
10.4 创建UniversalJavaScript应用程序 379
10.4.1 先构建一款只有前端逻辑的应用程序 380
10.4.2 给程序添加服务器端的渲染逻辑 388
10.4.3 让程序用异步的方式获取数据 394
10.4.4 在服务器端与浏览器端采用同一套方案获取数据 400
10.5 小结 415
10.6 习题 416
第11章 高级技巧 417
11.1 如何应对初始化过程中需要执行异步任务的组件 417
11.1.1 初始化过程中含有异步任务的组件所面对的问题 418
11.1.2 预初始化队列 (pre-initializationqueue) 420
11.1.3 Node.js大环境之中的解决方案 425
11.2 批量处理异步请求并缓存处理结果 426
11.2.1 什么叫作批量处理异步请求? 426
11.2.2 用更好的办法来缓存异步请求的处理结果 427
11.2.3 不带缓存或批处理机制的API服务器 428
11.2.4 利用Promise实现批处理与缓存 430
11.3 取消异步操作 435
11.3.1 采用基本方案创建可叫停的函数 435
11.3.2 把可叫停的异步函数所要执行的异步调用包装起来 437
11.3.3 利用生成器实现可叫停的异步函数 439
11.4 运行CPU密集型任务 443
11.4.1 解决subsetsum (子集合加总)问题 443
11.4.2 通过setImmediate分步执行 447
11.4.3 使用外部进程执行任务 450
11.4.4 用工作线程执行任务 458
11.4.5 在实际工作中处理CPU密集型任务 462
11.5 小结 463
11.6 习题 463
第12章 用架构模式实现扩展 465
12.1 浅谈如何扩展应用程序 466
12.1.1 扩展Node.js应用程序 466
12.1.2 从三个方面考虑可扩展能力 467
12.2 克隆与负载均衡 469
12.2.1 cluster模块 470
12.2.2 如何处理需要根据状态来执行的通信请求 480
12.2.3 用反向代理扩展应用程序 483
12.2.4 动态的水平扩展 489
12.2.5 端对端的负载均衡 497
12.2.6 用容器扩展应用程序 501
12.3 分解复杂的应用程序 511
12.3.1 单体式的架构 511
12.3.2 微服务架构 513
12.3.3 适用于微服务架构的集成模式 516
12.4 小结 522
12.5 习题 523
第13章 消息传递与集成模式 524
13.1 消息传递系统的基础知识 525
13.1.1 是单向通信,还是采用请求/响应模式来通信 525
13.1.2 消息的类型 526
13.1.3 异步消息传递机制、队列、流 (stream) 527
13.1.4 端对端的消息传递与基于中介的消息传递 529
13.2 Publish/Subscribe(发布/订阅)模式 530
13.2.1 构建一款极简的实时聊天程序 531
13.2.2 用Redis充当简单的messagebroker(消息中介) 535
13.2.3 用ZeroMQ实现端对端的Publish/Subscribe 538
13.2.4 用队列确保消息可靠地得到投递 542
13.2.5 用Stream (流)可靠地传递消息 552
13.3 任务分配模式 557
13.3.1 用ZeroMQ实现Fanout/Fanin模式 558
13.3.2 根据AMQP协议制作管道并实现CompetingConsumers
(互相竞争的消费者)模式 567
13.3.3 用Redis流实现任务分配模式 571
13.4 Request/Reply(请求/响应)模式 577
13.4.1 关联标识符 577
13.4.2 ReturnAddress(返回地址)模式 584
13.5 小结 591
13.6 习题 591