Module Federation
前面談了很多關於「微前端」的東西,其中一項脫離不了的關鍵技術就是 Module Federation ,中文可以稱呼它模塊聯邦,但後面我一律用 Federation 簡稱。
這是一個讓各應用的函式庫有效的去共用函式的方法,把各種函式庫模組透過 Federation 共享機制去有效管理,讓輸出 JavaScript 不再是一大包 bundle 。但它共享 library 並非是多版本共存分享,而是針對共用版本共享,所以要去維護整個應用的共享版本機制。權重來說,以測試結果來看,均以「較新版」為優先,所以如果函式庫有向下不兼容特性時就要區分版本,不要加入共享機制。當遇到相同版本時除了靠 Federation 機制去共享外,也可以搭配 http catch 協助減少不必要的外部資源請求,大大去降低微前端造成的重複程式碼賦予的壓力。
當然,這麼好用的工具也不是全然都是優點,攜帶而來還有一些缺點。因為共享無法預期其他模組是否用到相同的子模組或函式,所以打包時會無差別進行打包,也失去 tree shaking 的優勢,所以共享時也要評估共享的對象,並不是無差別將所有依賴的模組通通加入共享。
另一個 Federation 很重要的功能就是模組曝露,就是將專案中的特定檔案當作入口去輸出模組,讓模組以「非同步」或「同步」的方式載入外部模組檔案。通常也不會用 Federation 去拿特定程式碼,可以將共用模組包成 package 再透過模組共享去溝通。而這個曝露輸出的功能能夠統一靠 Entry File 去建立單一資源點的溝通橋樑,在「適當的時機點」載入必要的模組。
Federation 更深一層的使用還可以加上打包類型、區域作用域模組、加載外部模組等等功能。實作上要更加熟悉底層機制和打包工具,不然可能費了很大的功夫卻收不到效果。不過基礎上,上面降到的功能對應業務場景就非常夠用了。