node.js、npm中對全局安裝的探索


實驗環境:window7 32bit
實驗素材:node v10.16.0
時間:2019-06-12

全局安裝都干了什么

  1. 從官網下載的 node-v10.16.0-x86.mis 安裝包,一路默認安裝完畢。
  2. 之后發現 系統變量 中的path字段增加了一個路徑c:\Program Files\nodejs\,這正是node的安裝路徑,來看一下這個路徑下都有什么

    其中node.exenpm.cmdnpx.cmd 都是可執行文件,這就解釋了為什么在任意目錄下都可以直接運行node npm npx這三個命令
  3. 上圖中還有一個node_modules目錄,這個目錄里只有一個包npm,原來npm自己本身就是一個包,npm和npx這兩個命令運行的就是這個包中的代碼
  4. 除了 系統變量 發生變化,用戶變量也新增了一個路徑c:\users\用戶名\appData\Roamming\npm

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

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

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


    我猜測:原來,當使用npm install -g 命令時,npm會查看包描述文件,如果發現了bin字段就會在node_module同級目錄創建可執行文件,沒有這個字段則不創建。

本地安裝呢

  1. 本地安裝會在當前目錄創建一個node_modules的文件夾,如果已經存在文件夾就直接安裝到里面。
  2. 細心一點發現,本地安裝了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文件的運行過程

  1. .js文件通常需要這樣運行 node path\test.js
  2. 可執行文件到底是什么,為什么運行它就能啟動node並運行指定的js文件


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM