`
zhouyrt
  • 浏览: 1125475 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Node.js的模块载入方式与机制

    博客分类:
  • Node
阅读更多

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是相同的,即两个引用都指向了同一个模块对象。

 

  • 大小: 1.1 KB
  • 大小: 1.2 KB
分享到:
评论

相关推荐

    跟我学Node.js(四)---Node.js的模块载入方式与机制

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

    跟我学Node.js(四)—Node.js的模块载入方式与机制

    其它的如通过NPM安装的第三方模块(third-party modules)或本地模块(local ...这里列下node模块的载入及缓存机制 1)载入内置模块(A Core Module)2)载入文件模块(A File Module)3)载入文件目录模块(A Folde

    Node.js中对通用模块的封装方法

    在Node.js中对模块载入和执行进行了包装,使得模块文件中的变量在一个闭包中,不会污染全局变量,和他人冲突。 前端模块通常是我们开发人员为了避免和他人冲突才把模块代码放置在一个闭包中。 如何封装Node.js和前端...

    简单模拟node.js中require的加载机制

    一、先了解一下,nodejs中require的加载机制 1、require的加载文件顺序 require 加载文件时可以省略扩展名:  require('./module');  // 此时文件按 JS 文件执行  require('./module.js');  // 此时文件按...

    node-segment:基于Node.js的中文分词模块

    中文分词模块 本模块以****中的词库为基础, 算法设计也部分参考了盘古分词组件中的算法。 在线演示地址: 本分词模块具有以下特点: ...console.log(segment.doSegment('这是一个基于Node.js的中文分词模块。

    node模块机制与异步处理详解

    1.模块机制 commonJS模块机制出现的目的是为了构建js在web服务器,桌面程序,浏览器等方面形成生态系统。...模块载入 var circle = require('/circle.js') console.log(circle.getName('WPY')) 模块

    require.js最新版2.3.5

    RequireJS 是一个 JavaScript 文件和模块载入工具。它针对浏览器使用场景进行了优化,并且也可以应用到其他 JavaScript 环境中,例如 Rhino 和 Node.js。

    e语言-奇易浏览框模块2.0

    2.0(2018-7-21 05:23:14) 1.优化 开发面板功能 2.... ... 3.发布浏览框模块当前版本的快速入门教程 ... 1.... 1.... 3.... 4.... 5.... 1....脱离node.dll浏览器内核,请自行选择下载 ... 1.... 2....截图功能 3....可执行自定义JS语句

    易语言-奇易浏览框模块2.0

    2.0(2018-7-21 05:23:14) 1.优化 开发面板功能 2.增加 快速初始化wke 功能 3.发布浏览框模块当前版本的快速入门教程 1.9(2018-7-20 06:38:59) 1.增加 启动开发面板 功能 (可以在运行的...5.可执行自定义JS语句

    javascript完全学习手册1 源码

    第12章 JavaScript与Ajax 348 12.1 Ajax概述 348 12.1.1 Ajax运行机制 348 12.1.2 Ajax技术优势 351 12.2 Ajax核心技术 352 12.2.1 JavaScript 352 12.2.2 DOM 353 12.2.3 XML 353 12.2.4 XMLHttpRequest 353 12.3 ...

    seajs学习之模块的依赖加载及模块API的导出

    SeaJS非常强大,SeaJS可以加载任意 JavaScript 模块和css模块样式,SeaJS会保证你在使用一个模块时,已经将所依赖的其他模块载入到脚本运行环境中。 通过参照上文的demo,我们结合源码分析在简单的API调用的背后,...

    javascript完全学习手册2 源码

    第13章 JavaScript安全与异常处理 13.1 JavaScript安全 13.1.1 域策略 13.1.2 IntemetExplorer安全区域 13.2 IE浏览器内建的错误报告 13.3 异常处理 13.3.1 异常类型 13.3.2 触发onError事件处理异常 ...

    nodejs入门教程二:创建一个简单应用示例

    // require 来载入 http 模块 var http = require('http'); /** * 使用 http.createServer() 方法创建服务器,返回 一个对象 * 对象有一个叫做 listen 的方法,并使用 listen 方法绑定 8000 端口。 * 函数通过 ...

    nodejs基础应用

    node n1_hello.js 在命令行cmd返回结果: hello word! 二、nodejs基本格式 //步骤一:引入require模块,require指令载入http模块 var http = require('http'); //步骤二:创建服务器 http.createServer(function ...

    JockJs:javascript 库

    An Smart JavaScript Library简介此框架吸取了多款主流框架的思想,使用灵活,迷你,核心代码只有2.9K,服务端采用Node架构,实现了对DOM常用的操作方法以及事件、Ajax等封装,拥有模块依赖管理,动态按需载入,...

    freemarker总结

    逻辑与:&& 逻辑或:|| 逻辑非:! 逻辑运算符只能作用于布尔值,否则将产生错误 1.9 内建函数 FreeMarker还提供了一些内建函数来转换输出,可以在任何变量后紧跟?,?后紧跟内建函数,就可以通过内建函数来轮换输出...

    crs-components

    在某些情况下,例如“ monaco”,需要requirejs来处理amd模块。 Requirejs与该库一起打包,因此您不需要安装它。 组件 HTML到文本 crs-monaco编辑 HTML到文本 此组件使您可以将文档中的html内容显示为文本内容,...

Global site tag (gtag.js) - Google Analytics