實驗環境:window7 32bit
實驗素材:node v10.16.0
時間:2019-06-12
全局安裝都干了什么
- 從官網下載的
node-v10.16.0-x86.mis安裝包,一路默認安裝完畢。

- 之后發現 系統變量 中的
path字段增加了一個路徑c:\Program Files\nodejs\,這正是node的安裝路徑,來看一下這個路徑下都有什么

其中node.exe、npm.cmd、npx.cmd都是可執行文件,這就解釋了為什么在任意目錄下都可以直接運行nodenpmnpx這三個命令 - 上圖中還有一個
node_modules目錄,這個目錄里只有一個包npm,原來npm自己本身就是一個包,npm和npx這兩個命令運行的就是這個包中的代碼

- 除了 系統變量 發生變化,用戶變量也新增了一個路徑
c:\users\用戶名\appData\Roamming\npm

它里面是空的,全局安裝一個gulp看看有啥變化npm install -g gulp:

可以看到出現了gulp.cmd可執行文件和node_modules文件夾,文件夾里面不用看也知道一定包含了gulp的代碼包。

這就解釋了為什么全局安裝的包,能夠在任意文件夾調用。我順手也安裝了jquery和lodash這兩個包,但他們並沒有生成可執行文件。盡管知道兩個包不存在cli的命令,但為什么沒有可執行文件呢。
帶着疑問對比了這三個包,發現gulp的包描述文件package.json中包含一個bin字段,這個字段對應的值正是可執行文件中描述的值。而jquery和lodash的包描述文件中沒有bin字段,


我猜測:原來,當使用npm install -g命令時,npm會查看包描述文件,如果發現了bin字段就會在node_module同級目錄創建可執行文件,沒有這個字段則不創建。
本地安裝呢
- 本地安裝會在當前目錄創建一個
node_modules的文件夾,如果已經存在文件夾就直接安裝到里面。 - 細心一點發現,本地安裝了gulp之后,雖然
node_modules的同級目錄沒有出現可執行文件,但子目錄中卻多出了一個.bin的文件夾,打開它看到

哈哈,原來本地安裝命令也會查看寶描述文件並創建可執行文件,只是創建的位置不一樣。那么問題也來了,這個目錄並沒有配置到系統環境變量中,難道每次運行他們都要進入到.bin目錄里去運行么?是的,在npx出現之前確實比較麻煩!
npx
還記得安裝node.js的時候,在node.exe的相同路徑下有一個npx可執行文件么,這個npx的作用就是能夠運行本地的node_module中的js包。
npx gulp 會去當前目錄中的node_module/.bin中尋找gulp.cmd,如果沒有就去環境變量path里面找,都找不到就認為當前的node_module中缺少這個模塊,然后下載這個模塊到臨時目錄中並運行,運行之后即清除。下次運行會重新下載。
使用--no-install參數能夠強制使用本地模塊而不下載,沒找到就會報錯。
相反--ignore-existing參數會強制使用遠程下載模塊。
可以通過指定版本號來實現node運行環境的切換$ npx node@0.12.8 -v,原理就是使用npm中的node模塊
本節部分內容參考了阮一峰博客對npx的總結
深究.js文件的運行過程
- .js文件通常需要這樣運行
node path\test.js - 可執行文件到底是什么,為什么運行它就能啟動node並運行指定的js文件
