Node.js------模块化

  • ◆ 能够说出模块化的好处
  • ◆ 能够知道 CommonJS 规定了哪些内容
  • ◆ 能够说出 Node.js 中模块的三大分类各自是什么
  • ◆ 能够使用 npm 管理包
  • ◆ 能够了解什么是规范的包结构
  • ◆ 能够了解模块的加载机制

一.模块化的基本概念  

1.模块化  

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

 2. 编程领域中的模块化

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

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

① 提高了代码的复用性

② 提高了代码的可维护性

③ 可以实现按需加载

模块化规范就是对代码进行模块化的拆分与组合时,需要遵守的那些规则。

例如:

⚫ 使用什么样的语法格式来引用模块

⚫ 在模块中使用什么样的语法格式向外暴露成员

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

二.Node.js 中的模块化

1.Node.js 中模块的分类  

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

2.加载模块

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

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

先创建06.m1.js文件,在创建07.test.js,在07里面调用06文件

06.m1.js

// 当前这个文件,就是一个用户自定义模块
console.log('加载了06这个用户自定义模块')

07.test.js

// 注意:在使用require加载用户自定义模块期间
// 可以省略.js的后缀名
const m1 = require('./06.m1')
console.log(m1)

 

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

1).模块作用域  

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

2).模块作用域的好处  

防止了全局变量污染的问题

先创建08-模块作用域.js,在创建09.test.js,在09里面调用08,无法被调用

08-模块作用域.js

const username = '张三'function sayHello(){console.log('大家好,我是'+ username)
}

 09.test.js

const custom = require('./08-模块作用域')
console.log(custom)

 

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

1).module 对象  

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

console.log(module)

 

2).module.exports 对象  

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

11.自定义模块.js

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

 12.test.js

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

 

3).共享成员时的注意点  

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

 11.自定义模块.js

// 在一个自定义模块中,默认情况下, module.exports = {}const age = 20// 向 module.exports 对象上挂载 username 属性
module.exports.username = 'zs'
// 向 module.exports 对象上挂载 sayHello 方法
module.exports.sayHello = function() {console.log('Hello!')
}
module.exports.age = age// 让module.exports指向一个全新的对象
module.exports={nickname:'小黑',sayHi(){console.log('Hi')}
}

  12.test.js

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

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

exports 和 module.exports 的使用误区

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

注意:为了防止混乱,建议大家不要在同一个模块中同时使用 exports 和 module.exports

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

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

CommonJS 规定:

  • ① 每个模块内部,module 变量代表当前模块。
  • ② module 变量是一个对象,它的 exports 属性(即 module.exports)是对外的接口。
  • ③ 加载某个模块,其实是加载该模块的 module.exports 属性。require() 方法用于加载模块。

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

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

相关文章

Redission分布式锁介绍和配置引入

本人在实际项目用于确保Key一致性经常使用的一种加锁方式,帮助分布式环境中互斥访问。很多人问不用锁不是一样完成目标吗?但需要清楚的是这是在高并发的场景下,多节点同时访问缓存的场景,是一般单体项目所无法比拟的,使…

外键创建和管理

什么是外键? 1)在Oracle数据库中,外键是用来实现参照完整性的方法之一。打个形象的比喻,外键是指定义外键的表的列的值必须在另一个表中出现。 2)被参照的表称之为父表(parent table),创建外键的…

Express

可以方便、快速创建Web网站的服务器(提供web网页资源)或API接口服务器(提供API接口) app.get(请求URL,function(req,res)>{}) //req:请求对象(包括请求属性和方法) //res:响应对象&#xff…

Go 源码之 gin 框架

Go 源码之 gin 框架 go源码之gin - Jxy 博客 一、总结 gin.New()初始化一个实例:gin.engine,该实例实现了http.Handler接口。实现了ServeHTTP方法 注册路由、注册中间件,调用addRoute将路由和中间件注册到 methodTree 前缀树(节…

HashSet解析

文章目录 集合简介对HashSet进行遍历迭代器增强forLambda表达式 Hash底层原理 集合简介 HashSet是Set集合下的子接口,set集合添加的元素是无索引,不重复,无序,与List系列集合正好相反。 无序:存储顺序不一致。 不重复…

全新的分布式锁,几行代码搞定,简单且强大

# 前言 分布式锁是分布式系统中一个极为重要的工具。目前有多种分布式锁的设计方案,比如借助 redis,mq,数据库,zookeeper 等第三方服务系统来设计分布式锁。tldb 提供的分布式锁,主要是要简化这个设计的过程&#xff0…

数据挖掘入门项目二手交易车价格预测之特征工程

文章目录 目标常见的特征工程具体步骤1. 导入数据2. 删除异常值3. 特征构造3.1 为树模型构造特征3.2 为LR NN 之类的模型构造特征 4. 特征筛选过滤式包裹式嵌入式 5. 总结 本文数据集来自阿里天池:https://tianchi.aliyun.com/competition/entrance/231784/informat…

云计算探索-DAS、NAS与SAN存储技术演进及其应用比较

1,介绍 随着信息技术的飞速发展,数据存储的需求日益增长,各种存储技术也应运而生。在众多的存储解决方案中,直接附加存储(Direct Attached Storage,简称DAS)、网络附加存储(Network …

初始Java篇(JavaSE基础语法)(5)(类和对象(下))

个人主页(找往期文章包括但不限于本期文章中不懂的知识点):我要学编程(ಥ_ಥ)-CSDN博客 目录 封装 访问限定符 封装扩展之包 自定义包 static成员 static修饰成员变量 static修饰成员方法 static成员变量初始化 内部类 对象的打…

Adaboost集成学习 | Matlab实现基于SVM-Adaboost支持向量机结合Adaboost集成学习时间序列预测(股票价格预测)

目录 效果一览基本介绍模型设计程序设计参考资料效果一览 基本介绍 Adaboost集成学习 | 基于SVM-Adaboost支持向量机结合Adaboost集成学习时间序列预测(股票价格预测)基于SVM(支持向量机)和AdaBoost集成学习的时间序列预测(如股票价格预测)是一种结合了两种强大机器学习算…

《极客时间TonyBai go语言第一课》学习笔记

文章目录 前置篇显式组合并发 入门篇大纲 前置篇 显式 在 C 语言中&#xff0c;下面这段代码可以正常编译并输出正确结果&#xff1a; #include <stdio.h> int main() { short int a 5; int b 8; long c 0; c a b; printf("%ld\n", c); }我们看到在上面…

Windows 电脑麦克风 自动启用/禁用 小玩具!

WinMicrophone Windows 系统的 麦克风设备&#xff08;启用/禁用&#xff09;切换驱动&#xff01;它是小巧且快速的&#xff0c;它能够自动的检测并切换麦克风的情况。 您可以在软件包仓库中找到发布版本的exe包&#xff0c;无需安装&#xff01;其能够大大增大您在Windows中…

Elasticsearch Java API使用(1):创建ElasticsearchClient

1、介绍 Elasticsearch是一个基于Lucene构建的开源搜索引擎&#xff0c;支持复杂的搜索功能。Java API SDK是Elasticsearch官方提供的一种方式&#xff0c;允许Java应用程序直接与Elasticsearch集群交互。8.x的版本和旧版本API差别比较大。本文没有使用Springboot data相关的功…

蓝桥杯第131题——生命之树

题目描述 在 X 森林里&#xff0c;上帝创建了生命之树。 他给每棵树的每个节点&#xff08;叶子也称为一个节点&#xff09;上&#xff0c;都标了一个整数&#xff0c;代表这个点的和谐值。 上帝要在这棵树内选出一个非空节点集 S&#xff0c;使得对于 S 中的任意两个点 a,b…

C# 字节数组 byte[] 关于byte的小寄巧

怎么读字节数组里面的内容 先是小错误 之 ToString然后是怎么办使用UTF-8编码使用ASCII编码使用其他编码未知编码注意 小demo下一个demo关于发送端的&#xff08;发送新行&#xff09;手搓bug编码之搓ascii encodeing评价为不如BitConverter一根 先是小错误 之 ToString 在C#中…

Linux C++ 011-引用

Linux C 011-引用 本节关键字&#xff1a;Linux、C、引用 相关库函数&#xff1a; 基本的使用 作用&#xff1a;给变量起别名 语法&#xff1a;数据类型& 别名 原名; int a 10;int& b a;b 100; // 此时 a 100注意事项 引用必须初始化 引用在初始化后&#xf…

【网站项目】面向社区健康服务的医疗平台

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

【MATLAB源码-第25期】基于matlab的8QAM调制解调仿真,手动实现未调用内置函数,星座图展示。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 8QAM调制&#xff08;8 Quadrature Amplitude Modulation&#xff09;是一种数字调制技术&#xff0c;它可以在有限带宽内传输更多的信息比特。在8QAM调制中&#xff0c;每个符号可以携带3个比特的信息。QAM调制是将数字信号…

插入排序---算法

1、算法概念 插入排序&#xff1a;它的工作原理是通过构建有序排序&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置插入。 2、算法步骤 将第一待排序序列第一个元素看作一个有序序列&#xff0c;把第二个元素到最后一个元素当成是…

程序员开启网络创作之旅,分享一些真知灼见

我的口袋可能没那些高手那么鼓&#xff0c;不过呢&#xff0c;我更愿意站在一个副业新手的立场上&#xff0c;跟那些跟我差不多的伙计们分享点心得。咱们不指望一夜暴富&#xff0c;只希望能有个稳稳的小收入就心满意足了。 你看&#xff0c;那些在公众号上写出爆文的人&#…