我用npm run build
去 build 網友寫的程式時
出現以下錯誤
> node build/build.js
internal/modules/cjs/loader.js:960
throw err;
^
Error: Cannot find module 'chalk'
我自以為是地npm install chalk
然後再次npm run build
就可以了
想請教兩點:
1.npm install chalk
這樣做是正確的嗎?
2.這裡的install
是install到什麼目錄?因為我每次更新程式都是重新 clone project,每次都得要重新 install chalk (還是我不該使用 clone, 該用 pull?)
GitHub project 是 listennn08大大寫的前端
在npm install <module>
時npm會做三件事:
package.json
中package-lock.json
中node_modules/
資料夾中將所安裝的module放進去所以進行npm install chalk
是正確的,best practice是判斷這個module和你要build的專案的dependency決定要不要用npm install chalk --save
或npm install chalk --save-dev
(Ref)
關於第二個問題,這要根據原來的Git repository有沒有把所缺的module補上去。通常Git repo都會把node_modules/
寫進.gitignore
中,意味著不會把所有的modules上傳到Repo中。這就是為什麼每次我們要開發時將專案clone下來時需要npm install
後npm run start/build
才不會跳錯誤訊息。而npm install
在做的事情就是根據專案的package.json
和package-lock.json
來尋找modules並安裝進node_modules/
中。
所以很有可能是這個專案本身缺了chalk
module,根治的方法是:需要在你本地端npm install chalk
之後,把你的commit push回遠端,接著發一個Pull Request給原作者,當他merge了之後,未來不論是git pull or clone應該都能避免這個問題。
若是暫時性的需要解決這個問題,沒錯,用pull (best practice是git fetch && git merge
,比較不傷害你的本地專案 -> Ref),原因是clone時把一切都重啟了,pull/fetch-merge時則是根據進來的檔案和你現有的檔案之不同來決定更新哪些東西。