模块化
模块化是指解决一个复杂问题时,自顶向下逐层把系统划分成若干模块的过程。对于整个系统来说,模块是可组合、分解和更换的单元
编程领域中的模块化,就是遵守固定的规则,把一个大文件拆成独立并互相依赖的多个小模块
把代码进行模块化拆分的好处
提高了代码的复用性
提高了代码的可维护性
可以实现按需加载
模块的分类
内置模块(内置模块是由 Node.js 官方提供的,例如 fs、path、http 等)
自定义模块(用户创建的每个 .js 文件,都是自定义模块)
第三方模块(由第三方开发出来的模块,并非官方提供的内置模块,也不是用户创建的自定义模块,使用前需要先下载)
1 2 3 4 5 6 7 8
| const fs = require('fs')
const custom = require('./custom.js')
const moment = require('moment')
|
模块作用域
和函数作用域类似,在自定义模块中定义的变量、方法等成员,只能在当前模块内被访问,外部文件是访问不到的,这种模块级别的访问限制,叫做模块作用域
好处:防止了全局变量污染、文件依赖等问题的产生
module 对象
自定义模块中都有一个 module
对象,它里面存储了和当前模块有关的信息
向外共享
在自定义模块中,可以使用 module.exports
对象,将模块内的成员共享出去,供外界使用
外界用 require()
方法导入自定义模块时,得到的就是 module.exports
所指向的对象
1 2 3 4 5 6 7
| module.exports.username = 'zs'
module.exports.sayHello = function () { console.log('Hellp') }
|
exports 对象
由于 module.exports
单词写起来比较复杂,为了简化向外共享成员的代码,Node
提供了 exports
对象。默认情况下,exports
和 module.exports
指向同一个对象。最终共享的结果,还是以 module.exports
指向的对象为准
1 2 3 4 5 6 7 8 9 10
| console.log(exports === module.exports)
exports.username = 'zs'
exports.sayHello = function () { console.log('Hellp') }
|
注意:为了防止混乱,建议大家不要在同一个模块中同时使用 exports
和 module.exports
CommonJS
模块化规范
Node.js
遵循了 CommonJS
模块化规范,CommonJS
规定了模块的特性和各模块之间如何相互依赖
CommonJS
规定:
每个模块内部,module
变量代表当前模块
module
变量是一个对象,它的 exports
属性(即 module.exports
)是对外的接口
加载某个模块,其实是加载该模块的 module.exports
属性。require() 方法用于加载模块
包
Node.js
中的第三方模块又叫做包
包是基于内置模块封装出来的,提供了更高级、更方便的 API
,极大的提高了开发效率
包和内置模块之间的关系,类似于 jQuery
和 浏览器内置 API
之间的关系
node_modules
和 pageage-lock.json
的作用
node_modules
文件夹用来存放所有已安装到项目中的包。require()
导入第三方包时,就是从这个目录中查找并加载包
package-lock.json
配置文件用来记录 node_modules
目录下的每一个包的下载信息,例如包的名字、版本号、下载地址等
package.json
上述命令只能在英文的目录下成功运行!所以,项目文件夹的名称一定要使用英文命名,不要使用中文,不能出现空格。
项目的名称、版本号、描述等
项目中都用到了哪些包
哪些包只在开发期间会用到
那些包在开发和部署时都需要用到
dependencies 节点
用来记录使用 npm install命令安装了哪些包。
一次性安装所有的依赖包
卸载包
npm uninstall
命令执行成功后,会把卸载的包,自动从 package.json
的 dependencies
中移除掉
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:
npm config get registry
|
使用 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 这三个属性,分别代表包的名字、版本号、包的入口。
|