`
zhouyrt
  • 浏览: 1162001 次
  • 性别: 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 Design Patterns - 2 Edition pdf Mario Casciaro

    流是 Node.js 中处理大量数据的一种高效方式,它允许开发者在不一次性载入全部数据的情况下,分批次处理数据,这对于构建高性能的服务器应用至关重要。 最后,书中可能还会介绍如何将设计模式与 Node.js 的核心特性...

    跟我学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是一个基于Chrome V8引擎的JavaScript运行环境,使得JavaScript能够在服务器端执行,而不仅仅是局限于浏览器。对于文本处理,Node.js提供了多种库,其中`nodejieba`是一个用于中文分词的高效组件,它是jieba...

    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的中文分词模块。

    Nodejs模块载入运行原理

    Node.js模块载入运行原理是理解其核心机制的关键部分,涉及到如何找到、解析和执行不同类型的模块。在Node.js中,模块大致分为四类:内置(builtin)模块、常量(constant)模块、本地(native)模块以及第三方模块...

    nodejs 内部资料 进程管理

    fork()方法与spawn()类似,但专门为Node.js的子进程提供,只需指定要执行的JavaScript文件模块即可。这四个方法的异同点,主要体现在如何启动子进程、执行的方式和使用的场景上。 在进程间通信方面,Master-Worker...

    node-modules-examples:以各种形式使用节点模块的示例

    7. 载入子模块:Node.js还允许在一个模块内部使用`require('.')`或`require('./path/to/module')`来加载同一目录下的子模块,这在大型项目中尤其有用,可以将复杂逻辑分解为小模块。 8. 模块缓存:Node.js会缓存已...

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

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

    nodejs基础应用

    Node.js 是一种基于 Chrome V8 引擎的 JavaScript 运行环境。它让 JavaScript 脱离浏览器的限制,得以在服务器端执行。Node.js 以其高效的事件驱动、非阻塞I/O 模型而闻名,非常适合处理大量并发访问的场景,因此被...

    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语句

    详解Js中的模块化是如何实现的

    总的来说,JavaScript模块化是通过特定的加载和执行机制以及遵循特定规范(如CommonJS或ES6模块)来实现的。理解并熟练运用这些知识,将有助于我们在复杂的JavaScript项目中编写高效、可维护的代码。

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

    Node.js是一种基于Chrome V8引擎的JavaScript运行环境,它允许开发者使用JavaScript来编写服务器端的代码。Node.js使用事件驱动、非阻塞I/O模型,使其轻量又高效,特别适合处理大量并发访问,因此非常适用于网络应用...

    易语言-奇易浏览框模块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语句

    20200610-v8中snapshot的代码分析-杨文章.pptx

    V8引擎是Google开发的一款高性能的JavaScript和TypeScript运行时环境,被广泛应用于Chrome浏览器以及Node.js等项目中。在V8中,"snapshot"是一个关键的概念,它用于优化JavaScript应用的启动性能。本文将深入解析V8...

    使用GruntJS构建Web程序之构建篇

    Gruntfile.js本身是一个普通的JavaScript模块,用于定义项目任务和配置。一个典型的Gruntfile.js的结构如下: ```javascript module.exports = function(grunt) { // 项目和任务配置 grunt.initConfig({ pkg: ...

Global site tag (gtag.js) - Google Analytics