本週我在將egg項目發佈到生產環境以後,發現生產環境沒法執行npm run start
,提示以下圖 html
做爲一個前端工程師,我天天都會和各類環境打交道,常常在命令行執行cross-env NODE_ENV=dev
等操做,忽然有一天,我發現執行 cross-env NODE_ENV=dev
竟然給我報錯了?前端
檢查了下原來是包沒有使用全局安裝,如今全局安裝下npm i cross-env -g
node
嗯,果真不報錯了,爲啥啊?其實咱們看上面的安裝反饋就能夠知道,全局安裝會建立一個軟鏈接linux
而使用項目依賴安裝則不會有這步操做,則致使咱們不能直接使用簡寫去執行命令。npm
那麼問題來了,難道我全部須要在命令行執行的包都須要安裝到全局,才能使用?json
./node_modules/.bin/cross-env NODE=dev
npm script
就派上用場了在package.json
的script
中新增命令windows
"scripts": {
"dev": "cross-env NODE=dev"
}
複製代碼
執行npm run dev
,看到這裏,我想大多數人確定會說,我靠,你說的方法我幾百年前就知道了啊,還須要你來BB?前端工程師
可是我想仍是有一部分人和我同樣不懂爲啥使用npm script
執行上面的命令就不會報錯呢,難道也會建立軟鏈接?實際上是由於咱們執行npm run
的時候會將node_modules/.bin
下面全部文件都添加到系統的環境變量中,這樣在執行期間就可使用縮寫,等執行結束會自動刪除這些環境變量post
理清這些以後再來看我一開始說的問題,提示找不到模塊,看了下 .bin 下面的代碼 spa
看樣子是引入上級目錄的index.js
,可是咱們並無在上級目錄找到該文件,致使報錯,難道是別人的包寫錯了?固然這是不可能的,通過我不斷的折騰,最後才發現!!!
其實咱們在npm install
的時候首先會下載對應資源包的壓縮包放在用戶目錄下的.npm
文件夾下,而後解壓到項目的node_modules
中,而且提取依賴包中指定的bin文件,在linux
下會建立一條軟鏈接,因此在linux
下咱們真正執行的是.bin
文件夾下文件指向的文件,看下圖。
而我遇到的問題就是執行npm install
和npm start
是兩臺機器,生產機上的文件其實是從發佈機 copy 過來的,致使軟鏈接沒了,因此纔會報錯。
從這麼一個小小的問題就能夠暴露出來,雖然咱們天天都會執行npm script
可是卻對他的執行過程很模糊,致使遇到問題卻找不到緣由,最終在看了一些資料以後我總結了以下幾個點。
npm install
會先查找本地已經下載過的包,不論版本是多少,找到了就不會去下載,因此若是要升級依賴,可使用npm update
或者顯示安裝npm install cross-env --save
npm install
會先下載項目中的依賴包,而後下載依賴的依賴,這樣就會致使,生成的文件是樹形結構,而且存在許多重複的包,因此這個時候npm
就會將依賴扁平化,將依賴的依賴提取到第一層,遇到版本號不一致的也會保留,遇到徹底一致的就會刪除。bin
文件,windows
操做系統生成cmd
文件,linux
系統生成軟鏈接每個小問題深刻下去都會頭皮發麻,學不動了