Nodejs模块化及npm与包

1. 模块化的基本概念

1.1 什么是模块化

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

编程领域中的模块化

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

好处:

  1. 提高代码的复用性
  2. 提高了代码的可维护性
  3. 可以实现按需加载

1.2 模块化规范

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

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

2. Node.js 中的模块化

2.1 Node.js 中模块的分类

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

2.2 加载模块

使用 require() 方法,可以加载需要的内置模块、自定义模块、第三方模块进行使用

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

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

2.3 Node.js 中的模块作用域

2.3.1 什么是模块作用域

在自定义模块中定义的变量、方法等成员,只能在当前模块内被访问

请添加图片描述

2.3.2 模块作用域的好处

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

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

2.4.1 module 对象

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

请添加图片描述

2.4.2 module.exports 对象

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

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

在这里插入图片描述

注意:使用用 require() 方法导入自定义模块时,永远以 module.exports 所指向的对象为准

2.4.3 exports 对象

默认情况下,exports 和 module.exports 指向同一个对象。最终共享的结果,还是以 module.exports 指向的对象为准

在这里插入图片描述

2.4.4 exports 和 module.exports 的使用误区

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

在这里插入图片描述

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

2.5 Node.js 中的模块化规范

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

CommonJS 规定:

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

3. npm 与包

3.1 包

3.1.1 什么是包

Node.js 中的第三方模块又叫做包

3.1.2 为什么需要包

包是基于内置模块封装出来的,提供了更高级、更方便的 API,极大的提高了开发效率

3.1.3 从哪里下载包
  • 从 https://www.npmjs.com/ 网站上搜索自己所需要的包
  • 从 https://registry.npmjs.org/ 服务器上下载自己需要的包
3.1.4 如何下载包

npm, Inc. 公司提供了一个包管理工具,我们可以使用这个包管理工具,从 https://registry.npmjs.org/ 服务器把需要的包下载到本地使用

这个包管理工具的名字叫做 Node Package Manager (简称 npm 包管理器),这个包管理工具随着 Node.js 的安装包一起被安装到了用户的电脑上

在终端中执行 npm -v 命令,来查看自己电脑上所安装的 npm 包管理工具的版本号

在这里插入图片描述

3.2 npm 初体验

3.2.1 格式化时间的传统做法

在这里插入图片描述

3.2.2 格式化时间的高级做法
  1. 使用 npm 包管理工具,在项目中安装格式化时间的包 moment
  2. 使用 require() 导入格式化时间的包
  3. 参考 moment 的官方 API 文档对时间进行格式化

在这里插入图片描述

3.2.3 在项目中安装包的命令

如果想在项目中安装指定名称的包,需要运行如下的命令:

npm install 包的完整名称

简写

npm i 包的完整名称
3.2.4 初次装包后多了哪些文件

初次装包完成后,在项目文件夹下多一个叫做 node_modules 的文件夹和 package-lock.json 的配置文件

其中:

  • node_modules 文件夹用来存放所有已安装到项目中的包。require() 导入第三方包时,就是从这个目录中查找并加载包

  • package-lock.json 配置文件用来记录 node_modules 目录下的每一个包的下载信息,例如包的名字、版本号、下载地址等

3.2.5 安装指定版本的包

默认情况下,会自动安装最新版本的包

如果需要安装指定版本的包,可以执行以下命令

npm i moment@2.22.2

3.3 包管理配置文件

npm 规定,在项目根目录中,必须提供一个叫做 package.json 的包管理配置文件。用来记录与项目有关的一些配置信息。例如:

  • 项目的名称、版本号、描述等
  • 项目中都用到了哪些包
  • 哪些包只在开发期间会用到
  • 哪些包在开发和部署时都需要用到
3.3.1 多人协作问题

在这里插入图片描述

3.3.2 如何记录项目中安装了哪些包

在项目根目录中,创建一个叫做 package.json 的配置文件,用来记录项目中安装了哪些包。从而方便剔除 node_modules 目录之后,在团队成员之间共享项目的源代码

注意:在今后的项目开发中,一定要把 node_modules 文件夹,添加到 。gitignore 忽略文件中

3.3.3 快速创建 package.json

在执行命令所处的目录中,快速新建 package.json 文件

npm init -y
3.3.4 dependencies 节点

专门用来记录使用 npm install 命令安装了哪些包

在这里插入图片描述

3.3.5 一次性安装所有的包

当我们拿到一个剔除 node_modules 的项目之后,需要先把所有的包下载到项目中,才能将项目运行起来

运行 npm install 命令(或 npm i)一次性安装所有的依赖包

执行npm install 命令时,npm 包管理工具会先读取 package.json 中的 dependencies 节点

读取到记录的所有依赖包名称和版本号之后,npm包管理工具会把这些包一次性下载到项目中

3.3.6 卸载包

运行 npm uninstall 命令,来卸载指定的包

npm uninstall 具体的包名

注意:npm uninstall 命令执行成功后,会把卸载的包,自动从 package.json 的 dependencies 中移除掉

3.3.7 devDependencies 节点

如果某些包只在项目开发阶段会用到,在项目上线之后不会用到,建议把这些包记录到 devDependencies 节点中

如果某些包在开发和项目上线之后都需要用到,建议把这些包记录到 dependencies 节点中

可以使用如下命令,将包记录到 devDependencies 节点中:

// 安装指定的包,并记录到 devDependencies节点中
npm i 包名 -D
// 完整写法
npm install 包名 --save-dev

3.4 解决下包速度慢的问题

3.4.1 切换 npm 的下包镜像源
// 查看当前的下包镜像源
npm config get registry
// 将下包镜像源切换为淘宝镜像源
npm config set registry=https://registry.npm.taobao.org/
//  检查镜像是否下载成功
npm config get registry
3.4.2 nrm

为了更方便的切换下包的镜像源,我们可以安装 nrm 这个小工具,利用 nrm 提供的终端命令,可以快速查看和切换下包的镜像源

// 通过npm包管理器,将nrm安装为全局可用的工具
npm i nrm -g
// 查看所有可用的镜像源
nrm ls
//  将下包的镜像源切换为taobao镜像
nrm use taobao

3.5 包的分类

3.5.1 项目包

被安装到项目的 node_modules 目录中的包,都是项目包

项目包又分为两类,分别是:

  • 开发依赖包:被记录到 devDependencies 节点中的包,只在开发期间会用到
  • 核心依赖包:被记录到 dependencies 节点中的包,在开发期间和项目上线之后都会用到
// 开发依赖包
npm i 包名 -D
// 核心依赖包
npm i 包名
3.5.2 全局包

在执行 npm install 命令时,如果提供了 -g 参数,则会把包安装为全局包

全局包会被安装到 C:\Users\用户目录\AppData\Roaming\npm\node_modules 目录下

// 全局安装指定的包
npm i 包名 -g
// 卸载全局安装的包
npm uninstall 包名 -g
3.5.3 i5ting_toc

i5ting_toc 是一个可以把 md 文档转为 html 页面的小工具

// 将 i5ting_toc 安装为全局包
npm install -g i5ting_toc
// 调用 i5ting_toc,实现 md 转 html 的功能
i5ting_toc -f 要转换的md文件路径 -o

3.6 规范的包结构

  1. 包必须以单独的目录而存在
  2. 包的顶级目录下必须包含 package.json 这个包管理配置文件
  3. package.json 中必须包含 name,version,main 这三个属性,分别代表包的名字、版本号、包的入口
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

foursecond

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值