模块化

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

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

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

  • 提高了代码的复用性

  • 提高了代码的可维护性

  • 可以实现按需加载


模块的分类

  1. 内置模块(内置模块是由 Node.js 官方提供的,例如 fs、path、http 等)

  2. 自定义模块(用户创建的每个 .js 文件,都是自定义模块)

  3. 第三方模块(由第三方开发出来的模块,并非官方提供的内置模块,也不是用户创建的自定义模块,使用前需要先下载)

1
2
3
4
5
6
7
8
// 1. 加载内置的 fs 模块
const fs = require('fs')

// 2. 加载用户的自定义模块
const custom = require('./custom.js')

// 3. 加载第三方模块,(使用第三方模块)
const moment = require('moment')

模块作用域

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

好处:防止了全局变量污染、文件依赖等问题的产生


module 对象

自定义模块中都有一个 module 对象,它里面存储了和当前模块有关的信息


向外共享

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

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

1
2
3
4
5
6
7
// 向 module.exports 对象上挂载 username 属性
module.exports.username = 'zs'

// 向 module.exports 对象上挂载 sayHello 方法
module.exports.sayHello = function () {
console.log('Hellp')
}

exports 对象

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

1
2
3
4
5
6
7
8
9
10
// 默认情况下,`exports` 和 `module.exports` 指向同一个对象
console.log(exports === module.exports) // true

// 将私有成员共享出去
exports.username = 'zs'

// 直接挂载方法
exports.sayHello = function () {
console.log('Hellp')
}

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


CommonJS 模块化规范

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

  2. CommonJS 规定:

  • 每个模块内部,module 变量代表当前模块

  • module 变量是一个对象,它的 exports 属性(即 module.exports)是对外的接口

  • 加载某个模块,其实是加载该模块的 module.exports 属性。require() 方法用于加载模块


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

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

包和内置模块之间的关系,类似于 jQuery 和 浏览器内置 API 之间的关系


node_modulespageage-lock.json 的作用

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

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


package.json

1
npm init -y // 快速创建package.json

上述命令只能在英文的目录下成功运行!所以,项目文件夹的名称一定要使用英文命名,不要使用中文,不能出现空格。

  1. 项目的名称、版本号、描述等

  2. 项目中都用到了哪些包

  3. 哪些包只在开发期间会用到

  4. 那些包在开发和部署时都需要用到


dependencies 节点

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


一次性安装所有的依赖包

1
npm install 或 npm i

卸载包

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

1
npm uninstall 具体的包名 或 npm un 

devDependencies 节点

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

1
2
npm i 包名 -D
npm install 包名 --save-dev

解决npm下包慢的问题

切换 npm 的下包镜像源

1
2
3
4
5
6
7
8
npm config get registry // 查看当前的下包镜像源

npm config set registry=https://registry.npm.taobao.org/
// 将下包的镜像源切换为淘宝镜像源

npm config get registry // 检查镜像源是否下载成功

//https://registry.npmjs.org/ 默认的镜像源在国外服务器上的所以慢

使用 nrm 切换下载包的服务器

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

1
2
3
npm i nrm -g // 安装为全局
nrm ls // 查看镜像源
nrm use taobao // 切换镜像源

包的分类

  • 开发依赖包,被记录到 devDependencies 节点中的包,只在开发期间会用到

  • 核心依赖包,被记录到 dependencies 节点中的包,在开发期间和项目上线之后都会用到


全局包

1
2
npm i 包名 -g	// 全局安装指定的包
npm uninstall 包名 -g // 卸载全局安装的包
  • 只有工具性质的包,才有全局安装的必要性。因为它们提供了好用的终端命令

  • 判断某个包是否需要全局安装后才能使用,可以参考官方提供的使用说明即可


i5ting_toc

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

1
2
npm install -g i5ting_toc // 需要安装为全局包
i5ting_toc -f 要转换的md文件路径 -o

包的结构

1
2
3
4
一个规范的包,它的组成结构,必须符合以下 3 点要求:
1. 包必须以单独的目录而存在
2. 包的顶级目录下要必须包含 package.json 这个包管理配置文件
3. package.json 中必须包含 name,version,main 这三个属性,分别代表包的名字、版本号、包的入口。