Node.js中的模块加载机制和模块对象module,exports

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];

猜你喜欢

转载自blog.csdn.net/lishundi/article/details/82818343