本文不是講package.json文件的配置,而是講npm命令本身的一些設置技巧及相關原理,如:如何用原生的npm命令使用淘寶的鏡像源?如何更改全局安裝的路徑?等等;我相信,對于高級用戶(龍其強迫癥者)肯定有許多諸如此類的需求;如果你正處理這些需求當中,那本文對你來說就是雪中送炭;
1. npm命令的配置
可以通過以下2種方式對npm命令進行配置:
- 通過npm的config指令;
此命令是用來管理npm的配置文件的;所以通過config命令配置的項目實際上是通過更新配置文件npmrc來配置的;
- 通過修改npm命令的配置文件npmrc文件;
npmrc配置文件的位置如下:
npm內嵌配置文件:/usr/local/lib/node_modules/npm/npmrc
全局配置文件:/etc/npmrc
用戶配置文件:~/.npmrc
項目配置文件$項目目錄/.npmrc
具體的配置命令如下
npm config set <key> <value> [-g|--global] //給配置參數key設置值為value;
npm config get <key> //獲取配置參數key的值;
npm config delete <key> //刪除置參數key及其值;
npm config list [-l] //顯示npm的所有配置參數的信息;
npm config edit //編輯配置文件
npm get <key> //獲取配置參數key的值;
npm set <key> <value> [-g|--global] //給配置參數key設置值為value;
2. 配置npm的注冊源的方式
-
通過給npm 命令添加注冊源選項;
示例如下:npm --registry=https://registry.npm.taobao.org [npm命令]
通過這種方式指定的注冊源只在本條命令內有效;
-
通過npm的config命令配置指向國內鏡像源;
示例如下:npm config set registry https://registry.npm.taobao.org //配置源為淘寶的源
注意:
通過config命令配置的項目實際上是通過更新用戶配置文件~/.npmrc來配置的; -
在配置文件.npmrc 文件寫入源地址;
示例如下:
.npmrc文件內容registry=https://registry.npm.taobao.org //寫入配置文件
備注:
- 第1種配置方法是命令內有效,第2和第3種配置方法是用戶內有效;
- 如果想恢復默認配置,只需要將用戶配置文件~/.npmrc刪除即可;
3. 使用淘寶鏡像的方法
使用淘寶鏡像有2種方式,如下:
- 安裝淘寶cnpm
$ npm install -g cnpm --registry=https://registry.npm.taobao.org
- 配置npm的源為淘寶的源https://registry.npm.taobao.org;
4. npm包的符號鏈接
npm的link命令是用來創建包的鏈接的;
他的具體機制如下:
- 如果在包的文件夾下執行
npm link
命令,則會在全局目錄下創建一個該包的符號鏈接{prefix}/lib/node_modules/<package>
,如果該包包含可執行的命令文件,則也會把該包的可執行命令文件鏈接到全局目錄下{prefix}/bin/{commandName}
; - 如果在不是包的文件夾下執行
npm link package-name
,則會在當前目錄./node_modules/
下創建一個全局包package-name的符號鏈接; - 如果在包packageA的文件夾下執行
npm link packageB
,則會:先把包packageB鏈接到全局目錄{prefix}/lib/node_modules/<packageB>
下,然后再把全局目錄下的包packageB鏈接到當前目錄下的./node_module
目錄下;
5. npm包的文件結構和安裝過程
1. 配置參數prefix
prefix參數指定全局安裝時相關目錄的共同路徑,即全局安裝的根目錄;
prefix在各個系統中的默認值如下:
大多數操作系統:/usr/local;
Windows系統:%AppData%\npm;
prefix的默認值是一般node的安裝位置;但在Unix系統上,prefix的位置是node安裝位置的上一級目錄,因為node通常安裝在 {prefix}/bin/node,而不是{prefix}/node.exe;
2. npm包的安裝方式及安裝目錄
1. npm的安裝包的方式有2種:
-
全局安裝:在安裝包時,當 global參數被設置為true 或者 全局選項被指定時,會進行全局安裝;此時,根據操作系統的不同,npm會將包安裝分別安裝如下位置:
Unix系統:{prefix}/lib/node_modules
Windows系統:{prefix}/node_modules 本地安裝:在安裝包時,當 global參數被設置為false 且 沒有指定全局選項時,會進行本地安裝;此時,npm會將包安裝到當前包下的node_modules目錄中 或 當前工作目錄下(如果當前目錄不在包中)的node_modules目錄中; 對于本地安裝的包,可以通過
require("packagename")
加載包的主模塊 或 通過require("packagename/lib/path/to/sub/module")
加載包的其他模塊;
當被安裝的包是可執行的腳本時,可執行文件會被分別鏈接到不同的文件夾下,具體如下:
在全局安裝時:
在Unix系統中,可執行文件會被鏈接到{prefix}/bin目錄下;
在Windows系統中,可執行文件會直接連接到{prefix}目錄下;
在本地安裝時:
可執行文件會被鏈接到./node_modules/.bin目錄下,以便可以通過npm運行腳本。
2. 手冊頁的安裝路徑
- 在全局模式下,手冊頁被鏈接到{prefix}/share/man目錄下;
- 在本地模式下,手冊頁不會被安裝。
- 在Windows系統中也不會安裝手冊頁。
3. 高速緩存文件的路徑
緩存的文件的路徑由cache配置參數指定。
cache配置參數的默認值如下:
Posix系統:~/.npm
Windows系統:~/npm-cache
4. 臨時文件的路徑
臨時文件存儲在由配置參數tmp指定的路徑下;
在不同的操作系統中,tem的默認值為:
一般操作系統:環境變量TMPDIR、TMP 或 TEMP 的值;
Unix系統:/tmp
Windows系統:c:\windows\temp
程序會在每次運行時為臨時文件生成一個唯一的目錄,并程序成功退出后刪除這個目錄;
2. npm安裝包的過程
以本地安裝 npm install foo@1.2.3
為例,npm的安裝過程如下:
- npm會沿著當前文件夾的層級樹查找包含 package.json文件 或 node_modules文件夾 的文件夾;
- 如果查找到匹配的文件夾,那么該文件夾會被作為npm的執行文件夾;如果沒有查找到匹配的文件夾,則會使用當剪的文件夾作為npm的執行文件夾;
- 加載foo包到緩存中;
- 然后解壓foo包到路徑 ./node_modules/foo
- 然后加載foo包的依賴包到緩存中;
- 然后解壓foo包的依賴包到路徑 ./node_modules/foo/node_modules/...
- 把每一個可執行文件符號鏈接至路徑 ./node_modules/.bin/,以便在必要時可以通過npm腳本找到它們;
3. 安裝建議
- 如果被安裝的包需要通過require()引入,則需要把包安裝在本地;
- 如果被安裝的包需要在命令行中運行,則需要把包安裝在全局;
- 如果被安裝的包即需要通過require()引入,又需要在命令行中運行,則需要把包 分別安裝在本地和全局 或者 用 npm link 創建鏈接;