《Node.js 高级编程》
作者简介
- Pedro Teixerra 高产,开源项目程序员
- Node 社区活跃成员,Node公司的创始人之一.
- 10岁开始编程,Visual Basic、C、C++、Java、PHP、Ruby、Javascript
- 构建模块Fugue、Alfred.js、Carrier、Nock
前言
- 大学期间,构建了多线程TCP服务器
- 事实证明,让同步精细化(最大化资源和时间)和正确化(避免死锁),比较难处理。
- 从事UNIX和关注Java,然后落到PHP和Ruby。才到JavaScipt
- 2010开始接触Node.js
- 高性能,可伸缩,易用性,吸引了作者。
读者对象
- 熟练js或服务器编程
- http,tcp
组织结构
- 模块,缓冲区,事件发射器以及定时器
- 文件,网络
- 测试模块,调试,异步回调
- web应用
- 源码:www.wrox.com/remtitle.cgi?isbn=P010093766
- 讨论,p2p.wrox.com
目录
- 安装Node
- Node 简介
- 加载模块
- 应用缓冲区处理、编码和解码
- 使用事件驱动发射器模式简化事件
- 使用定时器制定函数执行计划
- 查询和读写文件
- 创建和控制外部进程
- 读写数据流
- 构建TCP服务器
- 构建HTTP服务器
- 构建TCP客户端
- 创建HTTP请求
- 使用用户数据报?
- 使用TLS/SSL保证服务器的安全
- 用HTTPS保证HTTP服务器的安全
- 测试模块及其应用程序
- 调试模块
- 控制回调流程
- 构建使用HTTP中间件
- 用Express.js创建Web应用程序
- 使用Socket.IO创建通用的实时Web应用
- 使用node-mysql
- 使用Nano连接CouchDB
- 使用Mongoose
第一章,安装内容(略过)
第二章 Node 简介
本章提要
- 什么是事件驱动编程风格?使用这种风格有什么优点?
- Node.js和JavaScript如何简化了事件驱动编程?
痛点
- 单用户,单进程
- 不具备好的伸缩性
- 管理众多进程在内存和上下文切换代价沉重。
- 较好方案,多线程编程模型
- 轻量级。
- 程序员并不知道,哪些进程在执行。
- 线程锁,信号量。(会有随机发生的危险错误)
- 协同多线程
- 显式让CPU为其他线程分配
- 基于普通多线程,也容易出错
2.1 事件驱动编程风格介绍
定义
程序执行流程取决于事件的编程风格,事件由事件处理程序或者事件回调函数进行处理。
query_finished = function (result){
do_something_with (result);
}
query('select * from posts where id = 1 ',query_finished);
这种I/O操作时,不会发生阻塞。
功能
- 事件监测
- 事件触发
特点
- 在任一给定时刻,最多运行一个事件处理程序
- 事件处理程序可以不间断地运行直到结束
- 节省内存+节省执行时间
2.2 Node 和 JavaScript 如何简化异步应用程序的编写
Node作者,Ryan Dahl构建C语言平台,复杂。转Lua,阻塞与非阻塞在一起就混乱。
转向JavaScript,具有闭包+第一类函数,适合事件驱动。
2.2.1 什么是闭包
就函数,但是它可以继承并访问它自身被声明的那个作用域的变量。
回调函数【核心】
记住了所在上下文,并且可以访问上下文的所有变量。
全局存储变量,不是好做法。(需要闭包,避免污染)
(function(){
var clickCount = 0;
$('button#mybutton').click(function(){
clickCount+=;
alert('Clicked ' + clickCount + ' times.');
});
})
2.2.2 闭包如何辅助异步编程
好处
- 可以通过将状态变量传递给函数不必维护它就能进行事件驱动
- 闭包会为你维护状态变量
总结
- 事件驱动
- JavaScript,有第一类函数和闭包