Node.js -- 模块化

devtools/2024/9/19 13:28:51/ 标签: node.js

文章目录

  • 1. 模块化介绍
  • 2. 模块化初体验
  • 3. 模块暴露数据
  • 4. 导入文件(夹)模块
  • 5. 导入模块的基本流程
  • 6. CommonJS 规范

这里是引用

1. 模块化介绍

之前我们所编写的文件都是单个文件,这就会出现一些问题:

  1. 变量不能重复命名;
  2. 代码复用性差;
  3. 代码可维护性差

怎么解决这些问题呢?
就是使用Node.js 模块化!

将一个复杂的程序文件依据一定规侧(规范)折分成多个文件的过程称之为模块化
其中拆分出的每个文件就是一个模块,模块的内部数据是私有的,不过模块可以暴露内部数据以便其他模块使用(模块可以理解为功能,只能自己调用自己的功能,但是可以把功能展示给其他人,引导其他人来调用

模块化项目:编码时是按照模块一个一个编码的,整个项目就是一个模块化的项目

下面是模块化的一些好处:

  • 防止命名冲突
  • 高复用性
  • 高维护性

2. 模块化初体验

me.js

// 声明一个函数
function tiemo() {console.log('tiemo');
}// 暴露数据
module.exports = tiemo;

index.js

// 导入模块
const tiemo = require('./me.js')// 调用函数
tiemo()

3. 模块暴露数据

  1. module.exports 属性
    module.exports = tiemo; // 暴露单个数据;
    module.exports = {tiemo,chifan}; //暴露多个数据
  2. exports变量
    exports.tiemo = tiemo;
    exports.chifan = chifan;

使用时有几点注意:

  • module.exports可以暴露任意数据
  • 不能使用exports=value的形式暴露数据,模块内部module与exports的隐式关系exports module.exports ={}

因为存在module与exports的隐式关系exports
module.exports ={};所以exports.tiemo = tiemo 就像是在给对象设置属性,所以在调用时是可以执行的。

4. 导入文件(夹)模块

在模块中使用require 传入文件路径即可引入文件

const test = require('./me.js')

require 使用的一些注意事项:

  1. 对于自己创建的模块,导入路径时建议写相对路径,且不能省略./../;
  2. jsjson文件在导入时可以不用写后缀,c / c++ 编写的node 扩展文件也可以不写后缀,但是一般用不到;
    当出现两个文件名称一样,但是一个是js文件,一个是 json文件,那么会先导入js 文件内容
  3. 如果导入其他类型的文件,会以 js 文件处理;
  4. 如果导入的路径是个文件夹,则会首先检测该文件夹下package.json文件中main属性对应的文件,如果存在则导入,反之如果文件不存在会报错;
    如果main 属性不存在或者package.json 不存在,则会尝试导入文件夹下的index.js 和index.json ,如果还是没找到,就会报错
  5. 导入node.js 内置模块时,直接require 模块的名字即可,无需添加./../,例如:fs, http, path等

5. 导入模块的基本流程

这里我们将学习导入自定义模块的基本流程!

  1. 将相对路径转换为绝对路径,定位目标文件;
  2. 缓存检测;
  3. 读取目标文件代码;
  4. 包裹为一个函数并执行(自执行函数)。通过arguments.callee.toString()查看自执行函数;
  5. 缓存模块的值;
  6. 返回module.exports 的值
// 这部分代码都是伪代码 不能执行 只能帮助理解
function require (file) {// 1. 将绝对路径转换为相对路径 ,定位目标文件let absolutePath = path.resolve(__dirname, file)// 2. 缓存检测 如果之前执行过这个模块 那么直接会输出模块值 不会再进行下面的操作if (cashes[absolutePath]) {return caches[absolutePath];}// 3. 读取文件的代码let code = fs.readFileSync(absolutePath).toString();// 4. 包裹为一个函数 然后执行let module = {}let exports = module.exports = {}(function(exports,require,module,__filename,__dirname) {const test = {name: '大富翁'}module.exports = test;// 输出console.log(arguments.callee.toString());})(exports, require, module, __filename, __dirname)// 缓存结果caches[absolutePath] = module.exports// 返回module.exports 的值return module.exports
}

注:

  1. arguments.callee 指向函数arguments.callee.toString() 可以啊看到函数的代码体;
  2. 被包括起来的函数执行形式:
    (被包裹的函数)(函数实参)

6. CommonJS 规范

module.exportsexports以及require这些都是CommonJS模块化规范中的内容。
而Node,js是实现了CommonJS模块化规范,二者关系有点像JavaScript与ECMAScript


http://www.ppmy.cn/devtools/17940.html

相关文章

【后端】python与django的开发环境搭建指南

安装Git 双击Git 客户端安装文件,在安装页面,单击“Next” 在安装路径选择页面,保持默认,单击“Next” 在功能组件选择页面,保持默认,单击“Next” 在开始菜单文件夹设置页面,保持默认&am…

十七、Java网络编程(一)

1、Java网络编程的基本概念 1)网络编程的概念 Java作为一种与平台无关的语言,从一出现就与网络有关及其密切的关系,因为Java写的程序可以在网络上直接运行,使用Java,只需编写简单的代码就能实现强大的网络功能。下面将介绍几个与Java网络编程有关的概念。 2)TCP/IP协议概…

Python + SQLAlchemy操作MySQL数据库(ORM)

一、sqlalchemy简介 SQLAlchemy是用Python编程语言开发的一个开源项目。它提供了SQL工具包和ORM(对象关系映射)工具,使用MIT许可证发行。 SQLAlchemy采用简单的Python语言,提供高效和高性能的数据库访问,实现了完整的…

Python-100-Days: Day01

Day01 Python简介 1.1989年Guido von Rossum在圣诞节之夜开始着手python语言编译器的编写。 2.1991年2月 Python v1 编译器诞生,使用C实现的,此时可以调用C的库函数。 3.1994年1月,Python v1.0 正式版发布。 4.2000年10月16日&#xff0…

B008-方法参数传递可变参数工具类

目录 方法参数传递可变参数冒泡排序Arrays工具类Arrays工具类常用方法 方法参数传递 /*** java中只有值传递* 基本数据类型 传递的是具体的值* 引用数据类型 传递的是地址值*/ public class _01_ParamPass {public static void main(String[] args) {// 调用方法 getSumge…

关于MCU核心板的一些常见问题

BGA植球与焊接(多涂焊油): 【BGA芯片是真麻烦,主要是植锡珠太麻烦了,拆一次就得重新植】https://www.bilibili.com/video/BV1vW4y1w7oNvd_source3cc3c07b09206097d0d8b0aefdf07958 / NC电容一般有两种含义&#xff1…

【转载】C#集成JWT快速入门

一、JWT基本概念 JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于在双方之间安全地传输信息作为JSON对象。这些信息可以被验证、信任,因为它们是数字签名…

JVM(Jvm如何管理空间?对象如何存储、管理?)

Jvm如何管理空间(Java运行时数据区域与分配空间的方式) ⭐运行时数据区域 程序计数器 程序计数器(PC),是一块较小的内存空。它可以看作是当前线程所执行的字节码的行号指示器。Java虚拟机的多线程是通过时间片轮转调…

应用回归分析,R语音,逐步回归法,第5章

library(readr) data3_1 <- read_csv("data3.1.csv")View(data3_1) lm5<-lm(y~.,data=data3_1) lm6<-step(lm5,direction = "both") summary(lm6) 输出: Start: AIC=377.73 y ~ x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9Df Sum of Sq …

DIY高考倒计时小软件python实现

目录 一.前言 二.完整代码 三.代码分析 一.前言 高考倒计时是指从当前日期到高考日期之间的天数倒计时。高考是指中国的普通高等学校招生全国统一考试,是中国教育系统中最为重要和决定性的考试之一。在高考前,学生和家长通常会关注离高考还有多少天,以便合理安排备考时间…

【nvm最新解决方案】Node.js v16.20.2 is not yet released or available

【nvm最新解决方案】Node.js v16.20.2 is not yet released or available 解决办法&#xff1a;下载想安装的node压缩包&#xff0c;放入nvm对应目录。 2024年最新node压缩包地址&#xff1a;https://nodejs.org/dist/ 1、选择对应的node版本&#xff1a;例如&#xff0c;我选的…

STM32应用开发教程进阶--UART串口重定向(printf)

实现目标 1、掌握STM32 HAL库的串口重定向 2、具体目标&#xff1a;1、实现printf “打印”各种常用的类型的数据变量 一、串口“打印” UART串口通信协议是我们常用的通信协议&#xff08;UART、I2C、SPI等&#xff09;之一&#xff0c;全称叫做通用异步收发传输器&#xf…

【Web】HNCTF 2022 题解(全)

目录 Week1 Interesting_include 2048 easy_html What is Web Interesting_http easy_upload Week2 ez_SSTI easy_include ez_ssrf Canyource easy_unser easy_sql ohmywordpress Week3 ssssti Fun_php ez_phar QAQ_1inclu4e logjjjjlogjjjj …

学python的第十九天

网络通信和访问数据库 1.1 基本的网络知识 TCP/IP IP是低级的路由协议&#xff0c;它将数据拆分在许多小的数据包中&#xff0c;并通过网络将他们发送到某一特定地址&#xff0c;但无法保证所有包都抵达目的地&#xff0c;也不能保证包按顺序抵达 TCP&#xff08;传输控制协议…

如何制作个性又美观的二维码?自定义Logo、样式,还能一键复用

草料二维码提供基础的二维码美化设置&#xff0c;包含Logo、颜色、码点码眼、容错、添加文字等设置。 还提供150标签样式&#xff0c;标签样式中所有内容&#xff0c;包括LOGO、背景、字段数量等&#xff0c;均可修改。 同时&#xff0c;支持将样式保存到账号下&#xff0c;方…

295. 数据流的中位数

295. 数据流的中位数 中位数是有序整数列表中的中间值。如果列表的大小是偶数&#xff0c;则没有中间值&#xff0c;中位数是两个中间值的平均值。例如 arr [2,3,4] 的中位数是 3 。 例如 arr [2,3] 的中位数是 (2 3) / 2 2.5 。 实现 MedianFinder 类:MedianFinder() 初始…

博睿数据亮相GOPS全球运维大会,Bonree ONE 2024春季正式版发布!

2024年4月25日&#xff0c;博睿数据 Bonree ONE 2024 春季正式版焕新发布。同时&#xff0c;博睿数据AIOps首席专家兼产品总监贺安辉携核心产品新一代一体化智能可观测平台 Bonree ONE 亮相第二十二届 GOPS 全球运维大会深圳站。 Bonree ONE 2024 春季版产品重点升级数据采集、…

Docker数据卷的使用

1 数据卷概念 数据卷是一个共给容器使用的特殊文件目录&#xff0c;位于容器中&#xff0c;可以将宿主机的目录挂载到数据卷上&#xff0c;对数据卷的修改立刻可见&#xff0c;并且更新数据卷不会影响到容器的使用&#xff0c;从而实现数据在主机和容器之间共享。 2 创建数据…

Scala 04 —— Scala Puzzle 拓展

Scala 04 —— Scala Puzzle 拓展 文章目录 Scala 04 —— Scala Puzzle 拓展一、占位符二、模式匹配的变量和常量模式三、继承 成员声明的位置结果初始化顺序分析BMember 类BConstructor 类 四、缺省初始值与重载五、Scala的集合操作和集合类型保持一致性第一部分代码解释第二…

C语言——贪吃蛇游戏的实现

目录 一. 贪吃蛇的介绍 二. Win32 API 1. 控制台程序 2. COORD 控制台屏幕上的坐标 3. GetStdHandle 4. GetConsoleCursorInfo CONSOLE_CURSOR_INFO 5. SetConsoleCursorInfo 6. SetConsoleCursorPosition 封装的SetPos函数 7. GetAsyncKeyState 宏定义KEY_PRESS 三…