06-Node.js—模块化

news2024/12/23 17:18:39

目录

  • 1、介绍
    • 1.1 什么是模块化与模块 ?
    • 1.2 什么是模块化项目 ?
    • 1.3 模块化好处
  • 2、模块暴露数据
    • 2.1 模块初体验
    • 2.2 暴露数据
      • 2.2.1 module.exports = value
      • 2.2.2 exports.name = value
  • 3、导入(引入)模块
  • 4、导入模块的基本流程
  • 5、CommonJS 规范
  • 参考

1、介绍

1.1 什么是模块化与模块 ?

  • 将一个复杂的程序文件依据一定规则(规范)拆分成多个文件的过程称之为 模块化
  • 其中拆分出的 每个文件就是一个模块 ,模块的内部数据是私有的,不过模块可以暴露内部数据以便其他 模块使用。

1.2 什么是模块化项目 ?

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

1.3 模块化好处

  • 下面是模块化的一些好处:
    • 防止命名冲突
    • 高复用性
    • 高维护性
  1. 防止命名冲突:
    比如我们有两个文件,一个index.js和index2.js,在文件里面有共同的变量Name,他们都是私有的,所以不存在命名冲突的问题。
  2. 高复用性:
    如果我们有多个项目都需要用到某个功能,采用模块化开发就可以提高代码的可复用性。
  3. 高维护性:
    在实际开发中大多数都是多人开发,如果将来这个项目某个功能需要升级或者删除,我们只需要将对应的模块升级或删除即可,提高了代码的维护性

2、模块暴露数据

2.1 模块初体验

  • 可以通过下面的操作步骤,快速体验模块化
  1. 创建my.js
//声明一个函数
function programming() {
  console.log('我会编程');
}
//暴露数据
module.exports = programming
  1. 创建index.js
//导入模块
const programming = require('./my.js')
// 调用函数
programming()

输出结果:
在这里插入图片描述

2.2 暴露数据

  • 模块暴露数据的方式有两种:
    • module.exports = value
    • exports.name = value

2.2.1 module.exports = value

  1. 创建my.js
//声明一个函数
function swimming() {
    console.log('我会游泳');
}
//暴露数据
module.exports = swimming
  1. 创建index.js
//导入模块
const swimming = require('./my')
// 输出swimming
swimming()
// 输出结果
//我会游泳

module.exports = value,如果有多个函数,可以以对象的形式暴露数据。

示例:

  1. 创建my.js
//声明函数
function swimming() {
    console.log('我会游泳');
}
function playBasketball() {
    console.log('我会打篮球');
}
//暴露数据
module.exports = {
    swimming,
    playBasketball
}
  1. 创建index.js
//导入模块
const exercise = require('./my')
// 输出exercise
exercise.swimming()
exercise.playBasketball()
// 输出结果
我会游泳
我会打篮球

module.exports可以暴露 任意数据

1.创建my.js

module.exports = 'I love you';
  1. 创建index.js
//导入模块
const exercise = require('./my')
console.log(exercise);
//输出结果
I love you

2.2.2 exports.name = value

1.创建my.js

//声明函数
function swimming() {
    console.log('我会游泳');
}
function playBasketball() {
    console.log('我会打篮球');
}
exports.swimming = swimming
exports.playBasketball = playBasketball
  1. 创建index.js
//导入模块
const exercise = require('./my')
// 输出exercise
exercise.swimming()
exercise.playBasketball()
// 输出结果
我会游泳
我会打篮球

注:不能使用 exports = value 的形式暴露数据;
模块内部 moduleexports 的隐式关系exports = module.exports = {}
require 返回的是目标模块中 module.exports 的值

3、导入(引入)模块

  • 在模块中使用 require 传入文件路径即可引入文件
const test = require('./my.js');
  • require 使用的一些注意事项:
    1. 对于自己创建的模块,导入时路径建议写相对路径 ,且不能省略 ./../
    2. jsjson 文件导入时可以不用写后缀,c/c++编写的node 扩展文件也可以不写后缀,但是一般用不到。
    3. 如果导入其他类型的文件,会以js 文件进行处理。
    4. 如果导入的路径是个文件夹,则会 首先 检测该文件夹下 package.json 文件main 属性对应的文件;
      如果存在则导入,反之如果文件不存在会报错
      如果main 属性不存在,或者 package.json 不存在,则会尝试导入文件夹下的 index.js 和index.json ,如果还是没找到,就会报错。
    5. 导入 node.js 内置模块时,直接 require 模块的名字即可,无需加 ./ ../

4、导入模块的基本流程

  • 这里介绍一下 require 导入 自定义模块 的基本流程
  1. 相对路径转为绝对路径,定位目标文件
  2. 缓存检测
  3. 读取目标文件代码
  4. 包裹为一个函数并执行(自执行函数)。通过 arguments.callee.toString() 查看自执行函数
  5. 缓存模块的值
  6. 返回 module.exports 的值

在这里插入图片描述

function require(file){
  //1. 将相对路径转为绝对路径,定位目标文件
  let absolutePath = path.resolve(__dirname, file);
  //2. 缓存检测
  if(caches[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)
  //5. 缓存结果
  caches[absolutePath] = module.exports;
  //6. 返回 module.exports 的值
  return module.exports;
}

const m = require('./me.js');


注:此代码为伪代码,不能够执行,用于方便我们理解 require 导入 自定义模块的基本流程

5、CommonJS 规范

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

CommonJS 模块化规范的详细说明:https://nodejs.cn/api/modules.html

参考

尚硅谷2023版Node.js零基础视频教程,nodejs新手到高手

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

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

相关文章

使用RabbitMQ的手动接收模式:消息第二次入队Failed to declare queue

问题&#xff1a;在rabbitMQ测试使用手动接收模式时发生 Failed to declare queue错误 : Channel shutdown: channel error; protocol method: #method<channel.close>(reply-code406, reply-textPRECONDITION_FAILED - unknown delivery tag 1, class-id60, method-id80…

C++ 命名空间、域、缺省参数、函数重载、引用、auto、内联函数的知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏

绪论 从本章开始我们正式进入到C的内容&#xff0c;对此如果没有学习过C语言的建议先将C语言系统的学习一遍后再来&#xff08;已经更新完在专栏就能看到&#xff09;。 话不多说安全带系好&#xff0c;发车啦&#xff08;建议电脑观看&#xff09;。 附&#xff1a;红色&#…

Linux运维基础

一.vim编辑器 1.编辑器介绍 vi/vim是visual interface的简称,是Linux中最经典的文本编辑器&#xff0c;同图形化界面中的文本编辑器一样&#xff0c;vi是命令行下对文本文件进行编辑的绝佳选择&#xff0c;粗暴理解相当于windows下的记事本。 vim是vi的加强版本,兼容vi的所有…

java版UWB人员定位系统源码,提供位置实时显示、历史轨迹回放、电子围栏、行为分析、智能巡检等功能

运用UWB定位技术开发的人员定位系统源码 文末获取联系&#xff01; 本套系统运用UWB定位技术&#xff0c;开发的高精度人员定位系统&#xff0c;通过独特的射频处理&#xff0c;配合先进的位置算法&#xff0c;可以有效计算复杂环境下的人员与物品的活动信息。 提供位置实时显…

SLAM论文速递【SLAM—— DynaSLAM:动态场景中的跟踪、建图和修复—4.19(1)

论文信息 题目&#xff1a; DynaSLAM:Tracking,Mapping and Inpainting in Dynamic Scenes DynaSLAM:动态场景中的跟踪、映射和修复论文地址&#xff1a; https://arxiv.org/pdf/1806.05620.pdf发表期刊&#xff1a; IEEE Robotics and Automation Letters ( Volume: 3, Issu…

RPC一文精通

基础&#xff1a; http是基于应用层协议&#xff0c;对请求和响应进行规范包装,一次http请求就会进行一次tcp连接和断开连接&#xff0c;属于短链接 udp是异步响应&#xff0c;无需建立连接&#xff0c;就可以发送封装的IP数据包 tcp是基于传输层协议&#xff0c;并规范了三…

Python单向循环链表操作

目录 一、单向循环链表 单向循环链表图 二、单向循环链表的操作 1、判断链表是否为空 2&#xff0c;链表长度 3&#xff0c;遍历整个链表 4&#xff0c;在链表头部添加元素 5、链表尾部添加元素 6&#xff0c;在指定位置插入元素 7&#xff0c;修改指定位置的元素 8&a…

JavaSE 和 Java EE 分别是什么

Java 作为最流行的编程语言受到了许多人的喜爱&#xff0c;其在编程中的地位自不必多说。 对于许多才刚刚入门 Java 的朋友来讲&#xff0c;常常会产生这样的困惑&#xff0c;JavaEE是什么&#xff1f;JavaSE又是什么&#xff1f; Java SE Java SE 是 Java Platform, Standa…

Liunx下进程间通信

文章目录 前言1.进程间通信相关介绍2.管道1.匿名管道2.管道的原理3.通过代码来演示匿名管道4.命名管道5.命名管道的原理6.命名管道代码演示 3.System V共享内存1.共享内存原理2.相关系统接口的介绍与共享内存的代码演示3.共享内存的一些特性 4.system V消息队列与system V信号量…

依赖注入方式

Spring中有哪些注入方式? 我们先来思考 向一个类中传递数据的方式有几种? 普通方法(set方法)构造方法 依赖注入描述了在容器中建立bean与bean之间的依赖关系的过程&#xff0c;如果bean运行需要的是数字或 字符串呢? 引用类型简单类型(基本数据类型与String) Spring就…

Primo Ramdisk内存盘工具软件

简介 Primo Ramdisk 软件的主要功能是通过独特的软件算法将物理内存模拟成一个超快速的硬盘&#xff0c;在这个虚拟硬盘上的读写操作均在内存中完成。由于物理内存的访问速度远远超过物理硬盘&#xff0c;因此虚拟硬盘具有非常高的数据读写速度&#xff0c;从而突破系统IO瓶颈&…

“SCSA-T学习导图+”系列:下一代防火墙

本期引言&#xff1a; 近年来&#xff0c;随着数字化业务带给我们高效和便捷的同时&#xff0c;信息暴露面的增加、网络边界的模糊化以及黑客攻击的产业化&#xff0c;使得网络安全事件相较以往成指数级增加。传统防火墙基于五元组的方式对进出网络的数据流量进行访问控制&…

医院影像图像科室工作站PACS系统 DICOM 三维图像后处理与重建

PACS报告系统的主要任务是通过运用不断积累诊断常用语&#xff0c;减轻出报告的劳动强度&#xff0c;并且将报告保存成电子文档以便日后查阅。在PACS的报告系统中&#xff0c;有三种不同层次的方法输入文字—“高级模板”、“分类词条”和“短语词典”。这三种方法的内容都可以…

记一次从JS到内网的横向案例

前言 前段时间参加了一场攻防演练&#xff0c;使用常规漏洞尝试未果后&#xff0c;想到不少师傅分享过从JS中寻找突破的文章&#xff0c;于是硬着头皮刚起了JS&#xff0c;最终打开了内网入口获取了靶标权限和个人信息。在此分享一下过程。 声明&#xff1a;本次演练中&#xf…

C/C++每日一练(20230422)

目录 1. 存在重复元素 &#x1f31f; 2. 组合总和 &#x1f31f;&#x1f31f; 3. 给表达式添加运算符 &#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日…

java基于J2EE的学生宿舍信息管理系统

本目 录 摘 要 I ABSTRACT II 第一章 绪论 1 1.1课题研究背景 1 1.2课题的目的和意义 1 1.3开发工具及简介 2 1.3.1开发工具 2 1.3.2 JSP技术 3 1.3.3 JavaScript 4 第二章 需求分析 4 2.1可行性分析 4 2.1.1技术的可行性 4 2.1.2经济的…

Faster RCNN系列1——Anchor生成过程

Faster RCNN系列&#xff1a; Faster RCNN系列1——Anchor生成过程 Faster RCNN系列2——RPN的真值与预测值概述 Faster RCNN系列3——RPN的真值详解与损失值计算 Faster RCNN系列4——生成Proposal与RoI Faster RCNN系列5——RoI Pooling与全连接层 一、RPN模块概述 RPN模块…

jsp946+java物流信息管理平台-sqlserver

本系统是一个独立的系统&#xff0c;用来解决物流信息信息的管理问题。采用JSP技术构建了一个有效而且实用的物流信息信息管理平台&#xff0c;目的是为高效地完成对物流信息信息的管理。 1、内部办公功能&#xff1a;包含工作计划、通告管理、公文管理&#xff1b; 包括可以…

手机录音误删怎么恢复?恢复录音,就这么简单!

案例&#xff1a;手机录音删除了还能恢复吗&#xff1f; 【友友们&#xff0c;苹果手机录音删除了还可以恢复吗&#xff1f;里面有一些关于会议记录的录音&#xff0c;不小心被我删了&#xff0c;有哪些方法可以快速恢复录音文件&#xff1f;】 如果您在使用iPhone手机录音时误…

Python小姿势 - ### Python之禅

Python之禅 Python之禅&#xff08;The Zen of Python&#xff09;是Python之父Guido van Rossum所著的一篇文章&#xff0c;总结了Python语言的哲学。 文章开头写道&#xff1a; Beautiful is better than ugly. Explicit is better than implicit. Simple is better than com…