環境已經確保,可以來做點比較像樣的事情安裝套件了。
安裝時,建議根據套件在專案中發揮的功能來決定要分發到 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 等套件來跑本機伺服器來查看開發結果。理由是「確保每一次都是在安裝專案真正用得到的套件」,避免冗余。
過去在處理 monorepo 類型專案時,曾經因為 npm 在路徑解析上踩到坑所以改用 yarn 來進行套件管理。且因為 yarn 支援平行安裝(parallel installation)的緣故,在安裝套件時的速度表現會比 npm 好。故個人目前在開啟新專案時,會偏向使用 yarn 來管理套件。
關於 npm 與 yarn 的比較討論可參考 Stack Overflow: What is main difference between yarn and npm? [closed]
如果是 side project 則根據當下需求選擇最新、或是想要研究的套件版本即可。但在開啟一個全新的公司專案時,個人會考慮以下事項:
當套件越裝越多、彼此間的依賴越來越錯綜複雜時,有可能會在安裝新套件時時看到以下警告訊息:
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 的 dependencies 或 devDependencies 中,但可能被 dependencies 或 devDependencies 囊括的套件依賴。
因為只是警告而非錯誤,所以專案還是可以繼續開發、運行(可參考 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 即可。
更多應用可參考官方文件:
本日完成內容:根據套件功能將其安排至 dependencies 或 devDependencies 中,並知道可以透過 resolutions overrides 來指定依賴套件之版本。
本文同步發佈於普通文組 2.0