作家
登录

很全很全的JavaScript模块讲解,看了绝不后悔!

作者: 来源: 2018-01-03 11:34:59 阅读 我要评论

  • //这段代码会经由过程vm原生模块的runInThisContext办法履行(类似eval,只是具有明白高低文,不污染全局),返回为一个具体的function对象。最后传入module对象的exports,require办法,module,文件名,目次名作为实参并履行。 
  • 这就是为什么require并没有定义在app.js 文件中,然则这个办法却存在的原因。大年夜Node.js的API文档中可以看到还有 __filename、 __dirname、 module、 exports几个没有定义然则却存在的变量。个中 __filename和 __dirname在查找文件路径的过程平分析获得后传入的。 module变量是这个模块对象自身, exports是在module的构造函数中初始化的一个空对象({},而不是null)。

    load办法在载入、编译、缓存了module后,返回module的exports对象。这就是circle.js文件中只有定义在exports对象上的办法才能被外部调用的原因。

    以上所描述的模块载入机制均定义在lib/module.js中。

    require 惹人的对象主如果函数。当 Node 调用 require() 函数,并且传递一个文件路径给它的时刻,Node 会经历如下几个步调:

    • Resolving:找到文件的绝对路径;
    • Loading:断定文件内容类型;
    • Wrapping:打包,给这个文件付与一个私有感化范围。这是使 require 和 module 模块在本地引用的一种办法;
    • Evaluating:VM 对加载的代码进行处理的处所;
    • Caching:当再次须要用这个文件的时刻,不须要反复一遍膳绫擎步调。

    require.extensions 来查看对三种文件的支撑情况:

    sea.js 核心特点:

    1. 遵守CMD规范,与NodeJS般的书写模块代码。
    2. 依附主动加载,设备清楚简洁。

    文件查找策略

    大年夜文件模块缓存中加载

    尽管原生模块与文件模块的优先级不合,然则优先级最高的是大年夜文件模块的缓存中加载已经存在的模块。

    作为一个办事器端的解决筹划,CommonJS 须要一个兼容的脚本加载器作为前提前提。该脚本加载器必须支撑名为 require 和 module.exports 的函数,它们将模块互相导入导出。

    大年夜原生模块加载

    在这个主文件中,可以经由过程require办法去惹人其余的模块。而其拭魅这个require办法实际调用的就是module._load办法。

    原生模块的优先级仅次于文件模块缓存的优先级。require办法在解析文件名之后,优先检查模块是否在原生模块列表中。以http模块为例,尽管在目次下存在一个 http、 http.js、 http.node、 http.json文件, require(“http”)都不会大年夜这些文件中加载,而是大年夜原生模块中加载。

    原生模块也有一个缓存区,同样也是优先大年夜缓存区加载。如不雅缓存区没有被加载过,则调用原生模块的加载方法进行加载和履行。

    大年夜文件加载

    当文件模块缓存中不存在,并且不是原生模块的时刻,Node.js会解析require办法传入的参数,并大年夜文件体系中加载实际的文件,加载过程中的包装和编译细节在前面说过是调用load办法。

    当 Node 碰到 require(X) 时,按下面的次序处理。

    1. // file lib/sayModule.js 
    2.  
    3. define(function (){     
    4.  
    5. return { 
    6.  
    7.         sayHello: function () { 
    8.  
    9.             console.log('hello'); 
    10.  
    11.         } 
    12.  
    13.     }; 
    14.  
    15. }); 
    16.  
    17. //file main.js 
    18.  
    19. define(['./lib/sayModule'], function (say){ 
    20.  
    21.     say.sayHello(); //hello 
    22.  
    23. }) 

    2、如不雅 X 以 "./" 或者 "/" 或者 "../" 开首

    • a. 根据 X 地点的父模块,肯定 X 的绝对路径。
    • b. 将 X 当成文件,依次查找下面文件,只要个中有一个存在,就返回该文件,不再持续履行。
      • X
      • X.js
      • X.json
      • X.node
    • c. 将 X 当成目次,依次查找下面文件,只要个中有一个存在,就返回该文件,不再持续履行。

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)