模块化的基本概念
什么是模块化:
模块化是指解决一个复杂问题是,自顶向下逐层把系统划分成若干模块的过程。对于整个系统来说,模块是可组合 分解和更换的单元。
编程领域中的模块化,就是遵循固定的规则,把一个大文件拆成独立并互相依赖的多个小模块。
把代码进行模块化拆分的好处:
1 提高了代码的复用性
2 提高了代码的可维护性
3 可以实现按需加载
模块化规范
对代码进行模块化拆分与组合时 需要遵守哪些规则
例如:
使用什么样的语法格式来引入模块
在模块中使用什么样的语法格式向外暴露成员
模块化规范的好处:大家都遵守同样的模块化规范写代码,降低了沟通的成本,极大方便了各个模块之间的互相调用。
nodejs中模块的分类
nodejs中根据模块来源不同,将模块分为了三大类,分别是:
内置模块(内置模块是由nodejs官方提供的,例如fs path http等)
自定义模块(用户创建的每个js文件 都是自定义模块)
第三方模块(由第三方开发出来的模块,并非官方提供的内置模块,也不是用户创建的自定义模块,使用前需要先下载)npm install xxx
加载模块
使用强大的require()方法可以加载需要的内置模块 用户自定义模块 第三方模块进行使用
注意:导入自定义模块需要在括号中加上文件的路径
注意:在使用require加载用户自定义模块期间 可以省略js的后缀名
nodejs中的模块作用域
1 什么是模块作用域
和函数作用域类似 在自定义模块中定义变量 方法等成员,只能在当前模块内被访问,这种模块级别的访问限制,叫做模块作用域。
2 模块作用域的好处
防止了全局变量污染的问题
在模块内声明的变量无法被外界访问
向外共享模块作用域中的成员
1 module对象
在每一个js自定义的模块中都有一个module对象 ,它储存了和当前模块有关的信息
吧
2 module.exports对象
在自定义模块中,可以使用module.exports 对象,将模块内的成员共享出去,供外界使用。
外界使用require方法导入自定义模块时,得到的就是module.export所指向的对象。
//在一个自定义的模块中,默认情况下 module.exports = {}
//向module.exports 对象上挂载username属性
module.exports.username = 'fh'
module.exports.sayHello = function(){
console.log(“Hello”)
}
3 共享成员时的注意点
使用require()方法导入模块时,导入的结果,永远以module.export s指向的对象为准
4 exports对象
由于module.exports 单词写起来比较复杂,为了简化向外共享成员的代码 node提供了exports对象 默认情况下 exports和module.exports指向同一个对象,最终共享的结果还是module.exports 指向的对象为准。
console.log(exports)
console.log(module.exports)
这两行语句打印的都是空对象{}
所以module.exports可以简写成exports
但最终向外导出的结果永远都是module.exports所指向的对象
- exports 和module.exports的使用误区
时刻谨记,require()模块,得到的永远是module.exports指向的对象:
nodejs中的模块化规范
Node.js遵循了CommonJs模块化规范,CommonJs规定了模块的特性和各模块之间如何相互依赖。
CommonJS规定:
1 每个模块内部,module便俩个代表当前模块
2 module变量是一个对象,它的exports属性(module.exports)是对外的接口
3 加载某个模块,其实是加载该模块的module.exports属性.require()方法用于加载模块
npm与包
什么是包
Node.js中的第三方模块又叫做包
就像电脑和计算机指的是相同的东西
包的来源
包是由第三方个人或团队开发出来的,免费共所有人使用
nodejs中的包都是免费且开源的,不需要付费就可以下载使用
为什么需要包
由于Node.js的内置模块仅仅提供了一些底层的api,导致基于内置模块进行项目开发的时候效率很低。
包是基于内置模块封装出来的,提供了更高级更方便的API,极大的提高了开发效率
包和内置模块的关系 类似于jQuery和浏览器内置API的关系
- 从哪下载包
国外有一家IT公司叫做,叫做npm,Inc 这家公司旗下有一个非常著名的网站:https://www.npmjs.com/ 它是全球最大的包共享平台 可以从这个网站搜索到任何你需要的包
这个公司提供了一个地址为https://registry.npmjs.org/的服务器,来对外共享所有的包,我们可以从这个服务器上下载自己所需要的包。
如何下载包
包管理工具 Node Package Manage(简称npm)
执行 npm -v就可查看本地npm包管理工具的版本号
npm初体验
1 格式化时间的传统做法
创建格式化时间的自定义模块
定义格式化时间的方法
创建补零函数
从自定义模块中导出格式化时间
导入模块
调用模块中的方法
//导入格式化时间的自定义模块
const TIME = require("")
const dt = new Date()
//调用格式化时间的函数
const newDT = TIME.datreFormat(dt)
//创建格式化时间的实践
function dateFormat(dtStr){
}
//创建补零函数
function padZero(n){
}
//导出函数
module.exports = {
DateFormat
}
格式化时间的高级做法
使用npm包管理工具 在项目中安装格式化时间的包moment
使用require()导入格式化时间的包
参考moment的官方API文档对时间进行格式化
const moment = require('moment')
const dt = moment().format('YYYY-MM-DD HH:MM:SS')
console.log(dt)
在项目中如何安装包
如果希望在项目中安装指定名称的包
npm install '包完整的名称'
简写
npm i '包完整的名称'
初次装包后多了哪些文件
初次装包完成后,在项目文件夹下多一个叫做node_modules的文件夹和package-lock.json的配置文件。
其中:
node_modules 文件夹用来存放所有已安装到项目的包,require()导入第三包时,就是从这个目录中查找并加载包。
package-lock.json配置文件用来记录node_modules目录下的每个包的下载信息,例如包的名字 版本号 下载地址等
安装指定版本的包
在包的名称之后,通过@符号指定具体版本
npm i moment@2.22.2
包管理配置文件
npm规定 在项目根目录中,必选提供一个叫做package.json的包管理工具文件,用来记录与项目有关的一些配置信息
项目的名称 版本号 描述等
项目中都用到了哪些包
哪些包只在开发期间会用到
那些包在开发和部署时都需要用到
多人协作的问题
第三方包的体积过大,不方便团队成员之间共享项目源代码
解决方法:共享时剔除node_modules
- 如何记录项目中安装了哪些包
- 在根目录中 创建一个叫做package.json的配置文件,即可用来记录项目中安装了哪些包,从而方便剔除node_module之后告诉团队用到了哪些包
快速创建package.json
npm init -y
该命令可以快速创建包管理配置文件
注意:
上述命令只能在英文的目录下成功运行 所以项目文件夹的名称一定要使用英文命名,不要使用中文 不能出现空格
运行npm install 命令安装包的时候 npm包管理工具会自动把包的名称和版本号 记录到package.json 中
dependencies节点
package.json文件中,有一个dependencies节点,专门用来记录使用npm install命令安装了哪些包
一次性安装所有的包
当我们拿到一个剔除了node_modules的项目之后 需要先把所有的包下载到项目中,才能将项目运行起来。
直接运行npm install 就能一次性安装所有的依赖包
当运行这一命令时,npm包管理工具会先读取package.json 中的dependencies节点
读取该节点记录的所有依赖包名称以及版本号 之后npm包管理工具会一次性把这些包安装下来
npm install
卸载包
运行npm uninstall xxx命令 来卸载指定的包
npm uninstall xxx
这个命令执行之后 npm包管理工具会自动把这个包在package.json中的dependencies节点中去掉
devDependencies节点
如果某些包只在项目开发阶段会用到,在项目上线之后不会用到,则建议把这些包记录到devDependencies节点中。
与之对应的,如果某些包在开发和项目上线之后都需要用到实际,则建议把这些包记录到dependencies节点中。
npm install xxx -D
这个命令会把xxx包安装并把安装信息保存到devDependencies节点中
解决下包速度慢的问题
1 为什么下包速度慢
在使用npm工具下包的时候,默认会从国外的服务器进行下载,此时,网络数据的传输需要经过漫长的海底光缆 因此下包速度会慢
2 淘宝NPM镜像服务器
淘宝在国内搭建了一个服务器,专门把国外官方服务器上的包同步到国内的服务器,然后再国内提供下包的服务,从而极大的提高了下包的速度
扩展:
镜像是一种文件存储形式 一个磁盘上的数据在另一个磁盘上存在一个完全相同的副本即为镜像
3 如何切换npm下包镜像源
下包的镜像源 指的就是下包的服务器地址
//查看当前的下包镜像源
npm config get registry
//将下包的镜像源切换为淘宝镜像源
npm config set registry=https://registry.npm.taobao.org/
//检查镜像源是否下载成功
npm config get registry
4 rm
为了能够更方便的切换下包的镜像源 我们可以安装nrm这个小工具 利用nrm提供的终端指令 可以快速查看和切换下包的镜像源
npm i nrm -g
//查看所有可用的镜像源地址
nrm ls
//将下包的镜像源切换为别的服务器
nrm use taobao
包的分类
使用npm下载的包 分为两大类 项目包和全局包
项目包
哪些被安装到node_modules目录中的包 都是项目包
项目包又分为两类 分别是:
开发依赖包
核心依赖包
全局包
在执行npm install 命令时 如果提供了-g参数 则会把包安装为全局包
全局包会安装在npm文件夹中的node_modules目录中
卸载全局包
npm uninstal xxx -g
注意:
只有工具性质的包 才有全局安装的必要性
判断一个包是不是需要安装全局包 可以参考官方提供的使用说明
i5ting_toc
i5ting_toc 是一个把md文档转化为html页面的小工具 使用步骤如下:
# 安装
npm install -g i5ting_toc
# 调用i5ting_toc轻松实现md转html的功能
i5ting_toc -f 要转化的md文件路径 -o
规范的包结构
一个规范的包 它的组成结构必须符合一些规范
1 包必须以单独的目录而存在
2 包的顶级目录必须要包含package.json配置文件
3 package.json中必须要包含name version main三个属性 分别代表包的名字 版本号 包的入口