捨棄 create-react-app 之餘還架了個 astro blog 昭告天下:安裝套件

環境已經確保,可以來做點比較像樣的事情安裝套件了。

本文

安裝套件

安裝時,建議根據套件在專案中發揮的功能來決定要分發到 dependencies 或是 devDependencies 欄。

對於前端 react 專案來說不可或缺的套件(比如 react webpack 等)會使用 npm install react yarn add react 來將其歸納到 dependencies 中。而輔助類型的套件(比如 @types/react jest 等)則透過 npm install @types/react -D yarn add @types/react -D 把套件放到 devDependencies 下。

提醒:歸類在 devDependencies 下的套件在終端環境設定為 --production=true 時,不會被安裝。比如對以下 package.json 設定執行 yarn --production=true 時,專案的 node_modules 中不會有 @types typescript 這兩個套件的內容。

{
  "name": "ithome-2023",
  "version": "1.0.0",
  "private": true,
  "dependencies": {
    "react": "^18.2.0",
    "react-dom": "^18.2.0"
  },
  "devDependencies": {
    "@types/react": "^18.2.21",
    "typescript": "^5.2.2"
  }
}

補充:個人安裝套件的原則是「遇到需求再裝」,比如在專案最初期(連開發畫面都還沒有)時,package.json 中只會有 react react-dom @types/* 這些東西。到了有畫面的階段,才會來安裝 webpack webpack-cli webpack-dev-server 等套件來跑本機伺服器來查看開發結果。理由是「確保每一次都是在安裝專案真正用得到的套件」,避免冗余。

yarn? npm?

過去在處理 monorepo 類型專案時,曾經因為 npm 在路徑解析上踩到坑所以改用 yarn 來進行套件管理。且因為 yarn 支援平行安裝(parallel installation)的緣故,在安裝套件時的速度表現會比 npm 好。故個人目前在開啟新專案時,會偏向使用 yarn 來管理套件。

關於 npmyarn 的比較討論可參考 Stack Overflow: What is main difference between yarn and npm? [closed]

如何決定套件版本

如果是 side project 則根據當下需求選擇最新、或是想要研究的套件版本即可。但在開啟一個全新的公司專案時,個人會考慮以下事項:

處理 incorrect peer dependency 警告訊息

當套件越裝越多、彼此間的依賴越來越錯綜複雜時,有可能會在安裝新套件時時看到以下警告訊息:

warning " > package-A@1.0.0" has incorrect peer dependency "package-B@2.0.0".

意即 package-A@1.0.0 依賴的 package-B 版本與現行指定安裝的版本有所出入。此 package-B 可能沒有直接出現在目前專案的 package.json 的 dependenciesdevDependencies 中,但可能被 dependenciesdevDependencies 囊括的套件依賴。

因為只是警告而非錯誤,所以專案還是可以繼續開發、運行(可參考 Stack Overflow: When installing packages with Yarn, what does “incorrect peer dependency” mean?)。但如果想要處理掉這些警告的話,可以在 package.json 中透過 (npm) overrides (yarn) resolutions 欄位來指定特定套件的版本。比如:

{
  "name": "ithome-2023",
  "version": "1.0.0",
  "private": true,
  "dependencies": {
    "package-A": "1.0.0",
    "package-C": "1.2.0"
  },
  "resolutions": {
    "package-B": "1.0.0"
  }
}

(使用 npm 的朋友請將上方 resolutions 換成 overrides)

透過 resolutions overrides 指定特定套件的版本後,再執行 yarn / npm i 即可。

更多應用可參考官方文件:

總結

本日完成內容:根據套件功能將其安排至 dependenciesdevDependencies 中,並知道可以透過 resolutions overrides 來指定依賴套件之版本。