Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
202110-federation
Search
milkmidi
September 24, 2021
Programming
200
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
550
202403-WebComponent
milkmidi
0
260
WebComponent
milkmidi
1
3.3k
前端好朋友-tailwindcss
milkmidi
0
8.7k
Vue3一次就上手
milkmidi
0
6.4k
202007-React對戰雷台
milkmidi
0
210
Other Decks in Programming
See All in Programming
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
510
re:Inventに行く前に知っておきたい現地参加のノウハウ
nokomoro3
0
390
The Rails Doctrine Decade
koic
2
540
SREの越境 / SRE Collaboration
y0hgi
2
300
APNsからLive Activityを開始する話
yumnumm
0
160
プロダクトコードからライブラリの境界を見つける
elmetal
PRO
0
110
AWSに止められる覚悟してますか?
morizo_1984
2
520
設計次第でAIコードの読む量は減らせる / designing-for-code-reading
minodriven
34
16k
Rでドレミ/Do-Re-Mi_with_R
florets1
0
130
wkhtmltopdfの次どうするか問題2026
willnet
2
1.9k
Kubernetes祭り #2 OP/ED
bells17
0
110
見えないものを探る要求要件定義に必要な基本的思考 / invisible-requirement-thinking
minodriven
15
8k
Featured
See All Featured
How to Talk to Developers About Accessibility
jct
2
570
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
450
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
980
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
203
77k
Accessibility Awareness
sabderemane
1
240
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
50
10k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
Leo the Paperboy
mayatellez
10
2.4k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
Agile that works and the tools we love
rasmusluckow
331
22k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
620
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
770
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