npm install 都幹了啥?

原由

本週我在將egg項目發佈到生產環境以後,發現生產環境沒法執行npm run start,提示以下圖 html

image

摸索緣由

script 命令是如何運行的?

做爲一個前端工程師,我天天都會和各類環境打交道,常常在命令行執行cross-env NODE_ENV=dev等操做,忽然有一天,我發現執行 cross-env NODE_ENV=dev 竟然給我報錯了?前端

image

檢查了下原來是包沒有使用全局安裝,如今全局安裝下npm i cross-env -gnode

image

嗯,果真不報錯了,爲啥啊?其實咱們看上面的安裝反饋就能夠知道,全局安裝會建立一個軟鏈接linux

image

而使用項目依賴安裝則不會有這步操做,則致使咱們不能直接使用簡寫去執行命令。npm

image

那麼問題來了,難道我全部須要在命令行執行的包都須要安裝到全局,才能使用?json

  1. 第一種方法,能夠執行文件 ./node_modules/.bin/cross-env NODE=dev
  2. 做爲一個懶人,固然不會用方法一啦,這個時候npm script就派上用場了

package.jsonscript中新增命令windows

"scripts": {
    "dev": "cross-env NODE=dev"
}
複製代碼

執行npm run dev,看到這裏,我想大多數人確定會說,我靠,你說的方法我幾百年前就知道了啊,還須要你來BB?前端工程師

可是我想仍是有一部分人和我同樣不懂爲啥使用npm script執行上面的命令就不會報錯呢,難道也會建立軟鏈接?實際上是由於咱們執行npm run的時候會將node_modules/.bin下面全部文件都添加到系統的環境變量中,這樣在執行期間就可使用縮寫,等執行結束會自動刪除這些環境變量post

理清這些以後再來看我一開始說的問題,提示找不到模塊,看了下 .bin 下面的代碼 spa

image

看樣子是引入上級目錄的index.js,可是咱們並無在上級目錄找到該文件,致使報錯,難道是別人的包寫錯了?固然這是不可能的,通過我不斷的折騰,最後才發現!!!

其實咱們在npm install的時候首先會下載對應資源包的壓縮包放在用戶目錄下的.npm文件夾下,而後解壓到項目的node_modules中,而且提取依賴包中指定的bin文件,在linux下會建立一條軟鏈接,因此在linux下咱們真正執行的是.bin文件夾下文件指向的文件,看下圖。

image

而我遇到的問題就是執行npm installnpm start是兩臺機器,生產機上的文件其實是從發佈機 copy 過來的,致使軟鏈接沒了,因此纔會報錯。

吸收經驗

從這麼一個小小的問題就能夠暴露出來,雖然咱們天天都會執行npm script可是卻對他的執行過程很模糊,致使遇到問題卻找不到緣由,最終在看了一些資料以後我總結了以下幾個點。

總結

  1. npm install 會先查找本地已經下載過的包,不論版本是多少,找到了就不會去下載,因此若是要升級依賴,可使用npm update或者顯示安裝npm install cross-env --save
  2. npm install 會先下載項目中的依賴包,而後下載依賴的依賴,這樣就會致使,生成的文件是樹形結構,而且存在許多重複的包,因此這個時候npm就會將依賴扁平化,將依賴的依賴提取到第一層,遇到版本號不一致的也會保留,遇到徹底一致的就會刪除。
  3. 最後還會提取依賴中的bin文件,windows操做系統生成cmd文件,linux系統生成軟鏈接

查閱的資料

每個小問題深刻下去都會頭皮發麻,學不動了

相關文章
相關標籤/搜索