zoukankan      html  css  js  c++  java
  • Node.js的模块载入方式与机制

    Node.js中模块可以通过文件路径或名字获取模块的引用。模块的引用会映射到一个js文件路径,除非它是一个Node内置模块。Node的内置模块公开了一些常用的API给开发者,并且它们在Node进程开始的时候就预加载了。

    其它的如通过NPM安装的第三方模块(third-party modules)或本地模块(local modules),每个模块都会暴露一个公开的API。以便开发者可以导入。如

    var mod = require('module_name')
    

    此句执行后,Node内部会载入内置模块或通过NPM安装的模块。require函数会返回一个对象,该对象公开的API可能是函数,对象,或者属性如函数,数组,甚至任意类型的JS对象。

    这里列下node模块的载入及缓存机制

    1. 载入内置模块(A Core Module)
    2. 载入文件模块(A File Module)
    3. 载入文件目录模块(A Folder Module)
    4. 载入node_modules里的模块
    5. 自动缓存已载入模块

    一、载入内置模块

    Node的内置模块被编译为二进制形式,引用时直接使用名字而非文件路径。当第三方的模块和内置模块同名时,内置模块将覆盖第三方同名模块。因此命名时需要注意不要和内置模块同名。如获取一个http模块

    var http = require('http')
    

    返回的http即是实现了HTTP功能Node的内置模块。

    二、载入文件模块

    绝对路径的

    var myMod = require('/home/base/my_mod')
    

    或相对路径的

    var myMod = require('./my_mod')
    

    注意,这里忽略了扩展名“.js”,以下是对等的

    var myMod = require('./my_mod')
    var myMod = require('./my_mod.js')
    

      

    三、载入文件目录模块

    可以直接require一个目录,假设有一个目录名为folder,如

    var myMod = require('./folder')
    

    此时,Node将搜索整个folder目录,Node会假设folder为一个包并试图找到包定义文件package.json。如果folder目录里没有包含package.json文件,Node会假设默认主文件为index.js,即会加载index.js。如果index.js也不存在,那么加载将失败。

    假如目录结构如下

    package.json定义如下

    {
        "name": "pack",
        "main": "modA.js"
    }
    

    此时 require('./folder') 将返回模块modA.js。如果package.json不存在,那么将返回模块index.js。如果index.js也不存在,那么将发生载入异常。

    四、载入node_modules里的模块

    如果模块名不是路径,也不是内置模块,Node将试图去当前目录的node_modules文件夹里搜索。如果当前目录的node_modules里没有找到,Node会从父目录的node_modules里搜索,这样递归下去直到根目录。

    不必担心,npm命令可让我们很方便的去安装,卸载,更新node_modules目录。

    五、自动缓存已载入模块

    对于已加载的模块Node会缓存下来,而不必每次都重新搜索。下面是一个示例

    modA.js

    console.log('模块modA开始加载...')
    exports = function() {
        console.log('Hi')
    }
    console.log('模块modA加载完毕')
    

    init.js

    var mod1 = require('./modA')
    var mod2 = require('./modA')
    console.log(mod1 === mod2) 
    

    命令行执行:

    node init.js 

    输入如下

    可以看到虽然require了两次,但modA.js仍然只执行了一次。mod1和mod2是相同的,即两个引用都指向了同一个模块对象。

  • 相关阅读:
    去掉Form产生的空行
    转:Override错误
    面试
    JMF获取设备列表失败,获取视频设备失败?
    jquery 插件ztree的应用动态加载树节点数据
    关于Struts2上传文件
    未能解析引用的程序集“”,因为它对不在当前目标框架“”具有依赖关系。请删除对不在目标框架中的程序集的引用,或考虑重新确定项目的目标。 Kevin
    The diffrence between Cast() and OfType() Kevin
    “System.Collections.Generic.IEnumerable<decimal>”不包含“ToArray”的定义,并且找不到可接受类型为“System.Collections.Generic.IEnumerable<decimal>”的第一个参数的扩展方法“ToArray” Kevin
    partial关键字的含义和使用 Kevin
  • 原文地址:https://www.cnblogs.com/snandy/p/3445550.html
Copyright © 2011-2022 走看看