實驗環境: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
都是可執行文件,這就解釋了為什么在任意目錄下都可以直接運行node
npm
npx
這三個命令 - 上圖中還有一個
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文件