single-spa 微前端部署

什么是微前端

微前端指的是在于瀏覽器中得微服務(wù)。

微前端是用戶(hù)界面中的一部分,可以分割為多個(gè)react珍昨、Vue、Angular等框架來(lái)渲染組合句喷。沒(méi)有微前端可由不同的開(kāi)發(fā)團(tuán)隊(duì)只管里選擇不同框架镣典。比如擁有獨(dú)立的git倉(cāng)庫(kù)、獨(dú)立構(gòu)建等唾琼。

構(gòu)建主應(yīng)用

1兄春、安裝single-spa依賴(lài)npm install single-spa --save -d并在mian.js中引入

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import './single-spa-config.js'

Vue.config.productionTip = false

new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app')

2、創(chuàng)建single-spa的配置文件為single-spa-config

singleSpa.registerApplication: 注冊(cè)子應(yīng)用;
appName: 子應(yīng)用名稱(chēng);
applicationOrLoadingFn: 子應(yīng)用注冊(cè)函數(shù)锡溯,子應(yīng)用需要返回 single-spa 的生命周期對(duì)象;
activityFn: 回調(diào)函數(shù)入?yún)?location 對(duì)象卦尊,可以寫(xiě)自定義匹配路由加載規(guī)則;

/* eslint-disable */
import * as singleSpa from 'single-spa'; //導(dǎo)入single-spa
import axios from 'axios';
/*
* runScript:一個(gè)promise同步方法十拣∥酝粒可以代替創(chuàng)建一個(gè)script標(biāo)簽盹舞,然后加載服務(wù)
* */
const runScript = async (url) => {
    return new Promise((resolve, reject) => {
        const script = document.createElement('script');
        script.src = url;
        script.onload = resolve;
        script.onerror = reject;
        const firstScript = document.getElementsByTagName('script')[0];
        firstScript.parentNode.insertBefore(script, firstScript);
    });
};

/*
* getManifest:遠(yuǎn)程加載manifest.json 文件,解析需要加載的js
* */
const getManifest = (url, bundle) => new Promise(async (resolve) => {
    console.log(url, bundle)
    const { data } = await axios.get(url);
    const { entrypoints, publicPath } = data;
    const assets = entrypoints[bundle].assets;
    for (let i = 0; i < assets.length; i++) {
        await runScript(publicPath + assets[i]).then(() => {
            if (i === assets.length - 1) {
                resolve()
            }
        })
    }
});
singleSpa.registerApplication( //注冊(cè)微前端服務(wù)
    'cv',
    async () => {
        // 注冊(cè)用函數(shù)倡蝙,
        // return 一個(gè)singleSpa 模塊對(duì)象九串,模塊對(duì)象來(lái)自于要加載的js導(dǎo)出
        // 如果這個(gè)函數(shù)不需要在線引入,只需要本地引入一塊加載:
        // () => import('xxx/main.js')
        let singleVue = null;
        await getManifest('http://localhost:3000/manifest.json', 'app').then(() => {
            singleVue = window.singleVue;
        });
        return singleVue;
    },
    location => location.pathname.startsWith('/cv/') // 配置微前端模塊前綴
);
singleSpa.registerApplication( //注冊(cè)微前端服務(wù)
    'lb',
    async () => {
        let singleVue = null;
        await getManifest('http://localhost:5000/manifest.json', 'app').then(() => {
            singleVue = window.singleVue;
        });
        return singleVue;
    },
    location => location.pathname.startsWith('/lb/') // 配置微前端模塊前綴
);
singleSpa.start(); // 啟動(dòng)

3寺鸥、在路由中注冊(cè)統(tǒng)一路由猪钮,我們注冊(cè)一個(gè)子服務(wù)路由,可填不填寫(xiě)component字段胆建。

{
              path: '/cv',
                name: 'cv',
                component: () => import(/* webpackChunkName: "about" */ '@/components/child.vue')
            },

child.vue文件

<script>
export default {
  name: 'Vue',
  render (h) {
    return h()
  }
}
</script>

App.vue 增加一個(gè) 子項(xiàng)目dom 的 id

// 點(diǎn)擊路由跳轉(zhuǎn)
<router-link to="/lb/" class="ml10">lb</router-link>
// 子項(xiàng)目id
<div id="childApp"></div>
<router-view />

子項(xiàng)目創(chuàng)建

1躬贡、安裝single-spa-vue依賴(lài)npm install single-spa-vue --save -d

在mian.js中引入

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './vuex/store'
import singleSpaVue from 'single-spa-vue'
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';

Vue.config.productionTip = false
Vue.use(ElementUI);

const errorHandler = (error, vm) => {
    console.error('拋出全局異常', error);
}
Vue.config.errorHandler = errorHandler;
Vue.prototype.$throw = (error) => errorHandler(error, this);

const vueOptions = {
    el: '#childApp',
    router,
    store,
    render: h => h(App)
}

// 判斷當(dāng)前頁(yè)面使用singleSpa應(yīng)用,不是就渲染
if (!window.singleSpaNavigate) {
    delete vueOptions.el
    new Vue(vueOptions).$mount('#app')
}

// singleSpaVue包裝一個(gè)vue微前端服務(wù)對(duì)象
const vueLifecycles = singleSpaVue({
    Vue,
    appOptions: vueOptions
})

export const bootstrap = vueLifecycles.bootstrap // 啟動(dòng)時(shí)
export const mount = vueLifecycles.mount // 掛載時(shí)
export const unmount = vueLifecycles.unmount // 卸載時(shí)
export default vueLifecycles

2、安裝stats-webpack-plugin插件npm install stats-webpack-plugin --save -d

vue.config.js

const StatsPlugin = require('stats-webpack-plugin');
module.exports = {
   publicPath: '//localhost:5000',
    // css在所有環(huán)境下眼坏,都不單獨(dú)打包為文件拂玻。這樣是為了保證最小引入(只引入js)
    css: {
        extract: false
    },
   
    configureWebpack: (config) => {
        if (env === 'production') {
            config.plugins.push(
                new UglifyJsPlugin({
                    uglifyOptions: {
                        compress: {
                            // warnings: false,
                            drop_debugger: true, // console
                            drop_console: true,
                            pure_funcs: ['console.log'] // 移除console
                        }
                    }
                })
            );
        }
        config.plugins.push(
            new StatsPlugin('manifest.json', {
            chunkModules: false,
            entrypoints: true,
            source: false,
            chunks: false,
            modules: false,
            assets: false,
            children: false,
            exclude: [/node_modules/]
        }))
        config.output.library = 'singleVue'
        config.output.libraryTarget = 'window'
    },
        devtool: 'none'
    },
    devServer: {
        contentBase: path.join(__dirname, 'dist'),
        compress: true,
        port: 5000,
        headers: {"Access-Control-Allow-Origin":"*"} //本地跨域處理
    }
}

3酸些、router 配置

const router = new VueRouter({
  mode: 'history',
  base: '/cv/',
  routes
})
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市檐蚜,隨后出現(xiàn)的幾起案子魄懂,更是在濱河造成了極大的恐慌,老刑警劉巖闯第,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件市栗,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡咳短,警方通過(guò)查閱死者的電腦和手機(jī)填帽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)咙好,“玉大人篡腌,你說(shuō)我怎么就攤上這事」葱В” “怎么了嘹悼?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)层宫。 經(jīng)常有香客問(wèn)我杨伙,道長(zhǎng),這世上最難降的妖魔是什么萌腿? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任限匣,我火速辦了婚禮,結(jié)果婚禮上毁菱,老公的妹妹穿的比我還像新娘米死。我一直安慰自己,他們只是感情好鼎俘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布哲身。 她就那樣靜靜地躺著辩涝,像睡著了一般贸伐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上怔揩,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天捉邢,我揣著相機(jī)與錄音,去河邊找鬼商膊。 笑死伏伐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的晕拆。 我是一名探鬼主播藐翎,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了吝镣?” 一聲冷哼從身側(cè)響起堤器,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎末贾,沒(méi)想到半個(gè)月后闸溃,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拱撵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年辉川,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拴测。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡乓旗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出昼扛,到底是詐尸還是另有隱情寸齐,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布抄谐,位于F島的核電站渺鹦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蛹含。R本人自食惡果不足惜毅厚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望浦箱。 院中可真熱鬧吸耿,春花似錦、人聲如沸酷窥。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蓬推。三九已至妆棒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間沸伏,已是汗流浹背糕珊。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留毅糟,地道東北人红选。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像姆另,于是被迫代替她去往敵國(guó)和親喇肋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子坟乾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354