Monorepo 踩坑記
最近在實行 monorepo 架構,真的是被雷到一個不要不要的。特別是「依賴問題」,難搞的讓人傷腦筋,它總是不按照你想的去 work。
一般在 monorepo 的時候,node_modules 的取得會優先讀取 workspace 再讀取 root,這樣才能分類優先級。一般專案都沒什麼太大的影響,甚至專案版本都很一致時都不會有奇怪的地方,初期建構時當然我也覺得沒什麼問題。
不過就是有坑,因為專案不能保證都是「新專案」,多少都會遇到老舊難搞的專案,然後還轉成 monorepo 的架構,這是就有多種版本在運行了。其實一般的依賴有多版本也沒啥問題,真正會有多版本問題的是「打包套件」。許多打包套件很貼心,它會自動幫你檢查有沒有安裝特定套件,並且自動使用,比如webpack 的 loader 都是這樣運作,非常好用。然而事情沒那麼簡單,但套件內部如果自動去 required 時它無法幫你辨識它是 workspace 還是 root,它會去讀取「運行套件它所在的node_modules」,這問題可大了,因為你所有的套件並不會都放在同一個 node_modules,第一個問題就是它可能找不到套件。第二個問題就是它抓到套件未必是你想要的那個版本。
當然也不是全然沒有解法,就是你必須要「清楚指定套件要運行哪個版本。情況有兩個,第一個是字串辨識,一樣舉 webpack 來說,我想要使用 css-loader,我不能單純只給這個字串,必須給它絕對位置,或是用 required.resolve 來抓依賴。第二個情況是你無法確定你版本到底有沒有正確,你內部所有的套件依賴係都必須明訂在 node_modules,並且確定安裝位置是在 workspace 的 node_modules或是都手動指定過絕對位置。
只能說 monorepo 是很新的技術,很多坑都等著要踩,有機會踩到我就會多分享囉。