node . js中需要()的工作原理是什么

  介绍

这篇文章给大家分享的是有关Node . js中需要()的工作原理是什么的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。

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

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

功能模块(id、父母){
  这一点。id=id;
  这一点。出口={};
  这一点。父母=父母;//?/pre> 

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

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

模块。_load=函数(请求、父母isMain) {//1 .在Module._cache中检查模块是否被缓存//2。如果缓存中为空,创建一个新的模块实例。//3。保存到缓存//4。使用指定的名称调用module.load ()//在读取了文件内容后将调用module.compile ()//5。如果加载和分析文件时有错误//从缓存中删除坏的模块//6。返回module.exports   };

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

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

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

下面看看模块。_compile:

Module.prototype。_compile=function(内容、文件名){//1。创建调用模块需要的要求标准函数//2。将其他帮助方法加入。//3 .包装JS代码到一个函数,这个函数提供我们的需要//模块,比如变量本地化到模块的作用域//4 .返回这个函数   };

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

    <李>

    需要():加载一个外部模块

    <李>

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

    <李>

    要求。主要:主要的模块

    <李>

    要求。缓存:所有缓存模块

    <李>

    要求。扩展:基于文件的扩展名可用于编译的方法。

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

(函数(出口、要求、模块、__filename __dirname) {//你的代码注入了这里!你的代码在这里   });

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

现在,我们已经知道要求(& # 39;模块& # 39;)是如何通过模块系统加载你定义的模块的,模块。js源代码包含更多代码原理,如果你有兴趣可以发现更多。

感谢各位的阅读!关于node . js中需要()的工作原理是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到吧!

node . js中需要()的工作原理是什么