Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
202110-federation
Search
milkmidi
September 24, 2021
Programming
180
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
202110-federation
milkmidi
September 24, 2021
More Decks by milkmidi
See All by milkmidi
202512-WebConfig 大 AI 時代,工程師的成長之路
milkmidi
0
410
202403-WebComponent
milkmidi
0
220
WebComponent
milkmidi
1
3.2k
前端好朋友-tailwindcss
milkmidi
0
8.6k
Vue3一次就上手
milkmidi
0
6.4k
202007-React對戰雷台
milkmidi
0
200
Other Decks in Programming
See All in Programming
AI 輔助遺留系統現代化的經驗分享
jame2408
1
760
ローカルLLMでどこまでコードが書けるか -拡張版 / How much code can be written on a local LLM Extended
kishida
11
4.3k
AIとASP.NET Coreで雑Webアプリを作った話
mayuki
0
660
技術的負債解消で開発者の未来を開く- AIの力でコード刷新
kmd2kmd
0
110
脅威をエンジニアリングの糧にして――現場編 / Turning Threats into Engineering Fuel — Field Edition
nrslib
0
290
Webフレームワークの ベンチマークについて
yusukebe
0
170
JavaDoc 再入門
nagise
1
370
「AIで開発し、AIを届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
4
5.3k
並列実装の現場、2ヶ月間実務でAIを使い倒したAIもPCも私も限界が近い
ming_ayami
0
130
[2026年度第1回ORセミナー] 計画最適化ベンチャーと競技プログラミング人材
terryu16
0
270
Make SRE Operations Easier with Azure SRE Agent
kkamegawa
0
6.9k
AI 時代のソフトウェア設計の学び方
masuda220
PRO
29
13k
Featured
See All Featured
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.3k
Six Lessons from altMBA
skipperchong
29
4.3k
Fireside Chat
paigeccino
42
4k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
340
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.9k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
170
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
240
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
170
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2k
Transcript
如何用 Vue 發大財 Vue Component 跨網站共用法則 milkmidi
milkmidi (奶綠茶) Positive Grid – Staff Frontend Enginner
[email protected]
https://www.facebook.com/milkmidifans
答:寫程式不會發大財 圖片來源:找不到出處
2021 前端生態圈 jQuery, Vue, React, 其他 圖片來源:找不到出處
不管什麼 framework, 都需要 bundle 工具 什麼,你是純 JS 派,不用任何 bundle 工具
bundle 工具 1:parcel 優:快 圖片來源:找不到出處
bundle 工具 2:Vite 優:快 缺:IE 不能動
今天的主角 Webpack 5 對,一定要 5,對,就是這麼任性
先來了解多專案共用 Component 的心法 圖片來源:我家的主子
心法1:Copying and Pasting 優:人人都會,現學現會,發大財 缺:會被團隊的人打 圖片來源:goodreads.com
心法2:Git Submodule 優:會 git 就會用 缺:很難做到 Component 版控
心法3:npm publish 缺:如果 Component 很常修改的話,會需要一直 publish
今天的主角 webpack5 Federation Plugin https://webpack.js.org/concepts/module-federation/ Module Federation 是什麼 ? 一種
JavaScript 的微前端架構 可以讓一個 JS 動態載入另一個專案的元件 聽起來是不是超爽的
來人呀,上 Code A 站,暫稱 Provider // webpack.config.js output: { publicPath:
‘http://localhost:9527/’, 這裡一定要是絕對路徑 }, new ModuleFederationPlugin({ name: ‘milkmidiLibrary’, // Module 名稱(會變成 window 變數) filename: ‘remoteEntry.js’, // 打包後的檔名 exposes: { // 想要共用的元件 './MyButton': './src/components/MyButton.vue', './MyModel': './src/libs/MyModel', './useDataWithLodash': './src/hooks/useDataWithLodash', }, })
來人呀,上 Code A 站,暫稱 Provider
MyModel.ts 沒載入任何第三方 package export const add = (a:number, b:number):number =>
a + b; const config = { name: 'milkmidi-MyModel', value: '發大財', }; export default config;
useDataWithLodash.ts import { reactive, onMounted } from 'vue'; import _
from 'lodash'; export type UseFetchDataType = { isLoading : boolean; data?: string; } const useFetchData = ():UseFetchDataType => { const state:UseFetchDataType = reactive({ data: undefined, isLoading: false, }); onMounted(async () => { state.isLoading = true; state.data = _.get({ name: 'milkmidi' }, 'name'); state.isLoading = false; }); return state; }; export default useFetchData;
對,就是這麼簡單
問題 共用的第三方 module (vue, lodash)該怎麼辦 ? 總不能每個站都載一次吧
Shared // webpack.config.js const deps = require('./package.json').dependencies; new ModuleFederationPlugin({ 略
shared: { ...deps, vue: { // 這個參數是重點。ture 的話,會先把有用到的 node_modules 都先包裡來 // eager: true, // 奶綠覺得不要打開 // only a single version of the shared module is allowed singleton: true, // strictVersion: true, // 開了 host 和 remote 就會需要一樣的版本 requiredVersion: deps.vue, }, } })
Uncaught Error: Shared module is not available for eager consumption
bootstrap.js (不是那個 bootstrap css) // bootstrap.js import { createApp }
from 'vue'; import App from './App.vue'; createApp(App) .mount('#root'); // index.js import { createApp } from 'vue'; import App from './App.vue'; createApp(App) .mount('#root’); import('./bootstrap');
Shared eager = false;
Shared eager = false; js 未 minify
Shared eager = true; vue 被包到 remoteEntry.js 裡了
來人呀,上 Code B 站,暫稱 host (B 站沒安裝 lodash) // webpack.config.js
new ModuleFederationPlugin({ remotes: { milkmidiLibrary: 'milkmidiLibrary@http://localhost:9527/remoteEntry.js', }, shared: { ...deps, vue: { 略 }, }, }),
B 站 一樣要有 bootstrap.js // 就像一般的寫法,直接當 module import, 超爽 import
MyModel, { add } from 'milkmidiLibrary/MyModel'; import MyButton from 'milkmidiLibrary/MyButton'; import useDataWithLodash from 'milkmidiLibrary/useDataWithLodash’; export default { setup() { const state = useDataWithLodash(); return { state, }; }, mounted() { console.log(MyModel); console.log('MyModel.add(1,1) = ', add(1, 1)); }, }; </script> <template> <div id="app"> <h1>Host</h1> <MyButton /> <MyButton :default-value="10" /> /div> </template>
來人呀,上 Code B 站,暫稱 host (B 站沒安裝 lodash)
來人呀,上 Code C 站 , 不要用 bootstrap + 使用 script
載入 // webpack.config.js new ModuleFederationPlugin({ remoteType: 'var', remotes: { milkmidiLibrary: 'milkmidiLibrary', }, shared: { vue: { // 如果沒有 bootstrap, 所有用到的 shared 都需要打開 eager eager: true, 略 }, }, }), // index.html <script src="http://localhost:9527/remoteEntry.js" defer></script>
import('milkmidiLibrary/MyModel').then((myModel) => {}); const MyButton = defineAsyncComponent(() => import('milkmidiLibrary/MyButton’)); export
default { setup() { const state = reactive({ data: undefined, isLoading: false, }); // 在這樣的情況下,就會無解,因為 hooks 不能是非同步載入 // 還是其實可以? (我要 tag kuro 大大), 至少我確定 react 不行 import('milkmidiLibrary/useDataWithLodash').then((module) => { const result = module.default(); console.log(result); state.isLoading = result.isLoading; state.data = result.data; // not work. OOP }); return { state, }; }, }; </script>
Module Federation 不限 Vue, 只要是 JS 都可以用 github source
沒有永遠的技術 想當年我也想靠 Flash 吃一輩子 結果 Jobs 一句話就.... 圖片來源:Jobs 說 no
flash, 然後林北就失業了。
學習不需要為公司、長官或同事, 不需要為別人,只為你自己。 五倍紅寶石 高見龍
奶綠茶的粉絲團 https://www.facebook.com/milkmidifans