在JavaScript的发展历程中,它主要在浏览器前端发光发热。由于官方规范(ECMAScript)规范化的时间较早,规范涵盖的范畴非常小。这些规范中包含词法、类型、上下文、表达式、声明(statement)、方法、对象等语言的基本要素。在实际应用中,JavaScript的表现能力取决于宿主环境中的API支持程度。在Web1.0时代,只有对DOM、BOM等基本的支持。随着Web2.0的推进,HTML5崭露头角,它将Web网页带入Web应用的时代,在浏览器中出现了更多、更强大的API供JavaScript调用,这得感谢W3C组织对HTML5规范的推进以及各大浏览器厂商对规范的支持。但是,Web在发展,浏览器中出现了更多标准的API,这些过程发生在前端,后端JavaScript的规范却远远落后。对于JavaScript自身而言,它的规范依然是薄弱的,还有以下缺陷:
* **没有模块系统**。
* **标准库较少**。ECMAScript仅定义了部分核心库,对于文件系统,I/O流等常见需求却没有标准的API。就HTML5的发展状况而言,W3C标准化在一定意义上是在推进这个过程,但它仅限于浏览器端。
* **没有标准接口**。在JavaScript中,几乎没有定义过如Web服务器或者数据库之类的标准统一接口。
* **缺乏包管理系统**。这导致JavaScript应用中基本没有自动加载和安装依赖的能力。
CommonJS规范的提出,主要是为了弥补当前JavaScript没有标准的缺陷,以达到像Python、Ruby和Java具备开发大型应用的基础能力,而不是停留在小脚本程序的阶段。他们期望那些用CommonJS API写出的应用可以具备跨宿主环境执行的能力,这样不仅可以利用JavaScript开发富客户端应用,还可以编写以下应用:
* 服务器端JavaScript应用程序。
* 命令行工具。
* 桌面图形界面应用程序。
* 混合应用(Titanium和Adobe AIR等形式的应用)。
如今,CommonJS中大部分规范虽然依旧是草案,但是已经初显成效,为JavaScript开发大型应用程序指明了一条非常棒的道路。目前,它依旧在成长中,这些规范涵盖了模块、二进制、Buffer、字符集编码、I/O流、进程环境、文件系统、套接字、单元测试、Web服务器网关接口、包管理等。
理论和实践总是相互影响和促进的,Node能以一种比较成熟的姿态出现,离不开CommonJS规范的影响。在服务器端,CommonJS能以一种寻常的姿态写进各个公司的项目代码中,离不开Node优异的表现。实现的优良表现离不开规范最初优秀的设计,规范因实现的推广而得以普及。下图是Node与浏览器以及W3C组织、CommonJS组织、ECMAScript之间的关系,共同构成了一个繁荣的生态系统:
![](https://box.kancloud.cn/2016-08-25_57bdc8fb69871.png)
Node借鉴CommonJS的Modules规范实现了一套非常易用的模块系统,NPM对Packages规范的完好支持使得Node应用在开发过程中事半功倍。在本章中,我们主要就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 事件驱动与高性能服务器