第二章:模块机制
总结:nodejs遵循commonjs规范,commonjs定义了模块、I/O、二进制、文件等规范,其中最重要的就是nodejs模块规范,下面总结一下nodejs的模块加载:
nodejs的模块分为核心模块和文件模块,核心模块在nodejs源代码编译中,已经编译进了二进制可执行文件中,只要node启动,就已经被加载到内存中,所以加载速度比较快。像文件模块就需要经历路径解析、文件定位和编译执行的过程。
路径解析可以是一个标识符、相对路径或者绝对路径,最终require方法会转换成真实路径。
文件定位包括文件扩展名分析和包目录分析等,其中文件扩展名没带时,是以.js .json .node的顺序进行解析的。
完成路径解析和文件定位后,node会新建一个模块对象,这时候就有了exports、module等变量,再具体的编译过程中,node会对加载的js文件进行头尾的包装(包装见下面示例代码),包装的过程中,将模块对象的module exports __filename __dirname等变量传递给function函数,这就是我们没有在js文件中定义module等变量,却可以使用的原因。
//(function(exports, require, module, __filename, __dirname){//头
var a = 123;
exports.add = function(b){
return a+b;
}
//...
//});//尾
另外,node对于模块的加载是有缓存的,以减少二次引用时的性能开销(核心模块的缓存检查优先于文件模块的缓存检查)。
////////////////
笔记:
- nodejs特点:
单线程、数据驱动、异步、速度快、耗费内存多
劣势:
- 默认不支持多核,但可以用cluster实现
- 不支持服务器集群 ,但可以用node-http-proxy实现
- 借助nginx实现负载均衡
- 灾难恢复 可以用node-cluster实现