Nodejs三、模块化

news2024/11/17 0:02:19

零、文章目录

Nodejs三、模块化

1、模块化的基本概念

(1)模块化是什么

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

(2)编程领域中的模块化

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

  • 把代码进行模块化拆分的好处:

    • 提高了代码的复用性

    • 提高了代码的可维护性

    • 可以实现按需加载

(3)模块化规范

  • 模块化规范:对代码进行模块化的拆分与组合时,需要遵守的那些规则。例如:使用什么样的语法格式来引用模块,在模块中使用什么样的语法格式向外暴露成员。

  • 模块化规范的好处:大家都遵守同样的模块化规范写代码,降低了沟通的成本,极大方便了各个模块之间的相互调用,利人利己。

2、Node.js 中模块化

(1)Node.js 中模块的分类

  • Node.js 中根据模块来源的不同,将模块分为了 3 大类,分别是:
    • 内置模块:(内置模块是由 Node.js 官方提供的,例如 fs、path、http 等)
    • 自定义模块:(用户创建的每个 .js 文件,都是自定义模块)
    • 第三方模块:(由第三方开发出来的模块,并非官方提供的内置模块,也不是用户创建的自定义模块,使用前需要先下载

(2)加载模块

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

  • 使用 require() 方法加载其它模块时,会执行被加载模块中的代码。

//1.加内置的fs模块
const fs = require('fs')

//2.加载用户的自定义模块
const custom = require('./02.custom.js')

//3.加第三方模块
const moment = require('moment')

(3)Node.js 中的模块作用域

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

image-20230615163642449

(4)共享模块中的成员

  • module对象:在每个 .js 自定义模块中都有一个 module 对象,它里面存储了和当前模块有关的信息,打印如下:

image-20230615164647237

  • module.exports对象
    • 在自定义模块中,可以使用 module.exports 对象,将模块内的成员共享出去,供外界使用。
    • 外界用 require() 方法导入自定义模块时,得到的就是 module.exports 所指向的对象。
    • 使用 require() 方法导入模块时,导入的结果,永远以 module.exports 指向的对象为准

image-20230615170522430

  • exports对象:由于 module.exports 单词写起来比较复杂,为了简化向外共享成员的代码,Node 提供了 exports 对象。默认情况下,exports和module.exports 指向同一个对象

image-20230615171026049

  • exports和 module.exports的使用误区
    • 时刻谨记,require() 模块时,得到的永远是 module.exports 指向的对象
    • 为了防止混乱,建议大家不要在同一个模块中同时使用 exportsmodule.exports

image-20230612102147690

(5)Node.js 中的模块化规范

  • Node.js 遵循了 CommonJS 模块化规范,CommonJS 规定了模块的特性和各模块之间如何相互依赖。
  • CommonJS 规定:
    • 每个模块内部,module变量代表当前模块。
    • module变量是一个对象module.exports对外的接口
    • require() 方法加载某个模块,其实是加载该模块的 module.exports 属性

3、模块的加载机制

(1)优先从缓存中加载

  • 模块在第一次加载后会被缓存。 这也意味着多次调用 require() 不会导致模块的代码被执行多次。
  • 不论是内置模块、用户自定义模块、还是第三方模块,它们都会优先从缓存中加载,从而提高模块的加载效率。

(2)内置模块的加载机制

  • 内置模块是由 Node.js 官方提供的模块,内置模块的加载优先级最高
  • 例如,require(‘fs’) 始终返回内置的 fs 模块,即使在 node_modules 目录下有名字相同的包也叫做 fs。

(3)自定义模块的加载机制

  • 使用 require() 加载自定义模块时,必须指定以 ./ 或 …/ 开头的路径标识符。在加载自定义模块时,如果没有指定 ./ 或 …/ 这样的路径标识符,则 node 会把它当作内置模块第三方模块进行加载。
  • 同时,在使用 require() 导入自定义模块时,如果省略了文件的扩展名,则 Node.js 会按顺序分别尝试加载以下的文件:
    • 按照确切的文件名进行加载
    • 补全 .js 扩展名进行加载
    • 补全 .json 扩展名进行加载
    • 补全 .node 扩展名进行加载
    • 加载失败,终端报错

(4)第三方模块的加载机制

  • 如果传递给 require() 的模块标识符不是一个内置模块,也没有以 ‘./’ 或 ‘…/’ 开头,则 Node.js 会从当前模块的父目录开始,尝试从 /node_modules 文件夹中加载第三方模块。
  • 如果没有找到对应的第三方模块,则移动到再上一层父目录中,进行加载,直到文件系统的根目录
  • 例如,假设在 ‘C:\Users\ly\project\foo.js’ 文件里调用了 require(‘tools’),则 Node.js 会按以下顺序查找:
    • C:\Users\ly\project\node_modules\tools
    • C:\Users\ly\node_modules\tools
    • C:\Users\node_modules\tools
    • C:\node_modules\tools

(5)目录作为模块

  • 当把目录作为模块标识符,传递给 require() 进行加载的时候,有三种加载方式:
    • 在被加载的目录下查找一个叫做 package.json 的文件,并寻找 main 属性,作为 require() 加载的入口
    • 如果目录里没有 package.json 文件,或者 main 入口不存在或无法解析,则 Node.js 将会试图加载目录下的 index.js 文件
    • 如果以上两步都失败了,则 Node.js 会在终端打印错误消息,报告模块的缺失:Error: Cannot find module ‘xxx’

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

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

相关文章

基于Java汽车养护管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精…

计算机网络408题(2020-2022)

2020年 2021年 下面借此大题来分析主机H1访问Web服务器的应用场景的全部过程。 2022年 综合大题 冲突域是指一组设备共享同一段物理网络,当其中一个设备发送数据时,其他设备必须等待,以避免数据冲突。在一个冲突域中,当两个或多…

计算机网络管理 实验4(二) SNMP报文管理信息结构SMI及其规定的ASN.1分析并使用Wireshark抓包分析sysContact的相关信息

⬜⬜⬜ 🐰🟧🟨🟩🟦🟪(*^▽^*)欢迎光临 🟧🟨🟩🟦🟪🐰⬜⬜⬜ ✏️write in front✏️ 📝个人主页:陈丹宇jmu &am…

关系数据库SQL数据查询

关系数据库SQL数据查询 数据查询 一、单表查询 1.查询仅涉及一个表,选择表中的若干列 [例1] 查询全体学生的学号与姓名。SELECT Sno,SnameFROM Student; [例2] 查询全体学生的姓名、学号、所在系。SELECT Sname,Sno,SdeptFROM Student;查询全部列 选出所有属…

python代码实现生成二维码

二维码结构: 从图中我们可以看出二维码结构整体划分为功能图形和编码区两大部分,功能图形又细分为:空白区、位置探测图形、位置探测图形分隔符、定位图形、校正图形,而编码区细分为:格式信息、版本信息、数据和纠错码字…

Flutter进阶-List数组的深浅拷贝问题

浅拷贝:拷贝指针深拷贝:拷贝一份新的对象 浅拷贝出现的问题:操作一个数组另一个数组也发生改变 List list [1, 2, 3, 4, 5]; List copyList list; copyList[0] abc; print(list);///打印: [abc,2,3,4,5] print(copyList);///打…

机器学习——博客推荐系统

前言 在当今的信息时代,技术博客已成为知识、见解和娱乐的重要来源。随着博客内容的日益丰富,找到最相关和最引人入胜的文章对用户来说可能是一项艰巨的任务。为了应对这一挑战,我们需要一个全面的博客推荐系统,利用尖端技术和机…

RabbitMQ + SpringCloud使用及避坑(大章)

RabbitMQ 的开发语言是Erlang,它的源码阅读起来学习成本太高了,所以这里就不详细看了,本次主要是结合springCloud 的项目来真正使用RabbitMQ 的几种交换器,还有一些业务场景的模拟,最主要的还是避坑。 为什么说是避坑…

JavaSE进阶--玩转IO流

文章目录 前言一、File类介绍1、概念引入2、实际应用2.1 操作文件2.2 操作文件夹 二、IO流介绍三、字符流1、读文件1.1 一次读一个1.2 一次读多个,使用char数组去装 2、写文件2.1 一次写一个2.2 一次写完,使用字符数组 3、文件复制3.1 综合应用3.2 使用缓…

ESP32(MicroPython)LVGL输入字符显示到OLED屏幕

本程序用于输入字符显示到OLED屏幕(按回车键输出字符到屏幕),依次输出六行字符,再按回车会清空屏幕并从第一行开始输出。 代码如下 import lvgl as lv import time from espidf import VSPI_HOST from ili9XXX import ili9341…

模拟随机验证码

网拷一篇中英文文本,去除标点空格作为验证码字符集。 (本笔记适合对 python 的随机模块有一定了解的的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》&a…

如何在IDEA上实现JDBC编程

💕人生在世,不如意事常八九,若把烦恼全都写在纸上,时间长了纸也会烦。所以,没事的时候给自己多一些微笑,少一些烦恼。💕 🐼作者:不能再留遗憾了🐼 &#x1f3…

【备战秋招】每日一题:4月23日美团春招第二题:题面+题目思路 + C++/python/js/Go/java带注释

为了更好的阅读体检,为了更好的阅读体检,,可以查看我的算法学习博客第二题-制作骰子 在线评测链接:P1246 题目内容 塔子哥是一个喜欢手工制作的人,他经常用各种材料制作一些有趣的物品。他最近想要制作一个骰子,但是…

Oracle11gRAC安装JVM组件

目录: 安装前检查:安装JVM组件:方式一(图形化安装)方式二(执行脚本安装) 检查DB JVM状态脚本 安装前检查: 检查角色: select * from dba_roles where ROLE in (JAVAIDP…

分布式安装配置spark-3.2.3

Spark是一个基于内存的大数据计算框架,可以与Hadoop集成,提供更快速的数据处理能力。本文将介绍如何在三个Ubuntu系统上搭建一个Spark集群。 主要步骤包括: 准备工作:下载安装包,设置环境变量,解压安装包…

基于Elasticsearch与Hbase组合框架的大数据搜索引擎

本项目为学校大数据工程实训项目,共开发4周,答辩成绩不错。代码仓库放文章尾,写的不好,代码仅供参考。 搜索 对于结构化数据,因为它们具有特定的结构,所以我们一般都是可以通过关系型数据库(M…

【读书笔记】《房思琪的初恋乐园》- 林奕含

文章目录 第一章 乐园第二章 失乐园 第一章 乐园 钱爷爷说:“两个小美女有心事啊?”怡婷最恨人家叫她们两个小美女,她很这种算术上的好心。 在外人看来,女生无论长得漂亮还是长得不怎么样都是一种原罪。或者正如上野千鹤子所说那样…

pocketgl

pocketgl支持在自己的web页面集成类似 Shadertoy、 Threejs 等基于webGL 的渲染图形窗口, 并且拥有shader代码高亮编辑器支持实时修改和预览。 其自带的mesh包含两个Sphere 和 Teaport, 同时支持上床自定义的网格 和 背景天空盒。其既支持像Shadertoy 这种只包含fra…

[元带你学: eMMC协议详解 13] 数据读(Read) 写(Write) 详解

依JEDEC eMMC 5.1及经验辛苦整理,付费内容,禁止转载。 所在专栏 《元带你学: eMMC协议详解》 内容摘要 全文 4700字, 主要内容 1. 数据读取 2. 块读取操作 3. 数据写 4.块写操作 参考 1. 数据读取 当没有数据传输时,DATO-D…

Python使用happybase写入HBase

HBase是一个分布式的、面向列的NoSQL数据库,可以存储大量的非结构化或半结构化的数据。tif是一种常见的影像文件格式,可以存储多波段的栅格数据。本文将介绍如何使用Python的happybase模块和gdal模块,从tif格式的影像文件中读取数据&#xff…