第一部分 Node基础 2
1 入门 2
1.1 Node入门 3
1.1.1 为什么使用Node 3
1.1.2 Node的主要特性 5
1.2 构建一个Node应用 7
1.2.1 创建一个新的Node项目 8
1.2.2 创建一个流的类 9
1.2.3 使用流 10
1.2.4 编写测试 11
1.3 总结 13
2 全局变量:Node环境 15
2.1 模块 16
技巧1 安装与加载模块 16
技巧2 创建与管理模块 17
技巧3 加载一组相关的模块 20
技巧4 使用路径 22
2.2 标准I/O以及console对象 23
技巧5 标准I/O流的读写 24
技巧6 打印日志消息 25
技巧7 基准测试 27
2.3 操作系统与命令行 29
技巧8 获取平台信息 29
技巧9 传递命令行参数 30
技巧10 退出程序 31
技巧11 响应信号量 33
2.4 使用timer延迟执行 35
技巧12 通过setTimeout延迟执行函数 35
技巧13 通过定时器定时调用回调函数 37
技巧14 安全的操作异步接口 38
2.5 总结 41
3 Buffers:使用比特、字节以及编码 43
3.1 修改数据编码 44
技巧15 Buffer转换为其他格式 44
技巧16 使用Buffers来修改字符串编码 46
3.2 二进制文件转换为JSON 49
技巧17 使用Buffer来转换原始数据 49
3.3 创建你自己的二进制协议 65
技巧18 创建自己的网络协议 65
3.4 总结 71
4 Events:玩转EventEmitter 72
4.1 基础用法 73
技巧19 从EventEmitter继承 73
技巧20 混合EventEmitter 76
4.2 异常处理 78
技巧21 管理异常 78
技巧22 通过domains管理异常 80
4.3 高级模式 82
技巧23 反射 82
技巧24 探索EventEmitter 85
技巧25 组织事件名称 87
4.4 第三方模块以及扩展 88
技巧26 EventEmitter的替代方案 89
4.5 总结 91
5 流:最强大和最容易误解的功能 93
5.1 流的介绍 94
5.1.1 流的类型 94
5.1.2 什么时候使用流 94
5.1.3 历史 95
5.1.4 第三方模块中的流 96
5.1.5 流继承事件 97
5.2 内置流 98
技巧27 使用内置的流来实现静态web服务器 98
技巧28 流的错误处理 101
5.3 第三方模块和流 102
技巧29 使用流的第三方模块 102
5.4 使用流基类 105
技巧30 正确地从流的基类继承 105
技巧31 实现一个可读流 107
技巧32 实现一个可写流 111
技巧33 使用双工流转换和接收数据 113
技巧34 使用转换流解析数据 114
5.5 高级模式和优化 118
技巧35 流的优化 118
技巧36 使用老的流API 121
技巧37 基于功能的流适配 123
技巧38 测试流 125
5.6 总结 128
6 文件系统:通过异步和同步的方法处理文件 129
6.1 fs模块概述 130
6.1.1 POSIX文件系统包装器 130
6.1.2 流 132
6.1.3 批量文件操作 133
6.1.4 文件监视 133
6.1.5 同步的替代方案 133
技巧39 读取配置文件 134
技巧40 使用文件描述 136
技巧41 使用文件锁 137
技巧42 递归文件操作 142
技巧43 编写文件数据库 147
技巧44 监视文件以及文件夹 151
6.2 总结 154
7 网络:Node真正的“Hello,World” 156
7.1 Node中的网络 156
7.1.1 网络技术 157
7.1.2 Node网络模块 161
7.1.3 非阻塞网络和线程池 162
7.2 TCP客户端和服务端 163
技巧45 创建TCP服务端和客户端 163
技巧46 使用客户端测试TCP服务端 165
技巧47 改进实时性低的应用 168
7.3 UDP客户端和服务端 170
技巧48 通过UDP传输文件 170
技巧49 UDP客户端服务应用 174
7.4 HTTP客户端和服务端 179
技巧50 HTTP服务器 179
技巧51 重定向 181
技巧52 HTTP代理 186
7.5 创建DNS请求 189
技巧53 创建DNS请求 189
7.6 加密 191
技巧54 一个加密的TCP服务器 192
技巧55 加密的Web服务器和客户端 196
7.7 总结 198
8 子进程:利用Node整合外部应用程序 200
8.1 执行外部应用程序 202
技巧56 执行外部应用程序 202
8.1.1 路径和Path的环境变量 203
8.1.2 执行外部程序时候出现的异常 204
技巧57 流和外部应用程序 205
8.1.3 外部应用程序的串联调用 206
技巧58 在shell中执行命令 208
8.1.4 安全性和shell命令执行 209
技巧59 分离子进程 210
8.1.5 父进程和子进程之间的I/O处理 211
8.1.6 引用计数和子进程 213
8.2 执行Node程序 213
技巧60 执行Node程序 214
技巧61 Forking Node模块 216
技巧62 运行作业 218
8.2.1 工作池 220
8.2.2 使用池模块 222
8.3 同步运行 223
技巧63 同步子进程 223
8.4 总结 227
第二部分 实践中的技巧 230
9 网络:构建精简的网络应用 230
9.1 前端技术 231
技巧64 快速的静态网站服务器 231
技巧65 在Node中使用DOM 236
技巧66 在浏览器端使用Node模块 238
9.2 服务端技术 241
技巧67 Express路由分离 241
技巧68 自动重启服务器 245
技巧69 配置web应用 248
技巧70 优雅地处理错误 253
技巧71 RESTful web应用 257
技巧72 使用自定义的中间件 267
技巧73 使用事件进行解耦 273
技巧74 使用WebSockets来处理sessions 276
技巧75 升级Express 3到4 281
9.3 web应用程序的测试 285
技巧76 测试路由 286
技巧77 为中间件注入创建seams 288
技巧78 测试依赖远程服务的应用 291
9.4 全栈框架 297
9.5 实时服务 299
9.6 总结 300
10 测试:编写健壮代码的关键 301
10.1 Node测试的相关介绍 303
10.2 使用断言编写简单的测试 304
技巧79 用内置的模块编写测试 305
技巧80 编写验证异常的测试 308
技巧81 创建自定义的断言 312
10.3 测试装置 314
技巧82 使用一个测试装置组织测试 314
10.4 测试框架 318
技巧83 使用Mocha编写测试 319
技巧84 使用Mocha测试web应用 323
技巧85 万能测试协议(TAP) 328
10.5 测试工具 331
技巧86 持续集成 331
技巧87 数据库装置 335
10.6 扩展阅读 343
10.7 总结 343
11 调试:用于发现和解决问题 344
11.1 内省 345
11.1.1 显式异常 345
11.1.2 隐藏的异常 346
11.1.3 错误事件 346
11.1.4 错误参数 347
技巧88 处理未捕获的异常 348
技巧89 检查我们的Node代码 351
11.2 问题的调试 352
技巧90 使用Node内置的调试器 352
技巧91 使用Node Inspector 359
技巧92 对Node应用进行性能分析 361
技巧93 内存泄漏的调试 365
技巧94 使用REPL来检测运行中的程序 370
技巧95 跟踪系统调用 377
11.3 总结 381
12 生产环境中的Node:安全地部署应用程序 382
12.1 部署 383
技巧96 将Node程序部署到云端 383
技巧97 使用Apache和Ngnix部署Node程序 389
技巧98 在80端口上安全地运行Node程序 392
技巧99 保持Node进程一直运行 394
技巧100 在生产环境中使用WebSockets 396
12.2 Node程序的缓存和扩展性 402
技巧101 HTTP缓存 402
技巧102 为程序的路由和扩展使用Node代理 404
技巧103 使用集群保持程序的扩展性和弹性 408
12.3 维护 413
技巧104 包的优化 413
技巧105 日志和日志服务 415
12.4 更多关于Node程序的扩展性和弹性的备注 418
12.5 总结 419
第三部分 编写模块 422
13 编写模块,掌握Node的所有 422
13.1 头脑风暴 424
13.1.1 更快的斐波那契模块 424
技巧106 计划编写我们的模块 425
技巧107 验证我们模块的想法 427
13.2 创建package.json文件 433
技巧108 创建package.json文件 433
技巧109 依赖处理 436
技巧110 语义化版本号 441
13.3 用户体验 444
技巧111 添加可执行脚本 444
技巧112 在本地测试模块 446
技巧113 在不同版本Node中测试 448
13.4 发布 451
技巧114 发布模块 451
技巧115 使用私有模块 453
13.5 总结 455
A 社区 457