本文來自網易雲社區html
做者:陳觀喜node
網上關於npm升級不少方法多種多樣,可是在windows系統下不是每種方法都會正確升級。其中在windows系統下主要的升級方法有如下三種:git
首先最暴力的方法刪掉nodejs和npm,而後在官網上Download 最新的msi,而後msi的安裝會更新你的node和npm。github
其次就是利用 npm install -g npm,這種方法是網上大多數人使用的方法,可是這種方法會有潛在的問題,咱們在下面會介紹。shell
最後是利用npm-windows-upgrade來升級,參見How can I update npm on Windows?用管理員權限打開PowerShell,而後執行如下命令:npm
Set-ExecutionPolicy Unrestricted -Scope CurrentUser -Forcenpm install -g npm-windows-upgradenpm-windows-upgrade
其中,推薦使用第三種方法,這也是npm團隊官方推薦使用的方法編程
windows下的模擬終端:推薦使用powershell,經本人測試git bash 和mintty 終端模擬器在執行npm命令的時候會有問題,這兩個終端執行的原理有興趣的能夠研究一下。json
這種方法只須要刪除nodejs和npm,而後下載最新的node進行安裝就行。須要注意的是,刪除npm的時候,須要把NODEJS目錄下的npm文件夾和APPDATA的Roaming目錄下的文件夾下的npm、npm-cache文件夾刪除乾淨。windows
(NODEJS目錄指的是你安裝nodejs的目錄,默認是C:\Program Files\nodejs, APPDATA的Roaming目錄指的是C:\Users\<username>\AppData\Roaming,本人的APPDATA目錄是C:\Users\chenguanxi\AppData\Roaming。windows系統的應用程序常常把數據和設置存放在用戶的APPDATA目錄,每一個windows用戶都有本身的APPDATA目錄。)另外,APPDATA目錄的用途參考What Is the AppData Folder in Windows?bash
在執行這個方法以前,先看一下我如今的node和npm版本:
$ node -v v8.11.3$ npm -v5.6.0
而後執行npm install -g npm獲得如下結果:
$ npm -v 6.4.1
好像升級成功了?! 咱們來看一下是否是真的吧nodejs目錄的npm升級成功了:
打開NODEJS目錄下對應的npm目錄(C:\Program Files\nodejs\node_modules\npm) 的package.json文件:
仍是5.6.0!!
而後打開APPDATA路徑下的npm目錄(C:\Users\chenguanxi\AppData\Roaming\npm),能夠看到這裏新增長了一個npm,打開其package.json文件能夠獲得:
在終端下執行npm -v獲得的是APPDATA目錄npm的版本結果。那麼在執行npm命令的時候究竟是執行哪個npm呢?
從上圖得出,無論執行哪個路徑下的npm,獲得的結果都是同樣的。 再深一步,咱們先看一下NODEJS目錄下的npm是怎麼執行的。打開npm.cmd文件,瞭解這個文件到底執行了什麼。
咱們在npm.cmd文件加上一下log看一下相關的變量:
執行npm -v獲得的結果:
'~dp0: ' C:\Program Files\nodejs\'NODE_EXE: ' C:\Program Files\nodejs\\node.exe'NPM_CLI_JS: ' C:\Program Files\nodejs\\node_modules\npm\bin\npm-cli.js'NPM_PREFIX_NPM_CLI_JS: ' C:\Users\chenguanxi\AppData\Roaming\npm\node_modules\npm\bin\npm-cli.js'NPM_CLI_JS: ' C:\Users\chenguanxi\AppData\Roaming\npm\node_modules\npm\bin\npm-cli.js'npm command ===:' C:\Program Files\nodejs\\node.exe C:\Users\chenguanxi\AppData\Roaming\npm\node_modules\npm\bin\npm-cli.js6.4.1
重要的註釋(具體命令參考windows批處理(cmd/bat)編程詳解):
%~dp0只能夠用在批處理文件中,它是由它所在的批處理文件的目錄位置決定的,是批處理文件所在的盤符:+路徑,
設置npm-cli-js文件爲批處理文件處理的目錄對應的npm-cli.js文件關鍵:執行"%NODE_EXE%" "%NPM_CLI_JS%" prefix -g這個命令,也就是npm prefix -g這個命令(這個命令在下一小節說明),能夠獲得:C:\Users\chenguanxi\AppData\Roaming\npm。接着設置NPM_PREFIX_NPM_CLI_JS這個變量,若是存在NPM_PREFIX_NPM_CLI_JS,就把npm-cli.js設置爲NPM_PREFIX_NPM_CLI_JS目錄下的npm-cli.js文件
最後執行node.exe {對應的}\node_modules\npm\bin\npm-cli.js
npm prefix -g這個命令獲得如下結果:C:\Users\chenguanxi\AppData\Roaming\npm具體命令執行的過程大概是經過讀取prefix的配置,而後輸出配置的結果
打開C:\Program Files\nodejs\node_modules\npm目錄下的npmrc文件,能夠看到只有一行的代碼prefix=${APPDATA}\npm
${APPDATA}指的是node環境下的process.env.APPDATA變量
結果是:C:\Users\chenguanxi\AppData\Roaming
總結:
執行npm命令其實是執行了node ${對應的}/npm-cli.js這個命令,關鍵是哪個npm-cli.js文件:
總的執行過程就是要判斷執行哪個npm-cli.js文件。也就是說,若是存在全局prefix,那就執行全局prefix下的那個npm-cli.js 文件
也就是說執行npm命令,其實是執行./node.exe ${對應的目錄下}/node_modules\npm\bin\npm-cli.js
綜上所述,npm命令執行的是nodejs目錄下的npm命令。在弄清楚了npm是怎麼執行以後,咱們能夠知道執行npm install -g npm 這個命令,實際上是從新下載並安裝了全局環境的npm包,而後經過prefix這個配置來連接到全局環境下的npm-cli.js文件,這個過程並無對NODEJS目錄下的npm版本進行任何修改。
因此,潛在的問題是當prefix配置被修改以後,npm執行的環境是未知的,不推薦這種經過連接到全局npm包的代理方式來升級npm。
參見How can I update npm on Windows?
用管理員權限打開PowerShell,而後執行如下命令:
Set-ExecutionPolicy Unrestricted -Scope CurrentUser -Forcenpm install -g npm-windows-upgradenpm-windows-upgrade
1. ensureExecutionPolicy:檢查用戶的powershell 執行權限政策等2. ensureInternet:檢查用戶的網絡情況3. chooseVersion: 讓用戶選擇一個npm版本4. choosePath: 找到正確的npm安裝目錄5. upgrade:自動找到正升級npm的正確目錄,保護和從新應用現有的配置,最終調用npm install -g npm
詳細過程有興趣的能夠打開源文件看一下: 主要是如下三個文件:
C:\Users\chenguanxi\AppData\Roaming\npm\npm-windows-upgrade.cmd
C:\Users\chenguanxi\AppData\Roaming\npm\node_modules\npm-windows-upgrade\bin\npm-windows-upgrade.js
C:\Users\chenguanxi\AppData\Roaming\npm\node_modules\npm-windows-upgrade\lib\upgrader.js
也就是說執行npm-windows-upgrade,它會幫助咱們自動找到正升級npm的正確目錄,保護和從新應用現有的配置,最終調用npm install -g npm
綜上,在windows系統下升級npm的最佳方法是用npm-windows-upgrade來升級,這樣能夠保護而且從新應用到現有的配置,避免了潛在的問題。 經過以上實驗過程有如下知識點總結:
npm命令是經過node npm-cli.js 命令來實現的
windows系統下,npm的全局包管理環境和node目錄是分開的
以上有不對的地方,但願你們指正。
參考:
網易雲免費體驗館,0成本體驗20+款雲產品!
更多網易研發、產品、運營經驗分享請訪問網易雲社區。
相關文章:
【推薦】 追蹤掠食者:地下灰產如何擼死創業公司?
【推薦】 從互聯網+角度看雲計算的現狀與將來
【推薦】 測試周期內測試進度報告規範