(三)Node.js - 模块化

1. Node.js中的模块化

Node.js中根据模块来源不同,将模块分为了3大类,分别是:

  • 内置模块:内置模块由Node.js官方提供的,例如fs、path、http等
  • 自定义模块:用户创建的每个.js文件,都是自定义模块
  • 第三方模块:由第三方开发出来的模块,并非官方提供的内置模块,也不是用户创建的自定义模块,使用前需要先下载

2. 加载模块

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

//1. 加载内置的fs模块
const fs = require('fs')
//2. 加载用户的自定义模块
const custom = require('./custom.js')
//3. 加载第三方模块
const moment = require('moment')

3. 什么是模块作用域

和函数作用域类似,在自定义模块中定义的变量方法等成员,只能在当前模块内被访问,这种模块级别的访问限制,叫做模块作用域

好处:防止全局变量污染问题,默认情况下,无法访问导入模块的变量和函数

3.1 向外共享模块作用域中的成员

1. module对象

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

console.log(module)//日志
Module {id: '.',path: '/Users/xxx/WebstormProjects/learnJS/5.nodeJS',exports: {},filename: '/Users/xxx/WebstormProjects/learnJS/5.nodeJS/3.module对象.js',loaded: false,children: [],paths: ['/Users/xxx/WebstormProjects/learnJS/5.nodeJS/node_modules','/Users/xxx/WebstormProjects/learnJS/node_modules','/Users/xxx/WebstormProjects/node_modules','/Users/xxx/node_modules','/Users/node_modules','/node_modules']
}
2. module.exports对象

在自定义模块中,可以使用module.exports对象,将模块内的成员共享出去,供外界使用

外界用require()方法导入自定义模块时,得到的就是module.exports所指向的对象。

自定义模块.js

//在一个自定义模块中,默认情况下,module.exports = {}//方式一:
//向module.exports对象上挂载username属性
module.exports.username = 'zs'
//向module.exports对象上挂载sayHello方法
module.exports.sayHello = function () {console.log('Hello')
}//方式二:
module.exports = {username: 'zs',sayHello: function () {console.log('Hello')}
}

test.js

//在外界使用require导入一个自定义模块的时候,得到的成员
//就是那个模块中,通过module.exports指向的那个对象
const m = require('./自定义模块')
console.log(m)

打印:

{ username: 'zs', sayHello: [Function: sayHello] }
3. 共享成员时的注意点

使用require()方法导入模块时,导入的结果,永远以module.exports指向的对象为准。

在这里插入图片描述

4. exports对象

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

console.log(exports)
console.log(module.exports)
console.log(exports === module.exports){}
{}
true

挂载属性:

exports.username = 'zs'
exports.sayHello = function (){console.log('hello')
}
5. exports和module.exports的使用误区

时刻谨记,require()模块时,得到的永远是module.exports指向的对象:

//案例一:
exports.username = 'zs'
module.exports = {gender: '男',age:22
}//{gender: '男', age: 22}//案例二:
module.exports.username = 'zs'
exports = {gender: '男',age:22
}//{username: 'zs'}//案例三:
exports.username = 'zs'
module.exoprts.gender = '男'//{username: 'zs', gender: '男'}//案例四:
exports = {username: 'zs',gender: '男'
}
module.exports = exports
module.exports.age = '22'//{username: 'zs', gender: '男', age: '22'}

4. Node.js中的模块化规范

Node.js遵循了CommonJS模块化规范,CommonJS规定了模块的特性各模块之间如何相互依赖

CommonJS规定:
(1)每个模块内部,module变量代表当前模块。
(2)module变量是一个对象,它的exports属性(即module.exports是对外的接口
(3)加载某个模块,其实是加载该模块的module.exports属性。require()方法用于加载模块

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

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

相关文章

jmeter 5.1彻底解决中文上传乱码

1.修改源码,然后重新打jar包,就是所有上传文件名重新获取文件名 参考链接:多种Jmeter中文乱码问题处理方法 - 51Testing软件测试网 2.修改Advanced,必须选java

RaabitMQ(三) - RabbitMQ队列类型、死信消息与死信队列、懒队列、集群模式、MQ常见消息问题

RabbitMQ队列类型 Classic经典队列 这是RabbitMQ最为经典的队列类型。在单机环境中,拥有比较高的消息可靠性。 经典队列可以选择是否持久化(Durability)以及是否自动删除(Auto delete)两个属性。 Durability有两个选项,Durable和Transient。 Durable表…

【ARM Coresight 系列文章 2.5 - Coresight 寄存器:PIDR0-PIDR7,CIDR0-CIDR3 介绍】

文章目录 1.1 JEDEC 与 JEP1061.2 PIDR0-PIDR7(peripheral identification registers)1.2 CIDR0-CIDR3(Component Identification Registers) 1.1 JEDEC 与 JEP106 JEDEC和JEP106都是来自美国电子工业联合会(JEDEC,Joint Electron Device Engineering C…

深度学习(34)—— StarGAN(1)

深度学习(34)—— StarGAN(1) 文章目录 深度学习(34)—— StarGAN(1)1. 背景2. 基本思路3. 整体流程4. StarGAN v2(1) 网络结构(2) mapping network(3) style encoder(4)Loss 和之前…

4个顶级的支持消费级硬件的NeRF软件平台

似乎每天都有大量的创新发布,人们很容易感到不知所措。因此,让我们放慢脚步,看看4个主流的支持消费级硬件的NeRF 平台。 推荐:用 NSDT设计器 快速搭建可编程3D场景。 1、Instant-NGP(Instant-NeRF) 2022 年…

【CTF】Python原型链污染

Python原型链污染 原型链 在Python中每个对象都有一个原型,原型上定义了对象可以访问的属性和方法。当对象访问属性或方法时,会先在自身查找,如果找不到就会去原型链上的上级对象中查找,原型链污染攻击的思路是通过修改对象原型…

计算机网络-三种交换方式

计算机网络-三种交换方式 电路交换(Circuit Switching) 电话交换机接通电话线的方式称为电路交换从通信资源分配的角度来看,交换(Switching)就是按照某种方式动态的分配传输线路的资源 电话交换机 为了解决电话之间通信两两之间连线过多,所以产生了电话…

认识 spring AOP (面向切面编程) - springboot

前言 本篇介绍什么是spring AOP, AOP的优点,使用场景,spring AOP的组成,简单实现AOP 并 了解它的通知;如有错误,请在评论区指正,让我们一起交流,共同进步! 文章目录 前言1. 什么是s…

快速制作美容行业预约小程序

随着科技的不断进步,移动互联网的快速发展,小程序成为了很多行业迅速发展的利器。对于美容行业来说,一款美容预约小程序不仅可以方便用户进行预约,还可以提升美容店铺的服务质量和管理效率。下面,我们来介绍一下如何快…

K8S deployment 重启的三种方法

一般重启deployment&#xff0c;常规操作是删掉对应的pod, 但如果有多个副本集的话&#xff0c;一个个删很麻烦。 除了删除pod&#xff0c;还可以&#xff1a; 方案一&#xff1a; 加上环境变量 kubectl patch deploy <deployment-name> -p {"spec":{"…

【云原生K8s】初识Kubernetes的理论基础

K8S由google的Borg系统(博格系统&#xff0c;google内部使用的大规模容器编排工具)作为原型&#xff0c;后经GO语言延用Borg的思路重写并捐献给CNCF基金会开源。 云原生基金会&#xff08;CNCF&#xff09;于2015年12月成立&#xff0c;隶属于Linux基金会。CNCF孵化的第一个项目…

iOS——Block循环引用

Capturing ‘self’ strongly in this block is likely to lead to a retain cycle 典型的循环引用 self持有了blockblock持有了self(self.name) 这样就形成了self -> block -> self的循环引用 解决办法 强弱共舞 使用 中介者模式 __weak typeof(self) weakSelf sel…

认识MyBatis 之 MyBatis的动态SQL

前言 本篇介绍MyBatis里如何使用动态SQL&#xff0c;了解如何去简单使用动态标签&#xff1b;如有错误&#xff0c;请在评论区指正&#xff0c;让我们一起交流&#xff0c;共同进步&#xff01; 文章目录 前言MyBatis - 动态 SQLif标签trim标签where标签update set 标签delet…

F5 LTM 知识点和实验 10-基础配置

第十章 基础配置 VLAN VLAN是对物理网络进行逻辑分区的一种方式,可以创建不同的广播域。将具有共同要求的主机分组在一个VLAN中——不管它们的物理位置如何——提供了明显的优势,包括: 减小广播域的大小,从而提高网络的整体性能显著减少系统和网络维护任务(功能相关的主机…

【Spring Boot】(二)Spring Boot 配置文件的探索之旅

文章目录 前言一、配置文件的作用二、配置文件的格式2.1 Spring Boot 配置文件格式2.2 properties 和 yml 的区别 三、properties 配置文件3.1 properties 基本语法3.2 配置文件的读取3.3 properties 优缺点分析 四、yml 配置文件说明4.1 yml 基本语法4.2 yml 使用案例4.3 yml …

两数相加 LeetCode热题100

题目 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会…

el-table某一列嵌套使用el-popover,使用click触发,导致页面下拉框组件无法触发弹框关闭(解决办法)

在弹框触发的方法里加上document.body.click() 即可 尝试了很多其他的方法都没用&#xff0c;只有这个解决了 完整代码&#xff1a; <el-select change"sourceChange" clearable ><el-optionv-for"option in list1":key"option.code":…

【 SpringSecurity】第三方认证方法级别安全

文章目录 SpringSecurity 第三方认证实现方法级别的安全 SpringSecurity 第三方认证 在登录网页时&#xff0c;时常有用其他账号登录的方式&#xff0c;它们能够让用户避免在Web站点特定的登录页上自己输入凭证信息。这样的Web站点提供了一种通过其他网站&#xff08;如Facebo…

matlab使用教程(9)—matlab基本语句

1.条件控制 - if、else、switch 条件语句可用于在运行时选择要执行的代码块。最简单的条件语句为 if 语句。例如&#xff1a; % Generate a random number a randi(100, 1); % If it is even, divide by 2 if rem(a, 2) 0 disp(a is even) b a/2; end 通过使用可选关键字 …

fishing之第四篇使用案例一模拟登陆口

文章目录 一、访问钓鱼平台二、Sending Profiles(发件人邮箱配置)三、User&Groups(接收人邮件列表)四、Landing Pags(钓鱼页面配置)五、Email Templates(邮件内容配置)六、Campaigns七、攻击结果查看免责声明一、访问钓鱼平台 详细查看第二篇的gophish的搭建 二…