nodejs的模块系统
nodejs的模块分为两类,一种是nodejs提供的核心模块,一种是用户编写的模块,成为文件模块。
模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的。可以理解为,一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码、JSON 或者编译过的C/C++ 扩展。
创建一个nodejs模块
exports.xiaoyaoji = function() {
console.log('Hello Xiaoyaoji');
}
exports是module.exports的一个引用,如果我们想把一个对象封装在模块里可以使用:
module.exports={
name: function(){
console.log("Xiaoyaoji");
},
age: function(){
console.log("Her age is 18 for ever");
}
}
这里不能使用exports因为exports只是module.exports的一个引用,在node模块的上下文中有一个module对象,实际导出的是这个module对象,因为exports是module.exports的引用,他们指向同一个地址空间,所以修改了exports就相当于修改了module.exports,但是如果 exports重新赋值就会切断这种联系,下面用代码说明:
//正确做法,只修改exports的属性值
module.exports = {};
var exports = module.exports;
exports.name="xiaoyaoji";
console.log(module.exports) //{name : 'xiaoyaoji'};
console.log(exports) //{name : 'xiaoyaoji'};
//错误做法,重新赋值exports会切断它和module.exports的联系
module.exports = {};
var exports = module.exports;
exports={name:"xiaoyaoji"};
console.log(module.exports) //{};
console.log(exports) //{name : 'xiaoyaoji'};
nodejs模块的引用
nodejs里面模块的引用是通过关键字require来实现的。
require的几种方式
- 核心模块,如http、fs、path等。
- .或..开始的相对路径文件模块。
- 以/开始的绝对路径文件模块。
- 非路径形式的文件模块,如自定义的connect模块。
扩展名分析
CommonJS模块规范也允许在标识符中不包含文件扩展名,这种情况下,Node会按.js、.json、.node的次序补足扩展名,依次尝试。在尝试的过程中,需要调用fs模块同步阻塞式地判断文件是否存在。因为Node是单线程的,所以这里是一个会引起性能问题的地方。小诀窍是:如果是.node和.json文件,在传递给require()的标识符中带上扩展名,会加快一点速度。
require(“http”), 那么该http查找顺序如下图,查找的时候会做扩展名分析:
require()通过分析文件扩展名之后,可能没有查找到对应文件,但却得到一个目录,具体过程会如下图:
参考网址:
https://blog.csdn.net/u012422829/article/details/52760981
https://blog.csdn.net/w_vc_love/article/details/51137948
https://blog.csdn.net/ityqing/article/details/78458647