第二章、模块机制
1. CommonJs规范的目的是希望JavaScript能够在任何地方运行
2. 一直以来,JavaScript存在的缺陷有:
(1)、没有模块系统
(2)、标准库较少
(3)、没有标准接口
(4)、缺乏包管理系统
CommonJS规范的提出,是为了弥补当前JavaScript没有标准的缺陷,以达到向Python、Ruby和Java具备开发大型应用的基础能力,而不是停留在小脚本程序的阶段。它们期望用CommonJS API写出的应用可以具备跨宿主环境执行的能力,使得Javascript可以开发服务器端Javascript应用、命令行应用、桌面图形界面应用程序、混合应用等。
3. TODO(CommonJS规范,查阅相关文档)
CommonJs规范涵盖了模块、二进制、Buffer、字符集编码、I/O流、进程环境、文件系统、套接字、单元测试、Web服务器网关接口、包管理等
4、CommonJs的模块规范.
CommonJS对模块的定义非常简单:包含了模块引用、模块定义、模块标识等3个部分。
Var math = require(‘math’);
将方法挂载在exports对象上作为属性可以定义导出的方式.
exports.add = function(){
}
每个模块都有自己独立的空间,它们互不干扰。
5、Node中引用模块,需要经历路径分析、文件定位、编译执行等3个步骤。
在Node中,模块分为两大类:一类是Node提供的模块,称为核心模块,另一类是用户编写的模块,称为文件模块。核心模块在Node源代码的编译过程中,编译进了二进制可执行文件。Node进程启动时,部分核心模块被直接加载进内存中,所以这部分核心模块引入时,文件定位和编译执行这两个步骤可以省略掉,并且在路径分析中优先判断,所以它的加载速度是最快的。文件模块则是在运行时动态加载,需要完整的路径分析,文件定位、编译执行等过程,速度比核心模块慢。
6、在模块加载的过程中,Node会优先从缓存加载,而且核心模块的缓存检查优先于文件模块的缓存检查。从缓存加载的优化策略使得二次引入时不需要路径分析、文件定位和编译执行的过程,大大提高了再次加载模块的效率。
7、require Node模块的几种方式(路径分析)
(1)、核心模块如fs,http, path等
(2)、以.或者..开始的相对路径
(3)、绝对路径
(4)、非路径形式的模块
8、可以用strace等追踪Node文件模块的路径分析和加载过程:
Strace –o trace –p node module.js
Node对文件模块的路径分析过程是从当前路径开始,逐级向上查找,直至查找到模块或者根目录
9、require Node模块的过程中,会出现标识符中不包含文件扩展名的情况。Node会按照.js, .node, .json的次序补充。在尝试的过程中,需要调用fs模块同步阻塞地判断文件是否存在,由于Node是单线程的,所以会有一定的性能问题。一个小诀窍是,在require文件模块的时候,带上模块的扩展名。
10、在编译的过程中,Node对获取的javascript文件内容进行了包装,生成的内容类似于:
(function( exports, require, module,__filename, __dirname ){
varmath = require('math');
exports.area= function( radius ){
returnMath.PI * radius * radius;
};
});
这样每一个模块都进行了作用域的隔离,不至于污染全局变量。
11、Node对.json文件的编译最简单:Node通过fs模块同步读取JSON文件的内容之后,调用JSON.parse方法得到对象。JSON文件在用做项目的配置文件时比较有用,如果你定义了一个json文件作为配置,那么不必调用fs去异步读取和解析,直接调用require引入即可。
12、Node对模块规范的实现,在一定程度上解决了变量依赖、依赖关系等代码组织性问题。而包的出现,则在模块的基础上进一步组织了Javascript代码。
13、Node包管理工具NPM