Node.js 中的require
方法接受以下几种参数的传递:
- http、fs、path 等,原生模块
- ./mod或../mod,相对路径的文件模块
- /pathtomodule/mod,绝对路径的文件模块
- mod,非原生模块的文件模块
文件模块
Node.js提供了exports
和require
两个对象,其中exports
是模块公开的接口,require
用于从外部获取一个模块的接口,即所获取模块的exports
对象。
//hello.js
exports.world = function() {
console.log('Hello');
}
//main.js
var hello = require('./hello');//"./"是当前目录,node.js默认后缀是js
hello.world();
//有时候我们只是想把一个对象封装到模块中
module.exports = function() {
}
//例如:
//hello.js
function Hello() {
var name;
this.setName = function(theName) {
name = theName;
}
this.sayHello = function() {
console.log('Hello ' + name);
}
}
module.exports = Hello;
//main.js
var Hello = require('./hello');
hello = new Hello();
hello.setName('Node.js');
hello.sayHello();//Hello Node.js
模块接口的唯一变化是使用 module.exports = Hello
代替了 exports.world = function(){}
。在外部引用该模块时,其接口对象就是要输出的Hello
对象本身,而不是原先的exports
。
原生模块
通常在我们的代码经常使用原生模块,例如:
var http = require('http');
...
http.createServer(...);
Node.js 中自带了一个叫做 http 的模块,我们在代码中请求它并把返回值赋给一个本地变量,这把我们的本地变量变成了一个拥有所有 http 模块所提供的公共方法的对象。
模块加载策略
Node.js 中require
的文件查找策略如下:
由于Node.js 中存在4类模块(原生模块和3种文件模块),模块在require
内部中的加载优先级不同,查找策略如下:
![](https://img.haomeiwen.com/i5830028/dcb83526c43179fb.jpg)
可以看出require优先从文件模块的缓存中加载,若文件模块的缓存中不存在,则优先从原生模块中加载,当文件模块缓存中不存在,而且不是原生模块的时候,则从文件系统中加载实际的文件。
网友评论