Node.js模块化的基本概念和分类及使用方法

1.模块概念

模块:指解决一个复杂问题的时候,自顶向下逐层把系统划分成若干模块的过程。对于整个系统来讲,模块是可以组合、分解和更换的单元。

在编辑领域中的模块,就是遵守固定的规则,把一个大文件拆成独立并且相互依赖的多个小模块。

代码进行模块拆分的好处有:提高代码的复用性,提高代码的可维护性,可以实现按需加载。

2.模块分类
2.1、内置模块(内置模块是由Node.js官方提供的,如fs、path、http等)
  • fs 模块:用于文件操作,包括读取文件、写入文件、创建目录、删除文件等。
  • http 模块:用于创建 HTTP 服务器和客户端,可以处理 HTTP 请求和响应。
  • https 模块:与 http 模块类似,但支持安全的 HTTPS 协议。
  • path 模块:用于处理文件路径,包括路径解析、拼接、规范化等。
  • events 模块:用于实现事件驱动的编程,可以创建和处理事件。
  • stream 模块:用于处理流式数据,可以读取和写入可流式的数据。
  • util 模块:包含一些实用工具函数,如继承、类型判断、错误处理等。
  • crypto 模块:提供加密和解密功能,包括哈希算法、对称加密和非对称加密等。
  • os 模块:提供与操作系统相关的功能,如获取操作系统信息、处理文件路径等。
  • querystring 模块:用于解析和序列化 URL 查询字符串。
2.2、自定义模块(每个用户创建的 .js文件,都是自定义模块)
2.3、第三方模块(由第三方开发出来的模块,使用前需先下载)
3.加载模块
3.1、require

使用 require() 方法,可以加载需要的内置模块、自定义模块、第三方模块进行使用

注:使用 require() 方法加载其他模块时,会执行被加载模块中的代码

加载内置模块
const fs = require("fs");
加载自定义模块
  • 模块名中的.js可省略
  • 相对路径与绝对路径皆可
const custom = require("./custom.js");
加载第三方模块
const moment = require("moment")
3.2、exports

在项目中创建hello.js

exports.world = ()=>{console.log('Hello World')
}

hello.js通过exports将world作为模块的访问接口,可以提供给外部加载调用。

const hello = require('./hello')
hello.world()

Node.js 提供了 exports 和 require 两个对象,其中 exports 是模块公开的接口,require 用于从外部获取一个模块的接口,即所获取模块的 exports 对象。

3.3、module

将整个对象作为访问接口,在项目中创建hello.js

const Hello = ()=>{let namethis.setName = (val)=>{name = val}this.sayHello = ()=>{console.log("Hello " + name)}
}module.exports = Hello

hello.js通过module.exports将Hello对象作为模块的访问接口,可以提供给外部加载调用。

const Hello = require('./hello')
let hello = new Hello()
hello.setName('World')
hello.sayHello()

exports返回模块函数,而module.exports返回模块本身。

4.模块作用域

模块作用域:模块作用域和函数作用域类似,在自定义模块中定义的变量、方法只能在当前模块内被访问,这种模块级别的访问限制。模块作用域的好处可以防止全局变量污染的问题。

// 模块作用域
const username = "张三";
function funcs(){console.log("大家好,我叫" + username);
};
5.模块的加载机制

模块在第一次加载后会被缓存,多次去调用 require() 模块的代码只会被执行一次。无论是内置模块、自定义模块、还是第三方模块,它们都会优先从缓存中加载,提高模块的加载效率。

  • 内置模块的加载机制:内置模块的加载优先级最高

  • 自定义模块的加载机制:当使用 require() 加载自定义模块时,必须以 ./ 或 …/ 开头的路径标识符。如果没有使用 ./ 或 …/ 的路径标识符,则 node.js 会把它当作内置模块或第三方模块去加载。

  • 第三方模块的加载机制:当传递给 require() 的模块标识符不是一个内置模块,也没有以 ./ 或 …/ 开头,则 node.js 会从当前的模块的父目录开始,尝试从 /node_modules 文件夹中加载第三方模块,如果没有找到对应的第三方模块,会移动到上一层父目录中进行加载,直到文件系统的根目录。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/220346.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

devops相关面试题

1、发布10 NPM包,熟悉NRM、NVM。 1、谈谈你参与发布的NPM包,它们解决了什么问题,有什么特点? NPM: 是 Node.js 默认的包管理工具 NRM:是 Node.js 源管理工具 NVM:Node.js 版本管理工具 我参与发布的NPM包为mk-form,它通过配置生成和验证复杂表单,简化…

网络编程及相关概念

网络 概念:两台或多台设备通过一定物理设备连接起来构成了网络 根据网络的覆盖范围不同,对网络进行分类: 局域网:覆盖范围最小,仅仅覆盖一片小区域。 城域网:覆盖范围较大,可以覆盖一个城市。…

打印机怎么扫描文件到电脑?6个步骤!轻松完成!

“在工作时我经常需要用到打印机,有时候需要将部分文件扫描到电脑。但是我不是很清楚应该如何操作,有什么方法可以让打印机快速传输文件到电脑的方法吗?” 在人们的工作和学习中,打印机成了很多用户的必备工具。人们可以用它来打印…

C++中的接口有什么用

2023年12月13日,周三上午 今天上午在适配器模式,我发现如果想真正理解适配器模式,就必须学会使用C中的接口,就必须明白为什么要在C中使用接口,所以重新学习了一下C中的接口 目录 C中的接口有什么用用代码说明“实现多…

python注释规范

Python 中的函数注释通常使用文档字符串(docstring)来提供对函数的说明。文档字符串是放置在函数、模块或类的顶部的字符串,用于描述其功能、输入参数、返回值以及其他相关信息。以下是一些建议的 Python 函数注释规范: 使用三重…

本地搭建Linux DataEase数据可视化分析工具并实现公网访问

文章目录 前言1. 安装DataEase2. 本地访问测试3. 安装 cpolar内网穿透软件4. 配置DataEase公网访问地址5. 公网远程访问Data Ease6. 固定Data Ease公网地址 前言 DataEase 是开源的数据可视化分析工具,帮助用户快速分析数据并洞察业务趋势,从而实现业务…

软件测试面试中基础与功能的问题

一、 你们的测试流程是怎么样的? 答:1.项目开始阶段, BA (需求分析师) 从用户方收集需求并将需求转化为规格说明书,接 下来在 项目组领导 会组织需求评审。 2.需求评审通过后,BA 会组织 项目…

React中类组件和函数组件的区别?

面试官:说说对React中类组件和函数组件的理解?有什么区别? 一、类组件 类组件,顾名思义,也就是通过使用ES6类的编写形式去编写组件,该类必须继承React.Component 如果想要访问父组件传递过来的参数&#…

剑指 Offer(第2版)面试题 28:对称的二叉树

剑指 Offer(第2版)面试题 28:对称的二叉树 剑指 Offer(第2版)面试题 28:对称的二叉树解法1:递归解法2:镜像二叉树 前序遍历 剑指 Offer(第2版)面试题 28&…

kernel(三):kernel移植

本文主要探讨210官方kernel移植。 配置文件选择 选择配置文件smdkv210_android_defconfig(arch/arm/configs) 修改主Makefile 配置cpu架构和交叉编译工具链 vim MakefileARCH ? armCROSS_COMPILE ? /root/arm-2009q3/bin/arm-none-linux-gnueabi- 初步编译烧…

使用对象处理流ObjectOutputStream读写文件

注意事项: 1.创建的对象必须实现序列化接口,如果属性也是类,那么对应的类也要序列化 2.读写文件路径问题 3.演示一个例子 (1)操作的实体类FileModel,实体类中有Map,HashMap这些自带的本身就实现了序列化。 public class File…

Gradio: 实时性能反馈的机器学习演示工具 | 开源日报 No.107

comfyanonymous/ComfyUI Stars: 17.5k License: GPL-3.0 这个项目是 ComfyUI,它提供了一个图形化界面和后端来设计和执行复杂的稳定扩散工作流程。 节点/图表/流程图接口用于实验并创建复杂的稳定扩散工作全面支持不同版本的 Stable Diffusion异步队列系统部分更新…

薅github的羊毛-用pages建自己的博客或资源站 - 博客工具 - 2/2

笔者调研了好多个静态博客工具,最后锁定Hexo了,但不等于其他博客不行。我只吐槽两个 Hugo - 难用Gridea - 简直就是骗钱的,我交钱用不了 theme没有链接,同步也同步不了,估计以前是可以,现在经营不下去&…

十大经典排序算法知识体系终结篇

目录 一. 前言 二. 冒泡排序(Bubble Sort) 2.1. 概念 2.2. 算法步骤 2.3. 代码实现 三. 选择排序(Selection Sort) 3.1. 概念 3.2. 算法步骤 3.3. 代码实现 四. 插入排序(Insertion Sort) 4.1. …

wireshark使用

1、抓包界面介绍 2、过滤 (1) ip过滤 or 端口过滤 ip.src 192.168.1.104 显示源地址为192.168.1.104的数据包列表 ip.dst192.168.1.104, 显示目标地址为192.168.1.104的数据包列表 ip.addr 192.168.1.104 显示源IP地址或目标IP地址为192.168.1.104的数据包列表 port 80 …

C++进阶篇9---类型转换

C语言中的类型转换 在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与 接收返回值类型不一致时,就需要发生类型转化,C语言中总共有两种形式的类型转换:隐式类型 转换和…

RRC下的NAS层

无线资源控制(Radio Resource Control,RRC),又称为无线资源管理(RRM)或者无线资源分配(RRA),是指通过一定的策略和手段进行无线资源管理、控制和调度,在满足服…

2.操作符详解

1.10进制转二进制方法 所以125的二进制就是1111101 2.2进制转8进制: 从2进制序列中右边最低位开始向左每3个2进制位换算为一个8进制位,剩余不够3个2进制位的直接换算 例:01101011转为01 101 011 即1 5 3 即8进制的153 还原回去的话: 将3化为011放最右边,5化…

使用PM2,在生产环境稳定运行你的node项目

PM2 一个 node&#xff0c;本身就用几行代码&#xff0c;就可以启动个 server 进程&#xff0c;监听个端口&#xff0c;为大家提供 Web 服务 一、依赖安装 npm install pm2 -g 二、命令行启动 普通执行启动 pm2 start <js 文件路径 >.js 携带参数启动 pm2 start < 某种…

【数学】整除与同余

基本概念 在数论中&#xff0c;整除不得不说是一种最为基础的知识了。 a a a 整除 b b b&#xff0c;记作 a ∣ b a|b a∣b 设 a , b ∈ Z a,b\in\Z a,b∈Z 且 b ≠ 0 b\ne 0 b0&#xff0c;则 b ∣ a b|a b∣a 当且仅当 ∃ q ∈ Z \exist q\in\Z ∃q∈Z 满足 q b …