深入浅出node.js:2 模块机制
经历了长长的后天努力过程,JavaScript不断被类聚和抽象,以更好地组织业务逻辑。从另一个角度而言,它也道出了JavaScript先天就缺乏一项功能:模块。
在其他高级语言中,Java有类文件,Python有import机制,Ruby有require,PHP有include和require。而JavaScript通过<script>标签引入代码的方式显得杂乱无章,语言自身毫无组织和约束能能力。不得不用命名空间等方式人为地约束代码,以求达到安全和易用的目的。
2.1 CommonJS规范
官方规范(ECMAScript)后端JavaCript的规范,缺乏:
- 没有模块系统
- 标准库较少:
- 没有标准接口:
- 缺乏包管理系统:基本没有自动加载和安装依赖的能力
为此提出CommonJS,目前,它依旧在成长中,这些规范涵盖了模块、二进制、Buffer、字符集编码、IO流、进程环境、文件系统、套接字、单元测试、Web服务器网关接口、包管理等。
CommonJS的模块规范:主要分为模块引用、模块定义和模块标识3部分。
2.2 Node的模块实现
在Node中引入模块,需要经历路径分析、文件定位和编译执行3个步骤。
分为核心模块(启动时加载)和文件模块(用户编写的,动态加载)
优先从缓存加载:浏览器仅仅缓存文件,而Node缓存的是编译和执行之后的对象。
路径分析和文件定位:
模块编译:Node会新建一个模块对象,然后根据路径载入并编译,缓存在Module._cache对象上,以提高二次引入的性能。
2.3 核心模块
分为C/C++编写的(src目录下)和JavaScript编写(lib目录下)
JavaScript核心模块的编译过程:
C/C++核心模块的编译过程:
核心模块的引入:require("os")
编写核心模块:
2.4 C/C++扩展模块
JavaScript的一个典型弱点就是位运算,只有double型的数据类型,在进行位运算的过程中,需要将double型转换为int型
应用中会频繁出现位运算的需求。
2.5 模块调用栈
模块之间的调用关系
2.6 包与NPM
CommonJS的包规范的定义:有包结构和包描述文件两个部分组成。
包结构:
- package.json:包描述文件
- bin:
- lib:存放JavaScript代码的目录
- doc:
- test:
包描述文件与NPM:P51
2.7 前后端共用模块
模块的侧重点:
AMD规范:CommonJS模块规范的一个延伸
CMD规范有国内的玉伯提出
兼容多种模块规范: