之前一直使用的是node v2.2.0版本,挺說新版本的node解決了npm安裝插件產生文件夾結構過深的問題,所以就想更新試試;
上網一看才發現,尼瑪的node已經到了6.+版本了,好吧,看來還是得跟上節奏;
但是呢,怎么更新node就成了個問題,卸載重裝? 這樣又會出現一些配置的麻煩;
經過一番查找發現:可以使用 nvm 管理不同版本的 node 與 npm;
nvm 是 Mac 下的 node 管理工具,有點類似管理 Ruby 的 rvm,如果是需要管理 Windows 下的 node,官方推薦是使用 nvmw 或 nvm-windows 。
接下來就記錄一下我安裝nvmw的具體過程和一些坑;(不要問我為什么選nvmw,因為窮叼不會用Mac,而-windows貌似有些問題)
百度了一早上,終於完成了node的升級,從頭開始來吧,也整理了一下其中遇到的問題;
1、首先下載 nvmw https://github.com/hakobera/nvmw
方法:
git clone https://github.com/hakobera/nvmw.git;或者直接下載zip壓縮包;
由於本人的git不知道抽什么瘋,clone的時候一直出現
如果有大神知道是什么問題,請評論留言;萬分感謝;
2、配置環境變量
復制nvmw路徑,我的電腦右鍵→屬性→高級系統設置→高級→環境變量
這里我用戶環境和系統環境都該了,照理說改系統環境就可以了;

這里有個坑,就是修改變量后要重新關閉CMD,重開一次,才能正常運用;
3、配置完后打開CMD,輸入nvmw,如果正確配置的話可以查看幫助
百度的時候聽說 nvmw install v6.9.2 無法安裝成功;
我沒試過,不過我用的是沒有v的 nvmw install 6.9.2成功了;

4、不要高興的太早,這才是剛剛開始;
第一個坑: 直接使用nvmw install 6.9.2 來安裝新版本時提示:

解決辦法:這樣的錯誤,原因是因為JS擴展名的文件被其他軟件關聯了,需要取消關聯。
如系統中安裝了ULTRAEDIT或者E鑽加密軟件等,就需要去掉關聯;
或者如下解決方法:
在運行中輸入“regedit”進入注冊表,
只需要把[HKEY_CLASSES_ROOT\.js] 項下的那個默認值改成 "JSFile" 就可以正常運行JS 文件了。
第二個坑:
這貨直接在天朝是使用不了的,好在這個外國作者也知道中國的國情。提供了如何設置淘寶鏡像的方式
set "NVMW_NODEJS_ORG_MIRROR=http://npm.taobao.org/mirrors/node"
set "NVMW_IOJS_ORG_MIRROR=http://npm.taobao.org/mirrors/iojs"
set "NVMW_NPM_MIRROR=http://npm.taobao.org/mirrors/npm"
注:每次使用,都得重新在命令行中設置,或者可以這三個變量也設置到環境變量中,或改一下他的源碼,把這三個變量寫死。
第三個坑:我是windows7系統,對應的是x64沒錯,但是在淘寶NPM鏡像站和官方鏡像站上對應的都是win-x64 ;
進入nvmw的程序目錄。
1.修改nvmw.bat文件137行,x64改為win-x64
2.修改fget.js文件47行,XMLHTTP 更改為ServerXMLHTTP
其實有現成的修改版的nvmw.bat 一下就是代碼,可以留個副本;
1 @echo off 2 if not defined NVMW_HOME ( 3 set "NVMW_HOME=%~dp0" 4 ) 5 if not defined PATH_ORG ( 6 set "PATH_ORG=%PATH%" 7 ) 8 set IS64=FALSE 9 if exist "%PROGRAMFILES(X86)%" ( 10 set IS64=TRUE 11 ) 12 if %IS64% == TRUE ( 13 set OS_ARCH=x64 14 ) else ( 15 set OS_ARCH=x32 16 ) 17 if not defined NVMW_NODEJS_ORG_MIRROR ( 18 set "NVMW_NODEJS_ORG_MIRROR=https://nodejs.org/dist" 19 ) 20 if not defined NVMW_IOJS_ORG_MIRROR ( 21 set "NVMW_IOJS_ORG_MIRROR=https://iojs.org/dist" 22 ) 23 if "%1" == "install" if not "%2" == "" ( 24 call :install %2 %3 25 if not ERRORLEVEL == 1 call :use %2 %3 26 exit /b %ERRORLEVEL% 27 ) 28 if "%1" == "use" if not "%2" == "" ( 29 call :use %2 %3 30 exit /b %ERRORLEVEL% 31 ) 32 if "%1" == "ls" ( 33 call :ls 34 exit /b %ERRORLEVEL% 35 ) 36 if "%1" == "uninstall" if not "%2" == "" ( 37 call :uninstall %2 %3 38 exit /b %ERRORLEVEL% 39 ) 40 call :help 41 exit /b %ERRORLEVEL% 42 ::=========================================================== 43 :: help : Show help message 44 ::=========================================================== 45 :help 46 echo; 47 echo Node Version Manager for Windows 48 echo; 49 echo Usage: 50 echo nvmw help Show this message 51 echo nvmw install [version] [arch] Download and install a [version] 52 echo for [arch] architecture (optional) 53 echo nvmw uninstall [version] Uninstall a [version] 54 echo nvmw use [version] Modify PATH to use [version] 55 echo nvmw ls List installed versions 56 echo; 57 echo Example: 58 echo nvmw install v0.10.21 Install a specific version number of node.js 59 echo nvmw use v0.10.21 Use the specific version 60 echo nvmw install iojs Install the latest version of io.js 61 echo nvmw install iojs-v1.0.2 Install a specific version number of io.js 62 echo nvmw use iojs-v1.0.2 Use the specific version io.js 63 echo; 64 echo nvmw install v0.10.35 x86 Install a 32-bit version 65 exit /b 0 66 ::=========================================================== 67 :: install : Install specified version node and npm 68 ::=========================================================== 69 :install 70 setlocal 71 set ARCH=%OS_ARCH% 72 if not "%2" == "" ( 73 set ARCH=%2 74 :: x86, ia32 alias x32 75 if "%2" == "x86" ( 76 set ARCH=x32 77 ) 78 if "%2" == "ia32" ( 79 set ARCH=x32 80 ) 81 ) 82 set NODE_TYPE=node 83 set NODE_VERSION=%1 84 :: nvmw install iojs-v1.0.2 85 if "%NODE_VERSION:~4,1%" == "-" ( 86 for /f "tokens=1,2,* delims=-" %%a in ("%NODE_VERSION%") do ( 87 set NODE_TYPE=%%a 88 set NODE_VERSION=%%b 89 ) 90 ) 91 :: nvmw install iojs 92 if %NODE_VERSION% == iojs ( 93 set NODE_TYPE=iojs 94 set NODE_VERSION=latest 95 ) 96 :: nvmw install node 97 if %NODE_VERSION% == node ( 98 set NODE_TYPE=node 99 set NODE_VERSION=latest 100 ) 101 :: iojs-1.0.0, iojs-latest 102 if not %NODE_VERSION:~0,1% == v if not %NODE_VERSION:~0,1% == l ( 103 set NODE_VERSION=v%NODE_VERSION% 104 ) 105 if %NODE_TYPE% == iojs ( 106 set DIST_URL=%% 107 if %ARCH% == x32 ( 108 set NODE_EXE_URL=%NVMW_IOJS_ORG_MIRROR%/%NODE_VERSION%/win-x86/iojs.exe 109 ) else ( 110 set NODE_EXE_URL=%NVMW_IOJS_ORG_MIRROR%/%NODE_VERSION%/win-x64/iojs.exe 111 ) 112 ) else if %NODE_VERSION:~0,1% == 0 ( 113 if %ARCH% == x32 ( 114 set NODE_EXE_URL=%NVMW_NODEJS_ORG_MIRROR%/%NODE_VERSION%/node.exe 115 ) else ( 116 set NODE_EXE_URL=%NVMW_NODEJS_ORG_MIRROR%/%NODE_VERSION%/x64/node.exe 117 ) 118 ) else ( 119 if %ARCH% == x32 ( 120 set NODE_EXE_URL=%NVMW_NODEJS_ORG_MIRROR%/%NODE_VERSION%/win-x86/node.exe 121 ) else ( 122 set NODE_EXE_URL=%NVMW_NODEJS_ORG_MIRROR%/%NODE_VERSION%/win-x64/node.exe 123 ) 124 ) 125 set "NODE_HOME=%NVMW_HOME%%NODE_VERSION%" 126 if %NODE_TYPE% == iojs ( 127 set "NODE_HOME=%NVMW_HOME%%NODE_TYPE%\%NODE_VERSION%" 128 ) 129 if not %ARCH% == %OS_ARCH% ( 130 set "NODE_HOME=%NODE_HOME%-%ARCH%" 131 ) 132 set "NODE_EXE_FILE=%NODE_HOME%\%NODE_TYPE%.exe" 133 set "NPM_ZIP_FILE=%NODE_HOME%\npm.zip" 134 if exist "%NODE_EXE_FILE%" ( 135 endlocal 136 echo "%NODE_TYPE%/%NODE_VERSION% (%ARCH%)" already exists, please uninstall it first 137 exit /b 1 138 ) 139 mkdir "%NODE_HOME%" 140 echo Start installing %NODE_TYPE%/%NODE_VERSION% (%ARCH%) to %NODE_HOME% 141 cscript //nologo "%NVMW_HOME%\fget.js" %NODE_EXE_URL% "%NODE_EXE_FILE%" 142 if not exist "%NODE_EXE_FILE%" ( 143 echo Download %NODE_EXE_FILE% from %NODE_EXE_URL% failed 144 goto install_error 145 ) else ( 146 if %NODE_TYPE% == iojs ( 147 copy "%NVMW_HOME%\alias-node.cmd" "%NODE_HOME%\node.cmd" 148 ) 149 echo Start install npm 150 "%NODE_EXE_FILE%" "%NVMW_HOME%\get_npm.js" "%NODE_HOME%" "%NODE_TYPE%/%NODE_VERSION%" 151 if not exist "%NPM_ZIP_FILE%" goto install_error 152 set "CD_ORG=%CD%" 153 %~d0 154 cd "%NODE_HOME%" 155 echo Start unzip "%NPM_ZIP_FILE%" to "%NODE_HOME%" 156 cscript //nologo "%NVMW_HOME%\unzip.js" "%NPM_ZIP_FILE%" "%NODE_HOME%" 157 mkdir "%NODE_HOME%\node_modules" 158 rmdir /s /q "%NODE_HOME%\node_modules\npm" 159 move npm-* "%NODE_HOME%\node_modules\npm" 160 copy "%NODE_HOME%\node_modules\npm\bin\npm.cmd" "%NODE_HOME%\npm.cmd" 161 cd "%CD_ORG%" 162 if not exist "%NODE_HOME%\npm.cmd" goto install_error 163 echo npm install ok 164 echo Finished 165 endlocal 166 exit /b 0 167 ) 168 :install_error 169 rd /Q /S "%NODE_HOME%" 170 endlocal 171 exit /b 1 172 ::=========================================================== 173 :: uninstall : Uninstall specified version 174 ::=========================================================== 175 :uninstall 176 setlocal 177 set ARCH=%OS_ARCH% 178 if not "%2" == "" ( 179 set ARCH=%2 180 :: x86, ia32 alias x32 181 if "%2" == "x86" ( 182 set ARCH=x32 183 ) 184 if "%2" == "ia32" ( 185 set ARCH=x32 186 ) 187 ) 188 set NODE_TYPE=node 189 set NODE_VERSION=%1 190 if "%NODE_VERSION:~4,1%" == "-" ( 191 for /f "tokens=1,2,* delims=-" %%a in ("%NODE_VERSION%") do ( 192 set NODE_TYPE=%%a 193 set NODE_VERSION=%%b 194 ) 195 ) 196 :: nvmw uninstall iojs 197 if %NODE_VERSION% == iojs ( 198 set NODE_TYPE=iojs 199 set NODE_VERSION=latest 200 ) 201 :: nvmw uninstall node 202 if %NODE_VERSION% == node ( 203 set NODE_TYPE=node 204 set NODE_VERSION=latest 205 ) 206 if not %NODE_VERSION:~0,1% == v if not %NODE_VERSION:~0,1% == l ( 207 set NODE_VERSION=v%NODE_VERSION% 208 ) 209 if "%NVMW_CURRENT_TYPE%" == "%NODE_TYPE%" if "%NVMW_CURRENT%" == "%NODE_VERSION%" if "%NVMW_CURRENT_ARCH%" == "%ARCH%" ( 210 echo Cannot uninstall currently-active %NODE_TYPE%/%NODE_VERSION% %ARCH% 211 exit /b 1 212 ) 213 set "NODE_HOME=%NVMW_HOME%%NODE_VERSION%" 214 if %NODE_TYPE% == iojs ( 215 set "NODE_HOME=%NVMW_HOME%%NODE_TYPE%\%NODE_VERSION%" 216 ) 217 if not %ARCH% == %OS_ARCH% ( 218 set "NODE_HOME=%NODE_HOME%-%ARCH%" 219 ) 220 if not exist "%NODE_HOME%" ( 221 echo %NODE_TYPE%/%NODE_VERSION% %ARCH% is not installed 222 exit /b 1 223 ) else ( 224 rd /Q /S "%NODE_HOME%" 225 if ERRORLEVEL == 1 ( 226 echo Cannot uninstall %NODE_TYPE%/%NODE_VERSION% %ARCH% 227 exit /b 1 228 ) else ( 229 echo Uninstalled %NODE_TYPE%/%NODE_VERSION% %ARCH% 230 endlocal 231 exit /b 0 232 ) 233 ) 234 ::=========================================================== 235 :: use : Change current version 236 ::=========================================================== 237 :use 238 setlocal 239 set ARCH=%OS_ARCH% 240 if not "%2" == "" ( 241 set ARCH=%2 242 :: x86, ia32 alias x32 243 if "%2" == "x86" ( 244 set ARCH=x32 245 ) 246 if "%2" == "ia32" ( 247 set ARCH=x32 248 ) 249 ) 250 set NODE_TYPE=node 251 set NODE_VERSION=%1 252 if "%NODE_VERSION:~4,1%" == "-" ( 253 for /f "tokens=1,2,* delims=-" %%a in ("%NODE_VERSION%") do ( 254 set NODE_TYPE=%%a 255 set NODE_VERSION=%%b 256 ) 257 ) 258 :: nvmw use iojs 259 if %NODE_VERSION% == iojs ( 260 set NODE_TYPE=iojs 261 set NODE_VERSION=latest 262 ) 263 :: nvmw use node 264 if %NODE_VERSION% == node ( 265 set NODE_TYPE=node 266 set NODE_VERSION=latest 267 ) 268 if not %NODE_VERSION:~0,1% == v if not %NODE_VERSION:~0,1% == l ( 269 set NODE_VERSION=v%NODE_VERSION% 270 ) 271 set "NODE_HOME=%NVMW_HOME%%NODE_VERSION%" 272 if %NODE_TYPE% == iojs ( 273 set "NODE_HOME=%NVMW_HOME%%NODE_TYPE%\%NODE_VERSION%" 274 ) 275 if not %ARCH% == %OS_ARCH% ( 276 set "NODE_HOME=%NODE_HOME%-%ARCH%" 277 ) 278 if not exist "%NODE_HOME%" ( 279 echo %NODE_TYPE%/%NODE_VERSION% is not installed 280 exit /b 1 281 ) 282 endlocal 283 set NVMW_CURRENT_ARCH=%OS_ARCH% 284 if not "%2" == "" ( 285 set NVMW_CURRENT_ARCH=%2 286 :: x86, ia32 alias x32 287 if "%2" == "x86" ( 288 set NVMW_CURRENT_ARCH=x32 289 ) 290 if "%2" == "ia32" ( 291 set NVMW_CURRENT_ARCH=x32 292 ) 293 ) 294 set NVMW_CURRENT_TYPE=node 295 set NVMW_CURRENT=%1 296 if "%NVMW_CURRENT:~4,1%" == "-" ( 297 for /f "tokens=1,2,* delims=-" %%a in ("%NVMW_CURRENT%") do ( 298 set NVMW_CURRENT_TYPE=%%a 299 set NVMW_CURRENT=%%b 300 ) 301 ) 302 if %NVMW_CURRENT% == iojs ( 303 set NVMW_CURRENT_TYPE=iojs 304 set NVMW_CURRENT=latest 305 ) 306 if %NVMW_CURRENT% == node ( 307 set NVMW_CURRENT_TYPE=node 308 set NVMW_CURRENT=latest 309 ) 310 if not %NVMW_CURRENT:~0,1% == v if not %NVMW_CURRENT:~0,1% == l ( 311 set NVMW_CURRENT=v%NVMW_CURRENT% 312 ) 313 echo Now using %NVMW_CURRENT_TYPE% %NVMW_CURRENT% %NVMW_CURRENT_ARCH% 314 set "NODE_HOME=%NVMW_HOME%%NODE_VERSION%" 315 if %NVMW_CURRENT_TYPE% == iojs ( 316 set "NODE_HOME=%NVMW_HOME%%NODE_TYPE%\%NODE_VERSION%" 317 ) 318 if not %NVMW_CURRENT_ARCH% == %OS_ARCH% ( 319 set NVMW_CURRENT_ARCH_PADDING=-%NVMW_CURRENT_ARCH% 320 ) else ( 321 set NVMW_CURRENT_ARCH_PADDING= 322 ) 323 if %NVMW_CURRENT_TYPE% == iojs ( 324 set "PATH=%NVMW_HOME%;%NVMW_HOME%%NVMW_CURRENT_TYPE%\%NVMW_CURRENT%%NVMW_CURRENT_ARCH_PADDING%;%PATH_ORG%" 325 set "NODE_PATH=%NVMW_HOME%%NVMW_CURRENT_TYPE%\%NVMW_CURRENT%%NVMW_CURRENT_ARCH_PADDING%\node_modules" 326 ) else ( 327 set "PATH=%NVMW_HOME%;%NVMW_HOME%\%NVMW_CURRENT%%NVMW_CURRENT_ARCH_PADDING%;%PATH_ORG%" 328 set "NODE_PATH=%NVMW_HOME%\%NVMW_CURRENT%%NVMW_CURRENT_ARCH_PADDING%\node_modules" 329 ) 330 exit /b 0 331 ::=========================================================== 332 :: ls : List installed versions 333 ::=========================================================== 334 :ls 335 setlocal 336 echo node: 337 if exist "%NVMW_HOME%" ( 338 dir "%NVMW_HOME%v*" /b /ad 339 ) 340 echo; 341 echo iojs: 342 if exist "%NVMW_HOME%iojs" ( 343 dir "%NVMW_HOME%iojs\*" /b /ad 344 ) 345 echo; 346 if not defined NVMW_CURRENT ( 347 set NVMW_CURRENT_V=none 348 ) else ( 349 set NVMW_CURRENT_V=%NVMW_CURRENT% 350 ) 351 echo Current: %NVMW_CURRENT_TYPE%/%NVMW_CURRENT_V% %NVMW_CURRENT_ARCH% 352 endlocal 353 exit /b 0
第四個坑:更新node到4.0及以上的時候會出現安裝失敗 提示 node v6.9.2 does not include npm;
辦法: https://github.com/hakobera/nvmw/issues/58
https://my.oschina.net/bakuman/blog/637316
http://blog.5ibc.net/p/49266.html
按文章內容修改了nvmw.bat,然后手動下載npm-master.zip並改名為npm.zip后放到nvmw目錄下新建的v4.4.0目錄下,然后重新的執行 nvmw install 4.4.0,終於安裝成功。(CMD執行 nvmw install 6.9.2的時候會在nvmw安裝目錄中生產一個對應版本的文件夾,這時候把npm.zip壓縮包放進去,就能完成升級);
這樣我們就可以控制nodejs的版本了,我的天,真心的麻煩~~
最后一步,我們可以使用 npm install npm -g 來獲得新版的npm了;
總算大功告成,大多數的解決辦法都是從網上找到的;
2017.02.22補充說明;
使用nvmw install 版本號 安裝了之后,並不會馬上轉變成安裝的版本,
需要使用nvmw use v6.9.2 (版本號看個人需求)進行版本的轉換,install只是保存到本地供版本替換使用;
下面是參考鏈接:
http://www.tuicool.com/articles/Vzquy2
http://blog.csdn.net/duanyachao/article/details/51822015
http://www.wtoutiao.com/p/193HWBp.html
https://segmentfault.com/a/1190000004855835
https://my.oschina.net/bakuman/blog/637316
http://blog.5ibc.net/p/49266.html
https://github.com/hakobera/nvmw/issues/58
好了,希望能幫到需要的同學們。
2017.01.06
2018.10.11
換win10的環境后安裝沒有這么多的麻煩了,具體參考:https://segmentfault.com/a/1190000004855835
其中第三點.修改get_npm.js文件42行路徑,其實為

使用nvmw install 5.9.1安裝特定版本node時,最后會提示D:\nvmw\v5.9.1\node.exe - 另一個程序正在使用此文件,進程無法訪問。
但是實質上是安裝成功的
nvmw use 5.9.1
node -v
可以查看node版本已經切換為特定版本了
