Node.js中的模块加载机制:
1.绝对路径:
require('/home/liyabin/WebstormProjects/untitled/try.js');
2.相对路径:
require('./try.js');//如果写成require('try.js'),则会加载node中的核心模块,或者是node-modules。
注意:如果不写文件后缀名,例如写成 require('./try'),则会涉及到文件查找机制:
1>首先按照加载的模块的文件名称进行查找,若未找到,则会在模块文件名称后面加上.js的后缀,进行查找。
2>如未找到,则会在模块文件名称后面加上.json的后缀,进行查找。
3>如还未找到,则会在模块文件名称后面加上.node的后缀,进行查找。
4>如果最后未找到,则会抛出一条错误消息。
综合上述,Node.js中的文件查找机制是:
文件名称 -> .js -> .json -> .node
模块对象:module and exports
在一个模块中通过var定义的变量,其作用域范围是当前模块,外部不能直接访问,若想一个模块能够访问另一个模块中定义的变量,有以下做法:
1>把变量作为global对象的一个属性(不推荐)
被加载模块:
global.a = 100;
加载模块:
require('/home/liyabin/WebstormProjects/untitled/try.js');
console.log(a);
在控制台输入指令:node 加载模块文件名称
输出结果为100
2>使用模块对象module,module对象保存当前模块的一些详细信息,在module对象下,包括exports子对象,通过exports子对象把一个模块中的局部变量对外提供访问。
被加载模块:
var a = 100;
//相当于把a挂载到module对象的子对象下面
module.exports = a;
加载模块:
//require方法的返回值是module对象的子对象exports
var m = require('/home/liyabin/WebstormProjects/untitled/try.js');
console.log(m);
ps: require()方法中的返回值就是被加载模块中的module.exports
程序运行结果为:
100
3>在模块作用域,还有一个内置的模块对象:exports,其实就是module.exports(两者指向相同的对象),也可以实现同样的效果。
被加载模块:
var a = 100;
exports.x = a;
加载模块:
var m = require('/home/liyabin/WebstormProjects/untitled/try.js');
console.log(m);
打印输出为:
{x:100}
再讲一个module.exports和exports之间的关系的例子:
被加载模块:
exports.printHelloworld = ()=>{
console.log('Hello world');
}
加载模块:
var m = require('/home/liyabin/WebstormProjects/untitled/router.js');
m.printHelloworld();
运行node 加载模块
在控制台输出 Hello World。
ps: 在以上示例中,被加载模块 通过 exports 对象把 printHelloWorld 作为模块的访问接口,在加载模块中通过
var m = require('/home/liyabin/WebstormProjects/untitled/router.js');
加载这个模块,然后就可以直接访 问 被加载模块 中 exports 对象的成员函数了。
被加载模块:
function printHello(){
console.log("Hello");
}
module.exports = printHello;
加载模块:
var m = require('/home/liyabin/WebstormProjects/untitled/router.js');
m();
ps: require()方法的返回值就是被加载模块中的module.exports。
注意:
不要破坏module.exports和exports之间的引用关系,例如下面的写法应该杜绝:
module.exports = [1,2,3];
exports = [12,3];