第1章 概述 1
1.1 了解Node.js 1
1.2 安装 1
1.2.1 源代码安装 2
1.2.2 验证安装 2
1.3 hello world 3
1.4 其他准备工作 3
1.4.1 准备一个开发环境 4
1.4.2 准备一份源代码 4
1.4.3 准备一个类Linux环境 4
1.4.4 熟悉控制台 4
1.4.5 准备一份文档 5
第2章 了解npm 6
2.1 package.json 7
2.1.1 生成package.json 7
2.1.2 第三方模块 8
2.2 使用npm install 8
2.3 node_modules 10
2.4 控制模块版本 11
2.4.1 子模块的版本 12
2.4.2 package-lock.json 12
2.5 使用npm构建项目 13
2.6 关于版本升级 15
小结 15
思考与问题 16
第3章 JavaScript核心 17
3.1 基本类型 18
3.1.1 布尔值 18
3.1.2 数字 19
3.1.3 字符串 19
3.1.4 正则表达式 21
3.1.5 比较相等 23
3.2 数据结构 24
3.2.1 数组 24
3.2.2 TypedArray 28
3.2.3 栈 29
3.2.4 链表 29
3.2.5 二叉树 30
3.2.6 Set 31
3.2.7 Map 32
3.3 变量与作用域 33
3.3.1 声明变量 33
3.3.2 变量提升 34
3.3.3 作用域 36
3.3.4 this 37
3.4 函数 37
3.4.1 箭头函数 37
3.4.2 覆盖原生函数 38
3.4.3 闭包 39
3.4.4 函数式编程 40
3.5 对象 45
3.5.1 创建对象 45
3.5.2 Symbol属性 47
3.5.3 对象遍历器 48
3.6 类与继承 51
3.6.1 定义一个类 51
3.6.2 继承 52
3.7 实战:编写字节码执行器 53
3.7.1 指令集 53
3.7.2 编写执行器 56
小结 59
思考与问题 59
第4章 编写结构化程序 60
4.1 module 63
4.1.1 哪些模块需要引入 64
4.1.2 require()及其运行机制 64
4.1.3 ES6 module 67
4.2 process 67
4.2.1 属性和方法 67
4.2.2 预定义事件 69
4.3 Events 70
4.3.1 使用 70
4.3.2 事件监听的实现原理 70
4.3.3 继承Events模块 71
4.4 文件系统 71
4.4.1 源码实现 71
4.4.2 文件系统API 72
4.4.3 同步和异步 74
4.4.4 关于文件路径 75
4.5 Stream 76
4.5.1 流式数据 76
4.5.2 Stream API 77
4.5.3 可读流 77
4.5.4 可写流 79
4.5.5 和文件系统API的比较 82
4.6 Child Process 84
4.6.1 spawn() 84
4.6.2 fork() 85
4.7 处理CPU密集型任务 87
4.8 实战:控制CPU占用曲线 89
4.8.1 单核环境 90
4.8.2 适应多核 91
4.8.3 精准控制 92
4.8.4 获取CPU占用率 94
4.9 C++扩展 95
4.9.1 V8 API 96
4.9.2 N-API 98
4.9.3 封装bitset 99
4.9.4 封装sleep函数 102
小结 104
思考与问题 104
第5章 组织异步代码 105
5.1 回调函数 106
5.1.1 回调函数的执行过程 106
5.1.2 回调的返回值 106
5.2 Promise 107
5.2.1 什么是Promise 108
5.2.2 then 109
5.2.3 使用Promise处理异步任务 110
5.2.4 使用Promise封装现有方法 114
5.2.5 运行多个Promise 115
5.2.6 更多API 118
5.3 async/await 118
5.3.1 背景 118
5.3.2 async函数 119
5.3.3 await关键字 119
5.3.4 错误处理 121
5.3.5 循环中的async 121
5.3.6 事件循环与async 122
5.4 动手实现Promise 122
5.4.1 从外到内 122
5.4.2 适应异步过程 123
5.4.3 实现链式调用 124
5.4.4 连续异步操作 126
小结 128
思考与问题 128
第6章 Web应用 129
6.1 Web服务器 129
6.1.1 使用HTTP模块 130
6.1.2 server/request/response 131
6.1.3 处理HTTP请求 135
6.1.4 模板引擎与页面渲染 140
6.1.5 数据库的交互 143
6.2 使用express 144
6.2.1 基本概念 145
6.2.2 静态文件服务 148
6.2.3 路由服务 148
6.2.4 中间件系统 150
6.2.5 迷你express 154
6.2.6 cookie 156
6.2.7 session 158
6.2.8 OAuth 161
6.2.9 与前端应用的整合 165
6.2.10 提高服务器性能 167
6.3 集群和进程管理 169
6.3.1 使用Cluster模块 169
6.3.2 负载均衡 171
6.3.3 服务器安全 173
6.4 HTTPS 175
6.4.1 对称加密和非对称加密 176
6.4.2 升级HTTPS服务器 177
6.5 全双工通信 177
6.5.1 轮询和长连接 177
6.5.2 使用WebSocket 178
6.5.3 WebSocket握手 179
6.5.4 HTTP/2 180
6.6 HTTP客户端 181
6.7 API文档 183
6.7.1 Swagger UI 183
6.7.2 API描述文件 184
小结 186
思考与问题 187
第7章 图形化应用 188
7.1 桌面应用 188
7.1.1 Java Swing 188
7.1.2 WPF 189
7.1.3 Qt 190
7.2 Electron 190
7.2.1 快速开始 191
7.2.2 页面和后台的交互 194
7.2.3 实现菜单栏 195
7.2.4 多窗口管理 199
小结 200
思考与问题 200
第8章 测试与调试 201
8.1 测试框架 201
8.1.1 断言系统 201
8.1.2 使用jasmine 202
8.1.3 覆盖率测试 208
8.1.4 压力测试 209
8.2 调试 210
8.2.1 调试Node代码 211
8.2.2 调试C++源代码 211
8.2.3 CPU profile 212
小结 215
思考与问题 215
附录A 基础概念 216
A.1 编程语言和运行时 216
A.1.1 编程语言的产生 217
A.1.2 什么是运行时 217
A.1.3 为什么是JavaScript 217
A.1.4 编译Node源码 217
A.1.5 Node架构 218
A.1.6 js2c 220
A.2 关于操作系统 221
A.2.1 进程和线程 221
A.2.2 理解高并发 222
A.2.3 理解非阻塞 222
A.3 事件循环 222
A.3.1 各阶段概述 223
A.3.2 阻塞事件循环 224
A.3.3 process.nextTick 225
A.3.4 模拟事件循环 227
A.3.5 microTask 和macroTask/task 228
附录B 网络通信基础 232
B.1 发生了什么 232
B.1.1 寻址 232
B.1.2 建立连接 232
B.1.3 通信 233
B.2 socket接口 233
B.2.1 创建socket 234
B.2.2 建立连接 234
B.2.3 接收消息 234
B.3 socket与并发 234
B.3.1 select和poll 235
B.3.2 epoll 236
附录C Node和其他语言的比较 237
C.1 面向对象 237
C.2 C语言中的Stream 238
C.3 关于I/O的处理 239
C.4 C# Task 239
附录D Docker 241
D.1 容器技术 241
D.1.1 镜像 241
D.1.2 容器与镜像 242
D.1.3 运行 242
D.2 运行MySQL 243
D.3 使用MongoDB 243
D.4 Dockerfile 244