目录 (づ ̄ 3 ̄)づ=>
[TOC]
## 模块
### 什么是模块
>[info]一个JS文件就是一个模块
NodeJS模块文件是依据它自己发明的COMMONJS规范来书写的,一个常见的模块长这样:
```
let obj = {};
module.exports = obj; //导出obj
```
### 模块化的好处
>[success]低耦合、高内聚、方便维护、解决命名冲突...
- 低耦合:本身模块和其它模块文件没有关联
- 高内聚:相同的逻辑代码放在一个文件中
- 方便维护:都放到一个文件中的了。。。你说呢
- 解决命名冲突:只要文件名不重复就好
- 方便调用:若果是以前为了解决命名冲突可能导致命名过长,调用这个命名过长的对象下的属性就很。。。
### 模块的引入
>[info]我们可以通过使用require方法来引入一个文件
```
require('./文件名'); //引入本地模块
reuqire('模块名); //引入第三方
```
可以发现reuqire时并没有带上后缀,这是因为node会帮我们从`.js` `.node` `.json`三种后缀从前往后依次查找,看是否有匹配上的文件。且在当前工程的node_module中没有找到还会往上查找,直到根目录。
**注意:** 第三方模块引入时可以不用带上`./`。
---
#### 缓存机制
>[warning] 模块只会被加载一次,这意味着如果被加载的模块有打印代码只会打印一次,且如果是在同一个入口文件下的不同文件中多次require一个相同文件,这个被多个不同文件引入的文件其实同一份引用。
![](https://box.kancloud.cn/a00fff3cadad3b153da5b419a900cb01_1044x510.png)
相对的浏览器中的JS引入是不存在缓存机制的
#### 模块查找链
我们可以通过以下方式来查看查找链:
```
console.log(module.path); //会打印出当前模块所有可能的node_module路径
```
#### NODE_PATH
>[warning] **注意**:需在环境变量中手动设置查询链的顶端NODE_PATH
![](https://box.kancloud.cn/30a5542764dc48796331ddf614a163c6_848x699.png)
#### 循环引入
>[warning]有可能会出现这么一种情况,模块A引入了模块B,模块B又引入了模块A,**那么模块B引入的模块A只是模块A已经读过的地方(即引入模块B之前的代码)**
### 模块的导出
#### 模块包装
>[success] 一个运行在NodeJS下的JS文件会被NODE自动打包成一个匿名函数
```
function(exports,require,module,__filename,__dirname){
exports = module.exports = this = {};
...
return module.exports;
}
```
#### 导出模块中的内容
```
let obj = {};
modules.exports = obj;
```
>[danger]**注意:** 导出到一个文件时间上就是把上面NODE打包的匿名函数赋值粘贴到那个文件上,而匿名函数中实际return 的是module.exports
## NPM是什么
>[success] NPM:NODE Package Manager,是NodeJS的包管理工具,我们可以通过NPM来下载各种各样的第三方模块或则一个包(多个模块)
### 常用命令
- npm install(简写为i) [-g ][--save-dev(简写为-D)] 第三方模块/包的名字[@版本号]
默认为开发依赖;-D为开发依赖;-g为全局安装;npm i不带参数为安装packge.json上的全部依赖
- npm init [-y]
初始化一个包,-y代表选用默认配置
- npm uninstall [其它参数同install]
卸载一个包
### 发布一个包
>[danger] 注意发布前要把registry源改回来
```
npm login/addUsername //登录/注册 NPM账号
npm publish //发布当前工程目录下的包
npm unpublish 包名@版本号//撤销发布
```
## NRM是什么
>[success] NRM:NODE Registry mannager,是一个NPM包,我们可以通过安装它来切换NPM的镜像(源),以达到更好的下载体验。
### 常用命令
- npm i -g nrm
安装nrm
- nrm ls
查看所有镜像
- nrm use 镜像名
使用选中的镜像
- nrm test
镜像速度测试
### 其它
> 为了解决国内下载速度慢还可以选用两种方式
#### 安装cnpm
```
npm i -g cnpm //然后就可以把命令中的npm替换成cnpm其它和npm一样用
```
#### 安装yarn
```
npm i -g yarn //略微不同 详见npm包
```
## NVM是什么
>[success] NVM:NODE Version Manager,node的版本管理工具,也是一个npm包,需要先卸载已经安装的NPM和NodeJS
### 常用命令
nvm常用命令:
nvm install <version> ## 安装指定版本,可模糊安装,如:安装v4.4.0,既可nvm install v4.4.0,又可nvm install 4.4
nvm uninstall <version> ## 删除已安装的指定版本,语法与install类似
nvm use <version> ## 切换使用指定的版本node
nvm ls ## 列出所有安装的版本
nvm ls-remote ## 列出所以远程服务器的版本(官方node version list)
nvm current ## 显示当前的版本
nvm alias <name> <version> ## 给不同的版本号添加别名
nvm unalias <name> ## 删除已定义的别名
nvm reinstall-packages <version> ## 在当前版本node环境下,重新全局安装指定版本号的npm包