目錄 (づ ̄ 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一個相同文件,這個被多個不同文件引入的文件其實同一份引用。

相對的瀏覽器中的JS引入是不存在緩存機制的
#### 模塊查找鏈
我們可以通過以下方式來查看查找鏈:
```
console.log(module.path); //會打印出當前模塊所有可能的node_module路徑
```
#### NODE_PATH
>[warning] **注意**:需在環境變量中手動設置查詢鏈的頂端NODE_PATH

#### 循環引入
>[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包