内容简介
《深入浅出Node.js》由首章Node介绍为索引,涉及Node的各个方面,主要内容包含模组机制的揭示、异步I/O实现原理的展现、异步编程的探讨、记忆体控制的介绍、二进制数据Buffer的细节、Node中的网路编程基础、Node中的Web开发、进程间的讯息传递、Node测试以及通过Node构建产品需要的注意事项。最后的附录介绍了Node的安装、调试、编码规範和NPM仓库等事宜。作者简介
朴灵,真名田永强,文艺型码农,就职于阿里巴巴数据平台,资深工程师,Node.js布道者,写了多篇文章介绍Node.js的细节。活跃于CNode社区,是线下会议NodeParty的组织者和JSConfChina(沪JS和京JS)的组织者之一。热爱开源,多个Node.js模组的作者。叩首问路,码梦为生。
作品目录
第1章 Node简介 1.1 Node的诞生历程 1.2 Node的命名与起源 1.2.1 为什么是JavaScript 1.2.2 为什么叫Node1.3 Node给JavaScript带来的意义 1.4 Node的特点 1.4.1 异步I/O 1.4.2 事件与回调函式 1.4.3 单执行绪 1.4.4 跨平台 1.5 Node的套用场景 1.5.1 I/O密集型 1.5.2 是否不擅长CPU密集型业务 1.5.3 与遗留系统和平共处 1.5.4 分散式套用 1.6 Node的使用者 1.7 参考资源
第2章 模组机制 2.1 CommonJS规範 2.1.1 CommonJS的出发点 2.1.2 CommonJS的模组规範 2.2 Node的模组实现 2.2.1 优先从快取载入 2.2.2 路径分析和档案定位 2.2.3 模组编译 2.3 核心模组 2.3.1 JavaScript核心模组的编译过程 2.3.2 C/C++核心模组的编译过程 2.3.3 核心模组的引入流程 2.3.4 编写核心模组 2.4 C/C++扩展模组 2.4.1 前提条件 2.4.2 C/C++扩展模组的编写 2.4.3 C/C++扩展模组的编译 2.4.4 C/C++扩展模组的载入 2.5 模组调用栈 2.6 包与NPM 2.6.1 包结构 2.6.2 包描述档案与NPM 2.6.3 NPM常用功能 2.6.4 局域NPM 2.6.5 NPM潜在问题 2.7 前后端共用模组 2.7.1 模组的侧重点 2.7.2 AMD规範 2.7.3 CMD规範 2.7.4 兼容多种模组规範 2.8 总结 2.9 参考资源
第3章 异步I/O 3.1 为什么要异步I/O 3.1.1 用户体验 3.1.2 资源分配 3.2 异步I/O实现现状 3.2.1 异步I/O与非阻塞I/O 3.2.2 理想的非阻塞异步I/O 3.2.3 现实的异步I/O 3.3 Node的异步I/O 3.3.1 事件循环 3.3.2 观察者 3.3.3 请求对象 3.3.4 执行回调 3.3.5 小结 3.4 非I/O的异步API 3.4.1 定时器 3.4.2 process.nextTick() 3.4.3 setImmediate() 3.5 事件驱动与高性能伺服器 3.6 总结 3.7 参考资源
第4章 异步编程 4.1 函式式编程 4.1.1 高阶函式 4.1.2 偏函式用法 4.2 异步编程的优势与难点 4.2.1 优势 4.2.2 难点 4.3 异步编程解决方案 4.3.1 事件发布/订阅模式 4.3.2 Promise/Deferred模式 4.3.3 流程控制库 4.4 异步并发控制 4.4.1 bagpipe的解决方案 4.4.2 async的解决方案 4.5 总结 4.6 参考资源
第5章 记忆体控制 5.1 V8的垃圾回收机制与记忆体限制 5.1.1 Node与V8 5.1.2 V8的记忆体限制 5.1.3 V8的对象分配 5.1.4 V8的垃圾回收机制 5.1.5 查看垃圾回收日誌 5.2 高效使用记忆体 5.2.1 作用域 5.2.2 闭包 5.2.3 小结 5.3 记忆体指标 5.3.1 查看记忆体使用情况 5.3.2 堆外记忆体 5.3.3 小结 5.4 记忆体泄漏 5.4.1 慎将记忆体当做快取 5.4.2 关注伫列状态 5.5 记忆体泄漏排查 5.5.1 node-heapdump 5.5.2 node-memwatch 5.5.3 小结 5.6 大记忆体套用 5.7 总结 5.8 参考资源
第6章 理解Buffer 6.1 Buffer结构 6.1.1 模组结构 6.1.2 Buffer对象 6.1.3 Buffer记忆体分配 6.2 Buffer的转换 6.2.1 字元串转Buffer 6.2.2 Buffer转字元串 6.2.3 Buffer不支持的编码类型 6.3 Buffer的拼接 6.3.1 乱码是如何产生的 6.3.2 setEncoding()与string_decoder() 6.3.3 正确拼接Buffer 6.4 Buffer与性能 6.5 总结 6.6 参考资源
第7章 网路编程 7.1 构建TCP服务 7.1.1 TCP 7.1.2 创建TCP伺服器端 7.1.3 TCP服务的事件 7.2 构建UDP服务 7.2.1 创建UDP套接字 7.2.2 创建UDP伺服器端 7.2.3 创建UDP客户端 7.2.4 UDP套接字事件 7.3 构建HTTP服务 7.3.1 HTTP 7.3.2 http模组 7.3.3 HTTP客户端 7.4 构建WebSocket服务 7.4.1 WebSocket握手 7.4.2 WebSocket数据传输 7.4.3 小结 7.5 网路服务与安全 7.5.1 TLS/SSL 7.5.2 TLS服务 7.5.3 HTTPS服务 7.6 总结 7.7 参考资源
第8章 构建Web套用 8.1 基础功能 8.1.1 请求方法 8.1.2 路径解析 8.1.3 查询字元串 8.1.4 Cookie 8.1.5 Session 8.1.6 快取 8.1.7 Basic认证 8.2 数据上传 8.2.1 表单数据 8.2.2 其他格式 8.2.3 附属档案上传 8.2.4 数据上传与安全 8.3 路由解析 8.3.1 档案路径型 8.3.2 MVC 8.3.3 RESTful 8.4 中间件 8.4.1 异常处理 8.4.2 中间件与性能 8.4.3 小结 8.5 页面渲染 8.5.1 内容回响 8.5.2 视图渲染 8.5.3 模板 8.5.4 Bigpipe 8.6 总结 8.7 参考资源
第9章 玩转进程 9.1 服务模型的变迁 9.1.1 石器时代:同步 9.1.2 青铜时代:複製进程 9.1.3 白银时代:多执行绪 9.1.4 黄金时代:事件驱动 9.2 多进程架构 9.2.1 创建子进程 9.2.2 进程间通信 9.2.3 句柄传递 9.2.4 小结 9.3 集群稳定之路 9.3.1 进程事件 9.3.2 自动重启 9.3.3 负载均衡 9.3.4 状态共享 9.4 Cluster模组 9.4.1 Cluster工作原理 9.4.2 Cluster事件 9.5 总结 9.6 参考资源
第10章 测试 10.1 单元测试 10.1.1 单元测试的意义 10.1.2 单元测试介绍 10.1.3 工程化与自动化 10.1.4 小结 10.2 性能测试 10.2.1 基準测试 10.2.2 压力测试 10.2.3 基準测试驱动开发 10.2.4 测试数据与业务数据的转换 10.3 总结 10.4 参考资源
第11章 产品化 11.1 项目工程化 11.1.1 目录结构 11.1.2 构建工具 11.1.3 编码规範 11.1.4 代码审查 11.2 部署流程 11.2.1 部署环境 11.2.2 部署操作 11.3 性能 11.3.1 动静分离 11.3.2 启用快取 11.3.3 多进程架构 11.3.4 读写分离 11.4 日誌 11.4.1 访问日誌 11.4.2 异常日誌 11.4.3 日誌与资料库 11.4.4 分割日誌 11.4.5 小结 11.5 监控报警 11.5.1 监控 11.5.2 报警的实现 11.5.3 监控系统的稳定性 11.6 稳定性 11.7 异构共存 11.8 总结 11.9 参考资源
附录A 安装Node A.1 Windows系统下的Node安装 A.2 Mac系统下Node的安装 A.3 Linux系统下Node的安装 A.4 总结 A.5 参考资源
附录B 调试Node B.1 Debugger B.2 Node Inspector B.2.1 安装Node Inspector B.2.2 错误堆叠 B.3 总结
附录C Node编码规範 C.1 根源 C.2 编码规範 C.2.1 空格与格式 C.2.2 命名规範 C.2.3 比较操作 C.2.4 字面量 C.2.5 作用域 C.2.6 数组与对象 C.2.7 异步 C.2.8 类与模组 C.2.9 注解规範 C.3 最佳实践 C.3.1 冲突的解决原则 C.3.2 给编辑器设定检测工具 C.3.3 版本控制中的hook C.3.4 持续集成 C.4 总结 C.5 参考资源
附录D 搭建局域NPM仓库 D.1 NPM仓库的安装 D.1.1 安装Erlang和CouchDB D.1.2 搭建NPM仓库 D.2 高阶套用 D.2.1 镜像仓库 D.2.2 私有模组套用 D.2.3 纯私有仓库 D.3 总结 D.4 参考资源
















