跳轉到

3.3 lock 檔、npx 與 scripts#

package-lock.json:版本鎖定#

package.json 寫的是版本「範圍」(^4.19.2),但 package-lock.json 記錄了每個套件確切安裝的版本(連依賴的依賴也鎖住)。

檔案 角色 要 commit 嗎?
package.json 聲明依賴範圍 ✅ 要
package-lock.json 鎖定確切版本 ✅ 要(應用程式)
node_modules/ 套件實體 ❌ 不要(加進 .gitignore)

為什麼要鎖版本?沒有 lock 檔,今天裝的 express 是 4.19.2,隊友明天裝可能是 4.21.0——「在我電腦上可以跑」的經典成因。有了 lock 檔,所有人、所有環境都裝出一模一樣的版本。

團隊規則:package-lock.json 有變更時要 commit;拉到別人的 lock 檔變更後要重跑 npm install。

npx:不用安裝直接執行#

npx 可以直接執行套件提供的命令列工具,不必先全域安裝:

npx create-vite my-app    # 直接執行專案產生器
npx cowsay hello          # 玩具範例:執行完即丟

好處:不污染全域環境,永遠用最新版。一次性工具特別適合。

常見迷思:很多教學叫你 npm install -g xxx(全域安裝)。現代做法傾向 npx 或裝在專案的 devDependencies,避免全域版本衝突。

scripts:專案的快捷指令#

package.json 的 scripts 區塊可以定義常用指令:

{
  "scripts": {
    "dev": "nodemon app.js",
    "start": "node app.js",
    "test": "node --test",
    "lint": "eslint .",
    "format": "prettier --write ."
  }
}

執行方式:

npm run dev      # 執行自訂腳本
npm test         # test 腳本可以省略 run
npm start        # start 也可以省略 run

好處:把「怎麼跑、怎麼測、怎麼檢查」寫進專案,隊友不用問也不用記——打 npm run 就知道這專案能做什麼。

團隊約定:所有操作都透過 scripts 定義(dev/test/lint/format),這是專案的操作介面。