SlideShare a Scribd company logo
如何用 Vue 發大財
Vue Component 跨網站共用法則
milkmidi
milkmidi (奶綠茶)
Positive Grid – Staff Frontend Enginner
milkmidi@gmail.com
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

More Related Content

PDF
2021laravelconftwslides12
PDF
2021laravelconftwslides8
PDF
2021laravelconftwslides9
PDF
2021.laravelconf.tw.slides3
PPTX
Vue.js
PDF
ASP.NET Core 2.1設計新思維與新發展
PDF
動手打造 application framework-twMVC#15
PDF
AngularJS training in Luster
2021laravelconftwslides12
2021laravelconftwslides8
2021laravelconftwslides9
2021.laravelconf.tw.slides3
Vue.js
ASP.NET Core 2.1設計新思維與新發展
動手打造 application framework-twMVC#15
AngularJS training in Luster

What's hot (19)

PPTX
Angular.js & ASP.NET in Study4
PDF
Uliweb cheat sheet_0.1
PDF
YUI 教學 - 前端工程開發實務訓練
PDF
程式人雜誌 -- 2015 年1月號
PDF
程式人雜誌 2015年三月
PDF
程式人雜誌 2015年五月
PPTX
Uliweb设计分享
PDF
從改寫後台 jQuery 開始的 Vue.js 宣告式渲染
PPTX
How tovuejs
PDF
一小時可以打造什麼服務Plus twMVC#18
PDF
JavaScript Code Quality
PDF
Angular js twmvc#17
PPTX
Study4 love.2016.2.20.ionic
PDF
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing
PDF
Vue ithome
PDF
不断归零的前端人生 - 2016 中国软件开发者大会
PDF
專案分層架構 twMVC#18
PDF
如何在實務上使用TDD來開發 twmvc#12
PDF
輕鬆上手Asp.net web api 2.1-twMVC#14
Angular.js & ASP.NET in Study4
Uliweb cheat sheet_0.1
YUI 教學 - 前端工程開發實務訓練
程式人雜誌 -- 2015 年1月號
程式人雜誌 2015年三月
程式人雜誌 2015年五月
Uliweb设计分享
從改寫後台 jQuery 開始的 Vue.js 宣告式渲染
How tovuejs
一小時可以打造什麼服務Plus twMVC#18
JavaScript Code Quality
Angular js twmvc#17
Study4 love.2016.2.20.ionic
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing
Vue ithome
不断归零的前端人生 - 2016 中国软件开发者大会
專案分層架構 twMVC#18
如何在實務上使用TDD來開發 twmvc#12
輕鬆上手Asp.net web api 2.1-twMVC#14
Ad

Similar to 2021laravelconftwslides10 (20)

PPT
在雲端上啜飲爪哇
PDF
Html5开发android应用程序概述
PPT
Using google appengine_final
PDF
製作 Unity Plugin for iOS
PDF
Kissy design
PDF
Performance 入門 - 前端工程開發實務訓練
PDF
模块加载策略 - 2012 SDCC, 北京
PPTX
Visual studio 2017 with gulp
PDF
Javascript autoload
PDF
SeaJS 那些事儿
PDF
以HTML5和COIMOTION打造跨平台App
PDF
旺铺前端设计和实现
PPTX
J engine -构建高性能、可监控的前端应用框架
PDF
20141212 html5 及微軟跨平台佈局 long
PPTX
J engine -构建高性能、可监控的前端应用框架
PPTX
这年头,你只需要懂Node webkit
PDF
JSDC 2015 React-Native 實戰
PPT
Using google appengine_1027
PDF
Node.js 進攻桌面開發
PPS
基于Android ndk的软件开发简介 放映
在雲端上啜飲爪哇
Html5开发android应用程序概述
Using google appengine_final
製作 Unity Plugin for iOS
Kissy design
Performance 入門 - 前端工程開發實務訓練
模块加载策略 - 2012 SDCC, 北京
Visual studio 2017 with gulp
Javascript autoload
SeaJS 那些事儿
以HTML5和COIMOTION打造跨平台App
旺铺前端设计和实现
J engine -构建高性能、可监控的前端应用框架
20141212 html5 及微軟跨平台佈局 long
J engine -构建高性能、可监控的前端应用框架
这年头,你只需要懂Node webkit
JSDC 2015 React-Native 實戰
Using google appengine_1027
Node.js 進攻桌面開發
基于Android ndk的软件开发简介 放映
Ad

More from LiviaLiaoFontech (6)

PDF
2021laravelconftwslides11
PDF
2021laravelconftwslides6
PDF
2021laravelconftwslides4
PDF
2021.laravelconf.tw.slides5
PDF
2021.laravelconf.tw.slides2
PDF
2021.laravelconf.tw.slides1
2021laravelconftwslides11
2021laravelconftwslides6
2021laravelconftwslides4
2021.laravelconf.tw.slides5
2021.laravelconf.tw.slides2
2021.laravelconf.tw.slides1

2021laravelconftwslides10