Published on

Yarn Workspaces - 用 nohoist 避免指定依賴被移到根目錄

Authors
  • avatar
    Name
    米K朗基羅
    Twitter
    @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 資訊!

小結

萬惡的根源:

huge

參考資料