Node的模块加载

这篇具有很好参考价值的文章主要介绍了Node的模块加载。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在Node中,模块分为两类

  • Node提供的内置模块,称之为核心模块
  • 用户编写的自定义模块,称之为文件模块

而如果在Node中引入模块,主要经历三个步骤

  1. 路径分析
  2. 文件定位
  3. 编译执行

优先缓存加载

在Node中,如果是第二次通过require方法对模块进行引入,那么会采取优先缓存的方式。Node会将第一次编译和执行的对象放入缓存,提升效率。
而对于核心模块和文件模块,核心模块的检查优先于文件模块,例如你自己定义一个http,那么肯定是找不到滴。

路径分析

因为在Node中,是通过require来对模块进行引入的。而针对于不同的模块,查找和定位有不同程度上的差异。

(1)核心模块:主要是fs,http等模块。

核心模块的优先级仅次于缓存加载,它在Node的源代码编译中,加载过程最快。

(2)路径形式的文件模块:类似于require('./index.css')

这种文件模块,会被Node将路径转换为真实路径,用真实路径作为索引,将编译的结果存放到缓存中,一遍二次加载的时候速度更快。

(3)自定义模块:类似于require('mongose')

这种模块也一般都是通过npm进行下载安装的,它的查找是最费时的。而它的查找规则和JS中的原型链很像,不过不是__propto__,是通过node_modules一层层向上查找,直到找到目标文件为止。

文件定位

(1)文件扩展名分析

CommonJS允许在标识符中不存在文件扩展名,这个时候,Node会依次按.js,.json,.node给它拼上,然后在定位,尝试是否能给它找到。
由于Node是单线程,所以这个过程可能会引起性能问题

(2)目录分析包
有的时候,require引入的可能是一个文件夹,是一个目录。这个时候,Node会在这个文件夹中找到package.json文件,通过JSON.parse()解析出描述对象,拿到main属性指定的文件名进行定位。
如果没有找到呢,就会默认去找目录下的index,再一次按照.js,.json,.node进行查找。
如果这都没找到,那就G,抛出查找失败的异常。

模块编译

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

function Modal(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 = []
}

对于不同的文件类型:

  • .js文件:通过fs模块,同步读取文件后执行编译。
  • .node文件:通过C++的dlopen()加载执行
  • .json文件:通过JSON.parse()解析返回结果
  • 其余扩展名:都被当做.js文件载入
require,exports,module这三个东西在哪放着

不仅是这三个,还有__filename,__dirname。他们都是从何而来的呢?

事实上,在编译的过程中,Node会对JS文件的内容进行包装一下,在头部加上一个(function (exports,require,module,__filename,__dirname) {\n,在后面加上一个\n})

(function (exports,require,module,__filename,__dirname) {
  const math = require('math')
})()

给每个模块生成对应的方法,然后再将当前模块对象的这些属性和方法传进去。所以这些变量没有定义,但也能使用。文章来源地址https://www.toymoban.com/news/detail-599757.html

到了这里,关于Node的模块加载的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Node.js--fs模块

    fs模块的全称为 file system ,称之为 文件系统 ,是Node.js中的 内置模块 ,可以对计算机中的磁盘进行操作。 文件写入就是将 数据 保存到 文件 中,我们可以使用如下几个方法来实现该效果 方法 说明 writeFile 异步写入 writeFileSync 同步写入 appendFile/appendFileSync 追加写入 createWri

    2024年02月12日
    浏览(64)
  • Node.js -- fs模块

    fs – file system fs模块可以实现与硬盘的交互 例如文件的创建、删除、重命名、移动, 还有文件内容的写入、读取,以及文件夹的相关操作 导入fs 模块 写入文件 // 2 // 写入成功 其实,我们平常文件的保存也是使用了node 的fs 模块! 异步执行 上面我们在学习写入模块时举出的

    2024年04月25日
    浏览(43)
  • Node.js--模块化

    1.1 什么是模块化与模块 将一个复杂的程序文件依据一定规则(规范)拆分成多个文件的过程称之为 模块化 其中拆分出的 每个文件就是一个模块 ,模块的内部数据都是私有的,不过模块可以暴露内部数据以便其他模块使用 1.2 什么是模块化项目 编码时是按照模块一个一个编码

    2024年02月16日
    浏览(60)
  • Node.js模块的导出

    在Node.js中, module.exports 和 exports 是两种导出模块的方式,它们的作用是使得模块中的内容可以被其他模块引用和使用。 module.exports : module.exports 是一个指向当前模块所导出内容的对象的引用。你可以通过给 module.exports 赋值来导出一个对象、函数、类或者任何其他的JavaScrip

    2024年04月14日
    浏览(47)
  • (二)Node.js 基础模块

    1.1 什么是fs文件系统模块 fs模块是Node.js官方提供的、用来操作文件的模块。它提供了一系列的方法和属性,用来满足用户对文件的操作要求。 例如: fs.readFile() 方法,用于读取指定文件中的内容 fs.writeFile() 方法,用于向指定的文件中写入内容 如果要在JavaScript代码中,使用

    2024年02月14日
    浏览(37)
  • Node.js模块化

    说明:将复杂的程序文件,拆分多个文件的过程。模块的内部数据是私有的,不过模块可以暴露内部数据供其他模块使用。 说明:编码时是按照模块一个一个编码的,整个项目就是一个模块化的项目。 3.模块化的优势 说明: 提高代码的复用性:模块化可以将代码分解为可重

    2024年02月12日
    浏览(64)
  • 【Node.js】querystring 模块

    parse stringify escape/unescape 传入参数在 escape 包装下可以将参数中的有特殊字符进行转义,防止 sql 注入。

    2024年02月07日
    浏览(51)
  • node.js的http模块

    http协议 :超文本传输协议(互联网应用最广泛的协议之一) http请求方法: get获取数据 post新增数据 put/patch更新数据 delete删除数据 head/options/connect/trace URL 统一资源定位符,其本身也是一个字符串。 在网络节点中,负责消费资源的电脑,叫做客户端。 负责对外提供网络资源

    2024年02月08日
    浏览(93)
  • Node.js中fs模块

    fs模块是Node.js中的一个核心模块,全称为File System(文件管理系统)。该模块专门用来操作系统中的文件,常用的操作方式是对文件的读取和写入。 fs模块的API大都提供三种操作方式: 同步操作文件:代码会被阻塞,不会继续执行。 异步回调函数操作文件:代码不会被阻塞,

    2024年01月25日
    浏览(52)
  • 10-Node.js模块化

    目标 了解模块化概念和好处,以及 CommonJS 标准语法导出和导入 讲解 在 Node.js 中每个文件都被当做是一个独立的模块,模块内定义的变量和函数都是独立作用域的,因为 Node.js 在执行模块代码时,将使用如下所示的函数封装器对其进行封装 ​ 而且项目是由多个模块组成的,

    2024年02月07日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包