百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>JS教程> 浅谈Node.js中require()的工作道理
分享文章到:

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

发布时间:09/01 来源:未知 浏览: 关键词:

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

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

我们寻找Node模块系统的中心: module.js,这个文件包括一个令人惊奇的奇妙功效,它负责加载 编译和缓存每个用过的文件,让我们掀开它的神奇面纱。

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的简便包装,加载办法处置每个文件的实际加载。看看它的代码大约如下:

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:

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环境的其余部分。

(function (exports, require, module, __filename, __dirname) { 
  // YOUR CODE INJECTED HERE! 你的代码在这里
});

最后,这个包装了模块的函数将运转,整个Module._compile办法同步施行,这样本来对Module._load办法调取将会等候这个代码运转,然后才会完成,返回module.exports给会员。

此刻,我们已经知道require('模块')是怎样通过模块系统加载你定义的模块的, module.js source code包括更多代码道理,假如你有乐趣可以发明更多。

打赏

打赏

取消

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

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

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

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有150人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板