nodejs的require原理

在写nodejs代码时会把不同的模块写到不同的JS文件中,在文件的最后使用module.exports = 导致公共方法, 然后使用require被引入到调用的地方。

很多人都会使用这个方法,但不一定都知道为什么这样。根据我自己的理解简单描述一下我自己的想法,欢迎大家指正:


1。每一个JS文件中有自己的变量空间,即该文件内部的变量、函数如果不使用export导出,则不能被外部访问到。这个与在HTML中包含多个JS文件不同。

当在HTML包含多个JS文件时,每个JS文件中定义的全局变量和函数在其他JS文件是可以直接访问的,但在nodejs中不行


2。被require的JS文件中的全局变量在整个运行过程中只有一个实例,即使该JS文件被多个地方require,但全局变量都是同一个实例,不会被创建多个。

如:

// file1.js

// 定义一个变量a

var a = 1;

module.exports = function () {a++;}

// file2.js

// require file1.js,此时file1.js会加载到内存中,并初始化a=1

var inc = require("./file1");

inc();  // 通过对外接口改变a 的值为2

// file3.js

//  当再次require file1.js时,会直接返回已加载的file1.js的实例,因此file1.js不会被重复加载

require("./file1");  // file1中a 的值为2

上面是我们在使用时看到的现象,其内部实现原理如下:

当require一个文件时,会先找到该文件,并加载到内存中。此时是做为一个字符串存在的。

然后在字符串外面包括一个函数外壳,如下:

(function (exports, require, module, __filename, __dirname) {
这里是加载的JS内容
});

经过包装后的字符串就是一个标准的JS函数了,再通过new Function执行。当执行时你代码中的module.exports就会生效了。此时就很容易理解JS文件中为什么可以使用exports, require, module, __filename, __dirname这些变量和函数了。

其中module是外面生成的一个实例,会在你下次require时返回。

require是在我们的JS中使用require('xxx')

__filename, 在调用我们的JS时会设置为当前JS文件的文件名

__dirname, 在调用我们的JS时会设置为当前JS文件所在的目录名

猜你喜欢

转载自blog.csdn.net/hdx_008/article/details/79885517
今日推荐