在第1章中,我们曾简单介绍过异步I/O。“异步”这个名词其实早就诞生了,但它的大规模流行却是在Web 2.0浪潮中,它伴随这AJAX的第一个A(Asynchronous)席卷了Web。Node在出现之前,最习惯异步编程的程序员莫过于前端工程师了。前端编程算GUI编程的一种,其中充斥了各种Ajax和事件,这些都是典型的异步应用场景。
但事实上,异步早就存在于操作系统的底层。在底层系统中,异步通过信号量、消息等方式有了广泛的应用。意外的是,在绝大多数高级编程语言中,异步并不多件,疑似被屏蔽了一般。造成这个现象的主要原因也许令人惊讶:程序员不太适合通过异步来进行程序设计。
PHP这门语言的设计最能体现这个观点。它对调用层不仅屏蔽了异步,甚至连多线程都不提供。PHP语言从头到脚都是以同步阻塞的方式来执行的。它的优点十分明显,利于程序员顺序编写业务逻辑;它的缺点在小规模站点中基本不存在,但是在复杂的网络应用中,阻塞导致它无法更好的并发。
而在其它语言中,尽管可能存在异步的API,但是程序员还是习惯采用同步的方式来编写应用。在众多高级编程语言或运行平台中,将异步作为主要编程方式和设计理念的,Node是首个。
伴随着异步I/O的还有事件驱动和单线程,它们构成Node的基调。Ryan Dahl 正是基于这几个因素设计了Node。Ryan Dahl最初期望设计出一个高性能的Web服务器,后来则演变成了一个可以基于它构建各种高速、可伸缩网络应用的平台,因为一个Web服务器已经完全无法涵盖和代表它的能力了。尽管它不再是一个服务器,但是可以基于它搭建更多更丰富、更强大的网络应用。
与Node的事件驱动、异步I/O设计理念比较相近的一个知名产品为Nginx。Nginx采用纯C编写,性能表现非常优异。它们的区别在于,Nginx具备面向客户端管理连接的强大能力,但是它的背后依然受限于各种同步方式的编程语言。但Node却是全方位的,既可以作为服务器端去处理客户端带来的大量并发请求,也能作为客户端向网络中的各个应用进行并发请求。
Web的含义是网,Node的表现就如它的名字一样,是网络中灵活的一个节点。
- 目录
- 第1章 Node 简介
- 1.1 Node 的诞生历程
- 1.2 Node 的命名与起源
- 1.2.1 为什么是 JavaScript
- 1.2.2 为什么叫 Node
- 1.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.2 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.5 事件驱动与高性能服务器