返回顶部
首页 > 资讯 > 前端开发 > node.js >简单模拟node.js中require的加载机制
  • 506
分享到

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

加载机制简单 2022-06-04 17:06:19 506人浏览 泡泡鱼
摘要

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

一、先了解一下,nodejs中require的加载机制

1、require的加载文件顺序

require 加载文件时可以省略扩展名:

require('./module');

// 此时文件按 js 文件执行

require('./module.js');

// 此时文件按 JSON 文件解析

require('./module.json');

// 此时文件预编译好的 c++ 模块执行

require('./module.node');

// 载入目录module目录中的 package.json 中main指向的文件

require('./module/default.js');

// 载入目录module 中的index.js文件

通过 ./ 或 ../ 开头:则按照相对路径从当前文件所在文件夹开始寻找模块;

require('../file.js'); => 上级目录下找 file.js 文件

通过 / 开头:则以系统根目录开始寻找模块;

require('/Users/iceStone/Documents/file.js'); => 以绝对路径的方式找,没有任何异议

如果参数字符串不以“./“ 或 ”/“ 开头,则表示加载的是一个默认提供的核心模块(位于 Node 的系统安装目录中):

require('fs'); => 加载核心模块中的文件系统模块

或者从当前目录向上搜索 node_modules 目录中的文件:

require('my_module'); => 各级 node_modules 文件夹中搜索 my_module.js 文件;

如果 require 传入的是一个目录的路径,会自动查看该目录的 package.json 文件,然后加载 main 字段指定的入口文件

如果package.json文件没有main字段,或者根本就没有package.json文件,则默认找目录下的 index.js 文件作为模块:

require('./calcuator'); => 当前目录下找 calculator 目录中的 index.js 文件

2、require缓存

第一次加载某个模块时,Node 会缓存该模块。以后再加载该模块,就直接从缓存取出该模块的 module.exports 属性(不会再次执行该模块)

如果需要多次执行模块中的代码,一般可以让模块暴露行为(函数),模块的缓存可以通过 require.cache 拿到,同样也可以删除

3、所有代码都运行在模块作用域,不会污染全局作用域。

二、模拟require函数

require的加载内部比较复杂,下面让我们进行简单的模拟加载

require的简单实现机制为:

将传入的模块id通过加载规则找到对应的模块文件

读取这个文件里面的代码

通过拼接方式为该段代码构建私有空间

执行该代码

拿到module.exports 返回


 nodejs_require.js
 // [require函数模拟]

 "use strict"

 function $require(id) {
 //1、先查看模块是否存在,如果不存在则抛出 Can't found file
 //2、如果存在,就读取代码
 const fs = require('fs');
 const path = require('path');

 // 文件名
 let filename = id;
 //查看是否是绝对路径
 if (!path.isAbsolute(filename)) {
  filename = path.join(__dirname, id);
 }

 // 文件目录
 let dirname = path.dirname(filename);

 //模拟require的缓存机制
 $require.cache = $require.cache || {};
 if($require.cache[filename]){
  return $require.cache[filename].exports;
 }

 // 读取模块代码
 let code="";
 try {
  code = fs.readFileSync(filename,'utf-8'); // 阻塞读取文件,不会放入事件队列 
 } catch (error) {
  console.log(" [*]can't found file! ");
  throw error;
 }

 // console.log(code);

 // 3、执行代码,所要执行的代码,需要营造一个独立的空间

 // 定义一个数据容器,用容器去装模块导出的成员
 let _module = { // 每个js模块都会有一个全局的module变量
  id:'.',
  exports:{},
  parent:module,
  filename:filename
 };
 let _exports = _module.exports;

 // 营造一个独立空间
 code = `(function($require,module,_exports,__dirname,__filename){
  $[code]
 })($require,_module,_exports,dirname,filename)`;

 // 执行代码
 eval(code);

 // 缓存
 $require.cache[filename] = _module;
 // 返回结果
 return _module.exports;
 }


 setInterval(()=>{
  const rr = $require("./test.js");
  console.log(rr);
 },1000);

上面的模块测试使用的两个模块


 //test.js
 const date = $require('./date.js');

 console.log(module);

 module.exports = date;

 //date.js
 module.exports = new Date();

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

--结束END--

本文标题: 简单模拟node.js中require的加载机制

本文链接: https://lsjlt.com/news/12939.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 简单模拟node.js中require的加载机制
    一、先了解一下,nodejs中require的加载机制 1、require的加载文件顺序 require 加载文件时可以省略扩展名: require('./module'); ...
    99+
    2022-06-04
    加载 机制 简单
  • Node.js中模块加载机制的原理是什么
    这期内容当中小编将会给大家带来有关Node.js中模块加载机制的原理是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。简单例子老规矩,讲原理前我们先来一个简单的例子,从...
    99+
    2024-04-02
  • Node.js中Require机制的原理是什么
    这篇文章给大家介绍Node.js中Require机制的原理是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。什么是 CommonJS每一个文件就是一个模块,拥有自己独立的作用域,变量...
    99+
    2024-04-02
  • 详解在node.js中require方法的加载规则
    require 方法的加载规则 优先从缓存中加载 核心模块 路径形式的模块 第三方模块 一、优先从缓存中加载 main.js:执行加载a.js模块...
    99+
    2024-04-02
  • node.js中http模块和url模块的简单介绍
    前言 本文主要给大家介绍了关于node.js中http模块与url模块的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 一、http模块的简单介绍 node.js当中的http内...
    99+
    2022-06-04
    模块 简单 js
  • node.js中debug模块的简单介绍与使用
    前言 相信使用node.js的朋友们都知道,一般在nodejs需要进行调试的时候,可以使用console.log()方法来将调试信息输出到控制台,当发布到生产环境的时候,需要将这些调试信息都注释掉,为了方便...
    99+
    2022-06-04
    模块 简单 node
  • Java虚拟机类加载器之双亲委派机制模型案例
    1. 双亲委派模型是什么? 当某个类加载器需要加载某个.class字节码文件时,它首先把这个任务委托给它的上级类加载器,递归这个操作,如果上级的类加载器没有加载,自己才会去加载这个类...
    99+
    2024-04-02
  • android实现模拟加载中的效果
    最近闲着没事做了一个Android小程序,具体如下: 效果图: 原始界面 点击按钮运行    运行后界面 实现代码: publ...
    99+
    2022-06-06
    Android
  • 怎么用CSS3制作一个简单的Chrome模拟器
    这篇文章主要介绍“怎么用CSS3制作一个简单的Chrome模拟器”,在日常操作中,相信很多人在怎么用CSS3制作一个简单的Chrome模拟器问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望...
    99+
    2024-04-02
  • Node.js中的模块机制学习笔记
    Javascript自诞生以来,曾经没有人拿它当做一门编程语言。在Web 1.0时代,这种脚本语言主要被用来做表单验证和网页特效。直到Web 2.0时代,前端工程师利用它大大提升了网页上的用户体验,JS才被...
    99+
    2022-06-04
    学习笔记 模块 机制
  • Java高级之虚拟机加载机制的示例分析
    这篇文章给大家分享的是有关Java高级之虚拟机加载机制的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Jvm要加载的是二进制流,可以是.class文件形式,也可以是其他形式,按照它加载的标准来设计就不会有...
    99+
    2023-05-30
    java 虚拟机
  • MMDetection中对Resnet增加注意力机制Attention的简单方法
    # -*- encoding: utf-8 -*-'''@File : resnet_with_attention.py@Time : 2023/03/25 08:55:30@Author : RainfyLee ...
    99+
    2023-09-08
    python 深度学习 开发语言
  • Node.js源码中cjs模块的加载过程是什么
    这篇文章主要介绍了Node.js源码中cjs模块的加载过程是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Node.js源码中cjs模块的加载过程是什么文章都会有所收获,下...
    99+
    2024-04-02
  • Node.js中Nestjs框架的模块机制是什么
    这篇文章主要介绍“Node.js中Nestjs框架的模块机制是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Node.js中Nestjs框架的模块机制是什么”文...
    99+
    2024-04-02
  • 概述java虚拟机中类的加载器及类加载过程
    目录1. 类加载子系统 1.1 概述1.2 类的加载器2.类的加载过程2.1 类的加载过程简图2.2 加载阶段:Loading2.3 链接阶段:Linking2.4 初始化...
    99+
    2024-04-02
  • Java虚拟机之对象创建过程与类加载机制及双亲委派模型
    目录一、对象的创建过程: 1、对象的创建过程:2、对象的访问方式:二、类加载机制:2.1、加载阶段:2.2、验证阶段:2.3、准备阶段:2.4、解析阶段:2.5、初始化:2...
    99+
    2024-04-02
  • 深入探究Java中的类加载机制
    目录前言步入正题类的加载过程:1.加载2.验证3.准备4.解析5.初始化类加载器源码总结前言 学生时代应抱着问题去学习一门语言,例如:在学习java语言的过程中,我遇到过java主方...
    99+
    2024-04-02
  • 一文详解Java中的类加载机制
    目录一、前言二、类加载的时机2.1 类加载过程2.2 什么时候类初始化2.3 被动引用不会初始化三、类加载的过程3.1 加载3.2 验证3.3 准备3.4 解析3.5 初始化四、父类...
    99+
    2024-04-02
  • Java中类加载机制的实例讲解
    这篇文章主要介绍“Java中类加载机制的实例讲解”,在日常操作中,相信很多人在Java中类加载机制的实例讲解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中类加载机制的实例讲解”的疑惑有所帮助!接下来...
    99+
    2023-06-20
  • nodejs中简单实现Javascript Promise机制的实例
    promise/deferred 是一个很好的处理异步调用编码的规范,下面以nodejs代码为类,来实现一个promise/A 规范的简单实现 var EventEmitter = require('...
    99+
    2022-06-04
    实例 机制 简单
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作