浅谈Node.js中require()的工作原理


本文摘自PHP中文网,作者PHPzhong,侵删。

【视频教程推荐:node js教程 】

大多数人都知道Node.js中require()函数做什么的,但是有多少人知道它的工作原理呢?我们每天使用它加载库包和模块,但是它的内部行为原理很神秘。

我们追寻Node模块系统的核心: module.js,这个文件包含一个令人惊讶的神奇功能,它负责加载 编译和缓存每个用过的文件,让我们揭开它的神秘面纱。

1

2

3

4

5

function Module(id, parent) {

  this.id = id;

  this.exports = {};

  this.parent = parent;

  // ...

在module.js中可以发现这个Module类型,扮演两个主要角色:首先,它提供一个所有Node.js模块从其文件被加载时构建一个实例的基础功能,甚至在文件运行时持久,这就是为什么我们能够将一些属性加入module.exports,并在需要时返回它们。

module的第二个事情是处理Node模块的加载机制,标准的require函数其实是基于module.require的抽象,后者只是一个对Module._load的简单包装,加载方法处理每个文件的实际加载。看看它的代码大概如下:

1

2

3

4

5

6

7

8

9

10

Module._load = function(request, parent, isMain) {

  // 1.在Module._cache中检查模块是否被缓存

  // 2.如果缓存中为空,创建一个新的模块实例。

  // 3. 保存到缓存

  // 4. 使用指定的名称调用module.load()

  //    在读取了文件内容后将调用module.compile()

  // 5.如果加载和分析文件时有错误

  //    从缓存中删除坏的模块

  // 6. 返回 module.exports

};

Module._load负责加载新的模块并且管理模块缓存,缓存每个模块能够降低文件的读取频率,从而提高性能,共享模块实例允许像单例模块那样跨应用保存状态。

如果一个模块在缓存中不存在,Module._load将读取文件创建一个新的,读取文件内容成功后会调用module._compile

如果你注意上面第六步,你会看到返回的是module.exports,这就是为什么当你定义公共接口时,可以使用exports和module.exports,因为它们确实是Model._load和require返回的。

下面看看module._compile:

1

2

3

4

5

6

7

Module.prototype._compile = function(content, filename) {

  // 1. 创建调用模块需要的require标准函数

  // 2.将其他帮助方法加入require.

  // 3.包装JS代码到一个函数,这个函数提供我们的require

  //  模块, 比如变量本地化到模块的作用域

  // 4.返回这个函数

};

这里有魔术发生,首先,一个特殊的标准require函数将被创建,这就是我们熟悉的require()函数,当函数自己包装了Module.require,它还包含一些很少人知道的帮助属性和方法,如:

  • require():加载一个外部模块

  • require.resolve(): 根据其绝对路径解决模块名称

  • require.main: 主要的模块

  • require.cache: 所有缓存模块

  • require.extensions: 基于文件的扩展名可用于编译的方法。

一旦require准备就绪,整个源码将被包装进一个新的函数,这个函数有require module和exports和其他暴露变量作为参数,这创建了模块的一个新函数作用域,这样就不会污染Node.js环境的其余部分。

1

2

3

(function (exports, require, module, __filename, __dirname) {

  // YOUR CODE INJECTED HERE! 你的代码在这里

});

最后,这个包装了模块的函数将运行,整个Module._compile方法同步执行,这样原来对Module._load方法调用将会等待这个代码运行,然后才会完成,返回module.exports给用户。

现在,我们已经知道require('模块')是如何通过模块系统加载你定义的模块的, module.js source code包含更多代码原理,如果你有兴趣可以发现更多。

更多编程相关知识,可访问:编程教学!!

以上就是浅谈Node.js中require()的工作原理的详细内容,更多文章请关注木庄网络博客

相关阅读 >>

深入了解node.js中的非阻塞 i/o

url完整结构以及同源跨域处理的介绍

详解node.js中的事件

npm和yarn安装node-sass的问题解决方法介绍

深入浅析node.js中的异步

4个使用将html转换为pdf的方法介绍

了解node.js中的定时器

避免node.js模块日志污染程序日志的方法介绍

npm机制深入理解

javascript中promise.all和promise.race方法的介绍(附代码)

更多相关阅读请进入《node.js》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...