Upgrade to Pro — share decks privately, control downloads, hide ads and more …

20211017 - Our approach to Micro Frontend in Vue

20211017 - Our approach to Micro Frontend in Vue

🤘大會網站:https://laravelconf.tw/
👉 議題程度 :中階 🔴🔴⚫
👉 分享大綱:
在 LINE 裡面有眾多的產品,我們想找出一個方式能夠降低開發新功能的 effort。Micro Front-End 架構是我們想嘗試的切入點,切開頁面上的模組來尋找可能的分享方式,這個 session 會跟你分享我們嘗試的整個過程,以及可能的解法。
👉講者介紹:
- LINE front-end engineer
- ex-yahoo tech lead

LINE Developers Taiwan

October 17, 2021
Tweet

More Decks by LINE Developers Taiwan

Other Decks in Programming

Transcript

  1. 介紹演講者 Tom Wu LINE Corp. 2014-2021: Yahoo Inc. Engineer 2018:

    Yahoo Meetup 主持⼈&講者 2021: LINE Corp. Engineer
  2. 緣起 LINE 擁有眾多的產品:LINE TODAY, LINE SPOT, LINE SHOPPING…等,也有不少的 engineering teams,隨著產品愈來愈多,我們想要有個⽅式,能夠更好的讓⼯程師們去

    分⼯合作以及盡可能重複使⽤既有的程式碼,減少⼯程師們所需要花費的時間跟⼒氣。 ※Source from︓************************
  3. - 與使⽤的技術無關(Be Technology Agnostic) - 能夠區隔個團隊的程式碼 (Isolate Team Code) -

    區隔不同的資源,⽤前綴字去區隔 css, local storage naming 等等 (Establish Team Prefixes) (JS/styles isolation) - 盡量使⽤原⽣的⽅式在程式碼之間溝通(Favor Native Browser Features over Custom APIs) - 組出來的網站要夠有彈性夠堅固(Build a Resilient Site) Micro Frontend Architecture ※Source from︓https://micro-frontends.org/
  4. Pros: - 可以很簡單的擴展⾴⾯ - 更快的部署(因為每個 module 可以個別部署) - 不同的 module

    可以使⽤不同的 tech stack - 可以很好的切分開發區塊 - 比較容易測試個別的 modules Micro Frontend Architecture
  5. Cons: - 組起來的⾴⾯(Host page)不好測試 - 不同 tech stack 間怎麼溝通,可能會有重複的 assets,比如:

    3rd party libs 或是 CSS files/classes - 在 individual 開發的結果跟實際組出⾴⾯的時候,可能會有落差 - 不容易在 modules 間 share data (by iframe or other ways) - 組⾴⾯的⼈很無聊 Micro Frontend Architecture
  6. Pros: - 做到原⽣的 JS, styles 隔離 - 做到 Technology Agnostic,你想⽤什麼

    tech stack 都可以 Micro Frontend Architecture - Iframe(Utility Platform) Cons: - 速度慢,每個 iframe 都要重複 fetch 它需要的 assets 以及 build DOM/CSSDOM tree - Iframe 與 host 的溝通不容易 - Iframe 裡⾯的東⻄無法超出它的範圍,比如某個 iframe 裏⾯實作了 dialog 的功能,但他只能存在於 此 iframe 裡,想要拉出來給 host ⽤不可能
  7. 從 Bundle Level 來看 Module Federation Multiple separate builds should

    form a single application. These separate builds should not have dependencies between each other, so they can be developed and deployed individually. ※Source from︓https://medium.com/swlh/webpack-5-module-federation-a-ga me-changer-to-javascript-architecture-bcdd30e02669
  8. Module Federation - 個別的 app 彼此是 standalone 的,可以分開 deploy,可以互相引⽤ -

    LINE TODAY 現在已經是⾃⼰⼀個完善的 app server,可以在改動最⼩的情況下,把 TODAY server 當 module server 來⽤ - 另外可以再起⼀個新的 module server,讓他 host 所有 sharable 的 chunk,⾃⼰也可以 host ⼀個 module list site,讓想要引⽤的 developer 去看 demo。 - 如果某個 module 有線上的問題,可以只重新 deploy 有問題的 module 就好 The benefits
  9. Module Federation - 對於 SSR 的⽀援度有問題,無法在 server side 簡單的拉到需要的 chunk,需要不少的

    workaround 去處理 - ⽬前只有 Webpack 5 ⽀援,Nuxt 2 只⽀援到 Webpack 4,所以 Nuxt base 的專案⽬前無法 使⽤(October 12, 2021, 10 PM GMT+8 會推出 Nuxt 3) - 在 Next.js 上使⽤在拉 asset 的時候會有 routing 的問題,需要搭配 MF 作者⾃⼰寫的 extension 去 workaround Problems we bumped into
  10. Qiankun is an implementation of Micro Frontends, which based on

    single-spa. It aims to make it easier and painless to build a production-ready microfront-end architecture system. Qiankun/Single SPA ※Source from︓ https://qiankun.umijs.org/guide
  11. Qiankun/Single SPA - 與使⽤的技術無關(Technology Agnostic) - HTML Entry 接入⽅式(HTML Entry

    access mode) - 樣式隔離(Style Isolation) - JS 沙盒隔離(JS Sandbox) by Proxy - 預載入資源(Prefetch Assets) ※Source from︓https://qiankun.umijs.org/guide 功能
  12. Qiankun/Single SPA - Micro apps 沒辦法 server-side render - Micro

    apps 也不能使⽤ next.js, nuxt.js 等框架,因為它需要你暴露 mount 的 function 以及需 要⼀個啟動⽂件,但 next/nuxt 都已經包起來,⽤ plugin 的⽅式插入,基本上能夠更動的就是 (next|nuxt).config.js Issue we bumped into
  13. - ⼤部分 micro frontend framework 不⽀援 SSR,不⽀援像是 Next.js/Nuxt.js ⼀類的 framework

    - 因為要⽀援不同的 library/framework,所以需要這些 library/framework 有⼀ 些 tweaks/workaround,比如改變 webpack config 去暴露⼀些 render hooks - 要實際⽤在 production 上還是問題過多(可以從各 framework 的 issues 跟 gitter 看得出來) 整理⼀下
  14. - Share Self-Contained Modules,讓開發者可以隨取即⽤,⽽不只是分享⼀個 ⼩ component,讓⼤家比較有動⼒去重複使⽤既有的程式碼 - 這些 Self-Contained Modules

    可以個別被獨立開發,讓不同的 team 各⾃處 理 - Modules 之間可以溝通 - ⽀援 SSR - ⽀援既有的 frameworks 像是 Next.js/Nuxt.js 梳理⼀下 根據前⾯的 survey 再重新梳理我們的需求
  15. Host: - 可以是 Nuxt.js/Next.js based 的 app Remote(self-contained modules): -

    能夠被獨立開發,獨立被 run 起來 - 能夠被 export 成被 Host import 的 chunks,並以 module 為單位 - Module 要包含 fetch data 的部分,以及內部的邏輯,讓它是個獨立⾃成⼀格的個體 - 分別⽀援 Nuxt.js/Next.js Pre-installed Self-Contained Modules
  16. Pre-installed Self-Contained Modules - 使⽤ yarn/npm 去 pre-install,在 build time

    時 import 進來,所以沒有 dynamic import 時會 遇到的 proxy or routing 問題 - 開發時使⽤ Nuxt.js/Next.js 做基底,所以能夠同時⽀援 client/server side render - 使⽤ peerDependencies 去處理共⽤ library,減少 duplicated lib 的問題
  17. Pre-installed Self-Contained Modules - Nuxt.js 的 fetch() 可以在任意 component 拉資料:

    - On the server, before the initial page is rendered - On the client, some time after the component is mounted - 利⽤這個特性,我們可以讓個別的 modules ⾃⼰處理 data 的抓取,然後做成 self-contained modules - 使⽤ registerModule 來把個別的 store 註冊進去 host - 如果是 Next.js 我們就要⾃⼰定義 provider 和 consumer,以及考慮如何組合 store 以 Nuxt 為例
  18. Micro frontend 有很多種實現⽅式 Micro Frontend Architecture - Iframe - WebComponent

    - 沙箱隔離 - Module Federation - Pre-Install and treat as whole app in the end