Nodejs的模块

在Node中引入模块,需要经历如下3个步骤:(1)路径分析(2)文件定位(3)编译执行

Node中模块分为两类:

一是Node提供的模块——核心模块。这部分在Node源代码的编译过程中,编译进了二进制文件。在Node进程启动时,部分核心模块就直接加载进内存中,所以这部分核心模块引入时,省略掉文件定位和编译执行并且在路径分析中优先判断,加载速度是是最快的。

二是用户编写的模块——文件模块。在运行时动态加载,需要完整的路径分析、文件定位、编译执行过程,速度比核心模块慢。

1、优先从缓存加载

Node对引入过的模块都会进行缓存,以减少二次引入时的开销。不同的是浏览器仅仅缓存文件,而Node缓存的是编译和执行之后的对象。核心模块的缓存检查先于文件模块的缓存检查。

2、模块路径模块路径是Node在定位文件模块的具体文件时指定的查找策略,具体表现为一个路径组成的数组。

//module_path.js
console.log(module.paths);

windows下执行:module_path.js文件

C:\Users\XXX>node "d:\Program Files\nodejs\module_path.js"
[ ‘d:\\Program Files\\nodejs\\node_modules‘,
  ‘d:\\Program Files\\node_modules‘,
  ‘d:\\node_modules‘ ]

可以看出模块路径的生成规则:

当前文件目录下的node_modules目录;父目录下的node_modules目录;延路径向上逐级递归,知道根目录下的node_modules目录。

3、文件定位

文件扩展名分析

require()在分析标识符过程中,如果标识符中不包含文件扩展名,Node会按.js\.json\.node的次序补足扩展名,依次尝试。

在尝试过程中调用fs模块同步阻塞式地判断文件是否存在。因为Node是单线程的,如果是.node和.json文件,在传递给require()的标识符中带上扩展名,会加快一点速度。另外一个诀窍是同步配合缓存,可以大幅度缓解Node单线程中阻塞式调用的缺陷。

4、模块编译

每个文件模块都是一个对象,它的定义如下:

function Module(id, parent){
    this.id = id;
    this.exports = {};
    this.parent = parent;
    if (parent && parent.children){
        parent.children.push(this);
    }

    this.filename = null;
    this.loaded = false;
    this.children = [];
}

定位到具体的文件后,Node会新建一个模块对象,然后根据路径载入并编译。

时间: 2024-08-02 19:43:05

Nodejs的模块的相关文章

Nodejs mkdirP 模块导致CPU占用高的问题

Nodejs mkdirP 模块导致CPU占用高的问题 近期将nodejs项目部署到服务器上并启动时,发现node进程的cpu占用率在40%左右,当时表示非常不解,刚启动的服务并没有运行什么需要大量消耗cpu的逻辑,且此时还未有请求发送到服务器端. 鉴于这种情况,只能猜测是某段程序在初始化一些东西的时候异常,所以才导致了这种情况. 经过对代码的排查后,最终锁定出为题的代码块如下: router.use(multer({ dest: config.uploadDir, limits:{ fileS

配置 Windows 下的 nodejs C++ 模块编译环境 安装 node-gyp

配置 Windows 下的 nodejs C++ 模块编译环境 根据 node-gyp 指示的 Windows 编译环境说明, 简单一句话就是 "Python + VC++ 编译环境". 所有需要的安装文件, 我都下载好放到百度云盘了: nodejs-gyp-windows Python 安装 python-2.7.7.msi iso 虚拟磁盘 安装 DTLite4491-0356.exe Windows XP 文件在: node-gyp-windows/windowsXP 用 DTL

nodejs cheerio模块提取html页面内容

nodejs cheerio模块提取html页面内容 Table of Contents 1. nodejs cheerio模块提取html页面内容 1.1. 找到目标元素 1.2. 美化文本输出 1.3. 提取答案文本 1.4. 最终代码 本文给出使用一个用cheerio模块提取html文件中指定内容的例子,并说明具体步骤.涉及到的API.以及其它模块. cheerio模块是一个类似jquery的模块,具有相似的API.功能,能够将一个网页解析为DOM,以及通过selector选择元素,设置.

NodeJS http 模块

#4 NodeJS http 模块 工作目录 server.js var http = require('http'); var fs = require('fs'); var path = require('path'); var mime = require('mime'); function send404(response){      response.writeHead(404,{           'Content-Type':'text/plain'      });     

nodejs的模块系统(实例分析exprots和module.exprots)

前言:工欲善其事,必先利其器.模块系统是nodejs组织管理代码的利器也是调用第三方代码的途径,本文将详细讲解nodejs的模块系统.在文章最后实例分析一下exprots和module.exprots. nodejs的模块 什么是模块? node.js通过实现CommonJS的Modules/1.0标准引入了模块(module)概念,模块是Node.js的基本组成部分.一个node.js文件就是一个模块,也就是说文件和模块是一一对应的关系.这个文件可以是JavaScript代码,JSON或者编译

Nodejs核心模块

全局对象 Nodejs中全局对象是 global(作为全局变量的宿主),所有全局变量都是global对象的属性,在Nodejs中能够直接访问到的对象通常都是global的属性,如 console,process等. 在最外层定义的变量 全局对象的属性: 隐式定义的变量(未定义直接赋值的变量) 当定义一个全局变量时,这个变量同时也会成为全局对象的属性. 注意:永远使用var定义变量,以避免引入全局变量,因为全局变量会污染命名空间,提高代码耦合的风险. 1.1.process process.arg

配置 Windows 下的 nodejs C++ 模块编译环境

根据 node-gyp 指示的 Windows 编译环境说明, 简单一句话就是 "Python + VC++ 编译环境". 所有需要的安装文件, 我都下载好放到百度云盘了: nodejs-gyp-windows Python 安装 python-2.7.7.msi iso 虚拟磁盘 安装 DTLite4491-0356.exe Windows XP 文件在: node-gyp-windows/windowsXP 用 DTLite 打开 VS2010Express1.iso , 然后安装

nodejs require模块找不到怎么解决?

用npm全局安装模块后,有时在程序使用的时候require会报找不到模块,要如何解决?nodejs是在module.paths包含的目录列表中寻找模块的,所以,要解决这个问题就是将全局模块加入到module.paths目录列表中. 全局安装模块后在程序里面require这个模块报错,模块找不到.如下图所示,首先按照正常的方式npm install -g express全局安装express模块.然后在测试require('express')报错 那么问题就出在nodejs怎么查找模块上.首先,我

Nodejs的模块系统以及require的机制

一.简介 Nodejs 有一个简单的模块加载系统.在 Nodejs 中,文件和模块是一一对应的(每个文件被视为一个独立的模块),这个文件可能是 JavaScript 代码,JSON 或编译过的C/C++ 扩展,例如: /** *foo.js *将这个js文件导出为模块 */ exports.hello = function() { console.log("hello Nodejs!"); } /** *main.js *main.js和foo.js在同一目录下 *在控制台中将会输出:

NodeJS常用模块介绍

收集了NodeJS开发中常用的一些模块. MVC框架 - Express Express 是轻量灵活的Nodejs Web应用框架,它可以快速地搭建网站.Express框架建立在Nodejs内置的Http模块上,并对Http模块再包装,从而实际Web请求处理的 功能.它支持多种前端模板,如Jade, EJS等.它是T.J大神的作品,不过已经交由其它团队维护了. Koa是T.J大神的另外一个作品,号称下一 代NodeJS web框架.使用 koa 编写 web 应用,通过组合不同的 generat