- Published on
Yarn Workspaces - 用 nohoist 避免指定依賴被移到根目錄
- Authors
- Name
- 米K朗基羅
- @kvzl_
nohoist
為什麼需要 原則上 Yarn 會對底下 workspace 所定義的依賴做 hoisting ,也就是試圖找出被重複引用的依賴,並移動到專案根目錄的 node_modules
中,以減少第三方套件的佔用體積。
這時候新的問題產生了:一個 workspace 依賴的 package 實際會被放置哪裡,在 workspace 中還是根目錄中,是取決於 hoisting 機制。如果按照 node.js resolve 模組的規則來看,這不是太大的問題,但實際開發時難免會遇到一些第三方 package ,會假設依賴的檔案放置在 local 的 node_modules
中。
考慮到有這樣的難處,同時又希望能保留 hoisting 的前提之下,Yarn 提供了 nohoist
的選項供開發者配置。
設定方式
假設我們要對 react-native
這個 package 做 nohoist
,我們可以在任意 workspace 的 package.json
中使用 glob 來配置:
"workspaces": {
"nohoist": ["react-native", "react-native/**"]
}
如果多個 workspace 都有相同的需求,也可以在專案根目錄的 package.json
中這樣設定:
"workspaces": {
"packages": ["packages/*"],
"nohoist": ["**/react-native", "**/react-native/**"]
}
注意事項
根據 Workspaces 文件,能指定 workspaces
的只能是 private package:
{
"private": true,
"workspaces": ["workspace-a", "workspace-b"]
}
這是為了避免將 package 發布到 npm registry 的同時露出 workspace 資訊!
小結
萬惡的根源:
參考資料
- nohoist in Workspaces | Yarn Blog
- 另一套 monorepo 管理工具,也有類似的設計: Lerna Hoisting