Node.js 实战
Node.js 实战
编辑推荐
作为 JavaScript 服务器,Node 支持可伸缩的高性能 Web 应用,极大简化了聊天、游戏和实时数据分析这样的事件驱动实时应用程序的开发,其生态系统也生机勃勃,模块、工具、库,应有尽有。 本书是在《Node.js 实战》基础上打造的全新著作,由多位 Node 核心框架构建者和经验丰富的 Web 开发人员执笔,结合大量实例介绍如何用 JavaScript 和 Node 创建高性能的 Web 服务器,涵盖异步编程、状态管理、事件驱动编程等关键设计理念,旨在帮助读者成功晋级全栈开发。
- ·前端系统构建
- ·服务器端框架选择
- ·如何用 Express 从头开始搭建 Web 程序
- ·与数据库的交互
- ·掌握非阻塞 I/O
- ·Node 的事件轮询
- ·测试与部署
- ·Web 程序模板
- ·用 Node 开发命令行工具和桌面软件
内容简介
本书是 Node.js 的实战教程,涵盖了为开发产品级 Node 应用程序所需要的一切特性、技巧以及相关理念。 从搭建 Node 开发环境,到一些简单的演示程序,到开发复杂应用程序所必不可少的异步编程。D2 版介绍了全栈 kai 发者所需的全部技术,包括前端构建系统、选择 Web 框架、在 Node 中与数据库的交互、编写测试和部署 Web 程序,等等。
作者简介
亚历克斯·杨(Alex Young),经验丰富的 Webkai 发者,广受欢迎的 JavaScript 社区 DailyJS 创始人。目前任职于 Apple。另著有《Node.js 硬实战》。
布拉德利·马克(Bradley Meck),TC39 和 Node.js 基金会成员。业余时间醉心于为 JavaScript 制作工具、园艺和指导学生。
麦克·坎特伦(Mike Cantelon),Node.js 核心框架贡献者,Node 社区活跃分子,培训师和演讲人。
蒂姆·奥克斯利(Tim Oxley),JavaScript(Node.js/React)自由撰稿人。
马克·哈特(Marc Harter),Node.js 核心框架贡献者。
T.J. 霍洛瓦丘(T.J.Holowaychuk),参与开发了很多 Node.js 模块,包括流行的 Express 框架。
内森·拉伊利赫(Nathan Rajlich),大名鼎鼎的 TooTallNate,Node.js 核心代码提交者。
目录
第 一部分 Node 基础知识介绍
第 1 章 欢迎进入 Node.js 的世界 2
- 1.1 一个典型的 Node Web 应用程序 2
- 1.1.1 非阻塞 I/O 3
- 1.1.2 事件轮询 4
- 1.2 ES2015、Node 和 V8 5
- 1.2.1 Node 与 V8 7
- 1.2.2 使用特性组 8
- 1.2.3 了解 Node 的发布计划 8
- 1.3 安装 Node 8
- 1.4 Node 自带的工具 9
- 1.4.1 npm 9
- 1.4.2 核心模块 10
- 1.4.3 调试器 11
- 1.5 三种主流的 Node 程序 12
- 1.5.1 Web 应用程序 12
- 1.5.2 命令行工具和后台程序 13
- 1.5.3 桌面程序 14
- 1.5.4 适合 Node 的应用程序 14
- 1.6 总结 15
第 2 章 Node 编程基础 16
- 2.1 Node 功能的组织及重用 16
- 2.2 开始一个新的 Node 项目 18
- 2.3 用 module.exports 微调模块的创建 20
- 2.4 用 node_modules 重用模块 22
- 2.5 注意事项 23
- 2.6 使用异步编程技术 24
- 2.7 用回调处理一次性事件 25
- 2.8 用事件发射器处理重复性事件 28
- 2.8.1 事件发射器示例 28
- 2.8.2 响应只应该发生一次的事件 29
- 2.8.3 创建事件发射器:一个 PUB/SUB 的例子 29
- 2.8.4 扩展事件监听器:文件监视器 32
- 2.9 异步开发的难题 34
- 2.10 异步逻辑的顺序化 35
- 2.11 何时使用串行流程控制 36
- 2.12 实现串行化流程控制 37
- 2.13 实现并行化流程控制 39
- 2.14 利用社区里的工具 41
- 2.15 总结 43
第 3 章 Node Web 程序是什么 44
- 3.1 了解 Node Web 程序的结构 45
- 3.1.1 开始一个新的 Web 程序 45
- 3.1.2 跟其他平台比一比 47
- 3.1.3 然后呢 47
- 3.2 搭建一个 RESTful Web 服务 47
- 3.3 添加数据库 50
- 3.3.1 制作自己的模型 API 51
- 3.3.2 让文章可读并把它存起来 53
- 3.4 添加用户界面 54
- 3.4.1 支持多种格式 54
- 3.4.2 渲染模板 55
- 3.4.3 用 npm 管理客户端依赖项 56
- 3.5 总结 57
- D 二部分 Node 的 Web 开发
第 4 章 前端构建系统 60
- 4.1 了解基于 Node 的前端开发 60
- 4.2 用 npm 运行脚本 61
- 4.2.1 创建定制的 npm 脚本 62
- 4.2.2 配置前端构建工具 63
- 4.3 用 Gulp 实现自动化 63
- 4.3.1 把 Gulp 添加到项目中 64
- 4.3.2 Gulp 任务的创建及运行 64
- 4.3.3 监测变化 66
- 4.3.4 在大项目中把任务分散到不同文件中 66
- 4.4 用 Webpack 构建 Web 程序 67
- 4.4.1 使用打包器和插件 67
- 4.4.2 配置和运行 Webpack 68
- 4.4.3 用 Webpack 开发服务器 68
- 4.4.4 加载 CommonJS 模块和静态资源 70
- 4.5 总结 71
第 5 章 服务器端框架 72
- 5.1 用户画像 72
- 5.1.1 菲尔:代理 kai 发者 73
- 5.1.2 纳迪娜:开源 kai 发者 73
- 5.1.3 爱丽丝:产品 kai 发者 73
- 5.2 框架是什么 74
- 5.3 Koa 74
- 5.3.1 设置 76
- 5.3.2 定义路由 76
- 5.3.3 REST API 77
- 5.3.4 优点 77
- 5.3.5 弱点 77
- 5.4 Kraken 77
- 5.4.1 设置 77
- 5.4.2 定义路由 78
- 5.4.3 REST API 79
- 5.4.4 优点 79
- 5.4.5 弱点 79
- 5.5 hapi 79
- 5.5.1 设置 80
- 5.5.2 定义路由 80
- 5.5.3 插件 81
- 5.5.4 REST API 82
- 5.5.5 优点 83
- 5.5.6 弱点 83
- 5.6 Sails.js 83
- 5.6.1 设置 83
- 5.6.2 定义路由 84
- 5.6.3 REST API 84
- 5.6.4 优点 85
- 5.6.5 弱点 85
- 5.7 DerbyJS 85
- 5.7.1 设置 85
- 5.7.2 定义路由 86
- 5.7.3 REST API 87
- 5.7.4 优点 87
- 5.7.5 弱点 87
- 5.8 Flatiron.js 87
- 5.8.1 设置 88
- 5.8.2 定义路由 88
- 5.8.3 REST API 89
- 5.8.4 优点 90
- 5.8.5 弱点 90
- 5.9 LoopBack 90
- 5.9.1 设置 91
- 5.9.2 定义路由 92
- 5.9.3 REST API 92
- 5.9.4 优点 93
- 5.9.5 弱点 93
- 5.10 比较 93
- 5.11 编写模块化代码 95
- 5.12 用户选择 95
- 5.13 总结 95
第 6 章 深入了解 Connect 和 Express 96
- 6.1 Connect 96
- 6.1.1 创建 Connect 程序 97
- 6.1.2 了解 Connect 中间件的工作机制 97
- 6.1.3 组合中间件 98
- 6.1.4 中间件的顺序 98
- 6.1.5 创建可配置的中间件 99
- 6.1.6 使用错误处理中间件 101
- 6.2 Express 103
- 6.2.1 生成程序框架 103
- 6.2.2 Express 和程序的配置 107
- 6.2.3 渲染视图 109
- 6.2.4 Express 路由入门 113
- 6.2.5 用户认证 120
- 6.2.6 注册新用户 124
- 6.2.7 已注册用户登录 130
- 6.2.8 用户加载中间件 133
- 6.2.9 创建 REST API 134
- 6.2.10 启用内容协商 140
- 6.3 总结 142
第 7 章 Web 程序的模板 143
- 7.1 用模板保持代码的整洁性 143
- 7.2 Embedded JavaScript 的模板 147
- 7.2.1 创建模板 148
- 7.2.2 将 EJS 集成到你的程序中 149
- 7.2.3 在客户端程序中使用 EJS 150
- 7.3 使用 Mustache 模板语言与 Hogan 151
- 7.3.1 创建模板 151
- 7.3.2 Mustache 标签 151
- 7.3.3 微调 Hogan 154
- 7.4 用 Pug 做模板 154
- 7.4.1 Pug 基础知识 155
- 7.4.2 Pug 模板中的逻辑 157
- 7.4.3 组织 Pug 模板 159
- 7.5 总结 163
第 8 章 存储数据 164
- 8.1 关系型数据库 164
- 8.2 PostgreSQL 164
- 8.2.1 安装及配置 164
- 8.2.2 创建数据库 165
- 8.2.3 从 Node 中连接 Postgres 165
- 8.2.4 定义表 166
- 8.2.5 插入数据 166
- 8.2.6 更新数据 166
- 8.2.7 查询数据 167
- 8.3 Knex 167
- 8.3.1 查询构建器 168
- 8.3.2 用 Knex 实现连接和查询 168
- 8.3.3 切换数据库 170
- 8.3.4 注意抽象漏洞 171
- 8.4 MySQL 和 PostgreSQL 171
- 8.5 ACID 保证 172
- 8.5.1 原子性:无论成败,事务必须整体执行 172
- 8.5.2 一致性:始终确保约束条件 172
- 8.5.3 隔离性:并发事务不会相互干扰 172
- 8.5.4 耐用性:事务是永久性的 173
- 8.6 NoSQL 173
- 8.7 分布式数据库 173
- 8.8 MongoDB 174
- 8.8.1 安装和配置 174
- 8.8.2 连接 MongoDB 174
- 8.8.3 插入文档 175
- 8.8.4 查询 176
- 8.8.5 使用 MongoDB 标识 177
- 8.8.6 使用复制集 178
- 8.8.7 了解写关注 180
- 8.9 键 / 值存储 181
- 8.10 Redis 181
- 8.10.1 安装和配置 182
- 8.10.2 初始化 182
- 8.10.3 处理键 / 值对 183
- 8.10.4 处理键 184
- 8.10.5 编码与数据类型 184
- 8.10.6 使用散列表 186
- 8.10.7 使用列表 186
- 8.10.8 使用集合 187
- 8.10.9 用频道实现发布 / 订阅功能 188
- 8.10.10 提升性能 189
- 8.11 嵌入式数据库 189
- 8.12 LevelDB 190
- 8.12.1 LevelUP 与 LevelDOWN 190
- 8.12.2 安装 191
- 8.12.3 API 概览 191
- 8.12.4 初始化 191
- 8.12.5 键 / 值编码 192
- 8.12.6 键 / 值对的读写 192
- 8.12.7 可插拔的后台 193
- 8.12.8 模块化数据库 194
- 8.13 昂贵的序列化和反序列化 195
- 8.14 浏览器内存储 196
- 8.14.1 Web 存储:localStorage 和 sessionStorage 196
- 8.14.2 值的读写 197
- 8.14.3 localForage 199
- 8.14.4 读和写 199
- 8.15 存储托管 200
- 8.16 选哪个数据库 201
- 8.17 总结 201
第 9 章 测试 Node 程序 202
- 9.1 单元测试 203
- 9.1.1 assert 模块 203
- 9.1.2 Mocha 206
- 9.1.3 Vows 211
- 9.1.4 Chai 213
- 9.1.5 Should.js 214
- 9.1.6 Sinon.JS 的探测器和存根 216
- 9.2 功能测试 218
- 9.3 处理失败的测试 221
- 9.3.1 获取更详细的日志 221
- 9.3.2 更好的栈跟踪 223
- 9.4 总结 224
第 10 章 Node 程序的部署及运维 225
- 10.1 安置 Node 程序 225
- 10.1.1 平台即服务 226
- 10.1.2 服务器 227
- 10.1.3 容器 228
- 10.2 部署的基础知识 229
- 10.2.1 从 Git 库部署 229
- 10.2.2 保证 Node 不掉线 230
- 10.3 在线时长和性能的 zui 大化 231
- 10.3.1 用 Upstart 保证在线时长 232
- 10.3.2 集群 API:充分利用多核处理器 233
- 10.3.3 静态文件及代理 235
- 10.4 总结 236
第三部分 超越 Web 开发
第 11 章 编写命令行程序 238
- 11.1 了解惯例和理念 238
- 11.2 parse-json 239
- 11.3 使用命令行参数 239
- 11.3.1 解析命令行参数 239
- 11.3.2 验证参数 240
- 11.3.3 将 stdin 作为文件传递 241
- 11.4 用 npm 分享命令行工具 242
- 11.5 用管道连接脚本 243
- 11.5.1 将数据通过管道传给 parse-json 243
- 11.5.2 处理错误和退出码 243
- 11.5.3 在 Node 中使用管道 245
- 11.5.4 管道与命令的执行顺序 246
- 11.6 解释真正的脚本 247
- 11.7 总结 247
第 12 章 用 Electron 征服桌面 248
- 12.1 认识 Electron 248
- 12.1.1 Electron 的技术栈 249
- 12.1.2 界面设计 250
- 12.2 创建一个 Electron 程序 250
- 12.3 搭建完整的桌面端程序 252
- 12.3.1 引导 React 与 Babel 253
- 12.3.2 安装依赖项 253
- 12.3.3 设置 Webpack 254
- 12.4 React 程序 255
- 12.4.1 定义 Request 组件 256
- 12.4.2 定义 Response 组件 258
- 12.4.3 React 组件之间的通信 261
- 12.5 构建与分发 261
- 12.5.1 用 Electron 打包器构建程序 261
- 12.5.2 打包 262
- 12.6 总结 263
- 附录 A 安装 Node 264
- 附录 B 自动化的网络抓取 267
- 附录 C Connect 的官方中间件 277
- 术语表 307