基于 Vue CSR 的微前端實(shí)現(xiàn)方案

在這里就不講微前端的各種優(yōu)缺點(diǎn)矫夯,直接假設(shè)你在負(fù)責(zé)一個(gè)中后臺(tái)管理系統(tǒng)的開(kāi)發(fā)唧龄,所有的業(yè)務(wù)模塊全部都在一個(gè)項(xiàng)目中打包,隨著業(yè)務(wù)量的不斷增長(zhǎng)蔚润,編譯越來(lái)越慢磅氨,你期望可以從老的項(xiàng)目中將新的業(yè)務(wù)進(jìn)行獨(dú)立開(kāi)發(fā)、獨(dú)立部署抽碌,以微應(yīng)用的形式嵌入到老項(xiàng)目中悍赢。

本篇文章的受眾是那些希望在新老的項(xiàng)目中,在不需要你對(duì)老項(xiàng)目進(jìn)行改動(dòng)老項(xiàng)目的前提下货徙,嵌入微應(yīng)用左权,如果本篇文章對(duì)你有幫助,請(qǐng)點(diǎn)個(gè)??痴颊!

核心要素

  • 構(gòu)建生產(chǎn)環(huán)境代碼赏迟,輸出遠(yuǎn)程組件所需的 JSON
  • 通過(guò) ajax 請(qǐng)求,拿到這個(gè) JSON 的數(shù)據(jù)蠢棱,傳給 遠(yuǎn)程組件

新項(xiàng)目的搭建

對(duì)于項(xiàng)目的搭建锌杀,在這里就不再仔細(xì)的展開(kāi)講了,大家直接看Genesis項(xiàng)目快速開(kāi)始的文檔吧

修改編譯代碼

import path from 'path';
import fs from 'fs';
import { Build } from '@fmfe/genesis-compiler';
import { ssr } from './genesis';

const start = async () => {
    /**
     * 創(chuàng)建一個(gè)編譯實(shí)例
     */
    const build = new Build(ssr);
    /**
     * 開(kāi)始執(zhí)行編譯程序泻仙,構(gòu)建生產(chǎn)環(huán)境應(yīng)用包
     */
    await build.start();
    /**
     * 編譯完成后糕再,創(chuàng)建一個(gè)渲染器,輸出遠(yuǎn)程組件所需的內(nèi)容
     */
    const renderer = ssr.createRenderer();
    /**
     * CSR 渲染輸出 JSON
     */
    const result = await renderer.render({ mode: 'csr-json' });
    /**
     * 將 JSON 保存到客戶端目錄
     */
    fs.writeFileSync(
        path.resolve(ssr.outputDirInClient, 'app.json'),
        JSON.stringify(result.data, null, 4),
        'utf8'
    );
};
start();

如果你是根據(jù)官方文檔來(lái)走的話玉转,你只需要自己修改一下 genesis.build.ts 文件即可突想。如果你自定義了文件名,只要在 await build.start() 方法執(zhí)行完成后,創(chuàng)建一個(gè)渲染器猾担,將 CSR 的渲染結(jié)果保存到一個(gè) JSON 文件即可袭灯。

編譯完成后,你得到的大概是這樣的一個(gè)文件

你只需要將 client 目錄的靜態(tài)文件部署到你的服務(wù)器即可绑嘹。
[圖片上傳失敗...(https://fmfe.github.io/genesis-docs/assets/img/20200525210729.5d79f1dd.jpg)]

老項(xiàng)目遠(yuǎn)程組件加載

假設(shè)你的靜態(tài)資源的基本路徑是 /ssr-genesis/稽荧,那么你就可以通過(guò) /ssr-genesis/app.json 訪問(wèn)到這個(gè)文件。

在你的老項(xiàng)目上安裝遠(yuǎn)程組件

npm install @ fmfe/genesis-remote axios

在你對(duì)應(yīng)的路由上工腋,使用遠(yuǎn)程組件姨丈,加載此組件即可。

<template>
    <div class="app">
        <RemoteView :fetch="fetch" />
    </div>
</template>
<script lang="ts">
import Vue from 'vue';
import axios from 'axios';
import { RemoteView } from '@fmfe/genesis-remote';

export default Vue.extend({
    components: {
        RemoteView
    },
    methods: {
        async fetch() {
            const res = await axios.get('/ssr-genesis/app.json');
            if (res.status === 200) {
                return res.data;
            }
            return null;
        }
    }
});
</script>

多歷史模式的支持

如果你老項(xiàng)目使用歷史模式夷蚊,在子應(yīng)用也使用歷史模式构挤,會(huì)導(dǎo)致 router.push('/xxx') 產(chǎn)生多條歷史記錄,為了解決這個(gè)問(wèn)題惕鼓,你可以在子應(yīng)用使用 abstract 模式筋现,或者使用 @fmfe/genesis-app 幫你處理多個(gè) Router 實(shí)例使用歷史模式產(chǎn)生的BUG,注意箱歧,你需要在新老項(xiàng)目一起使用 @fmfe/genesis-app 包裝后的 Router

拓展

/**
 * CSR 渲染輸出 HTML
 */
const result = await renderer.render({ mode: 'csr-html' });
/**
 * 將 html 保存到客戶端目錄
 */
fs.writeFileSync(
    path.resolve(ssr.outputDirInClient, 'index.html'),
    result.data
    'utf8'
);

如果你僅僅只是想做 CSR 的項(xiàng)目矾飞,只需要渲染出 html 即可,和平常的 CSR 項(xiàng)目一樣呀邢,將 client 目錄部署到服務(wù)器洒沦。

總結(jié)

Genesis 只是一個(gè) Vue SSR 的渲染庫(kù),它不是框架价淌,它只是給你提供了最基礎(chǔ)的 SSR 渲染能力申眼。
后面有時(shí)間,專門寫一篇介紹一些 Genesis 的一些設(shè)計(jì)理念和誕生的初衷蝉衣。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末括尸,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子病毡,更是在濱河造成了極大的恐慌濒翻,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件啦膜,死亡現(xiàn)場(chǎng)離奇詭異有送,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)僧家,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門雀摘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人八拱,你說(shuō)我怎么就攤上這事阵赠∷嘎洌” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵豌注,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我灯萍,道長(zhǎng)轧铁,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任旦棉,我火速辦了婚禮齿风,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘绑洛。我一直安慰自己救斑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布真屯。 她就那樣靜靜地躺著脸候,像睡著了一般。 火紅的嫁衣襯著肌膚如雪绑蔫。 梳的紋絲不亂的頭發(fā)上运沦,一...
    開(kāi)封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音配深,去河邊找鬼携添。 笑死,一個(gè)胖子當(dāng)著我的面吹牛篓叶,可吹牛的內(nèi)容都是我干的烈掠。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼缸托,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼左敌!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起嗦董,我...
    開(kāi)封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤母谎,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后京革,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體奇唤,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年匹摇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了咬扇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡廊勃,死狀恐怖懈贺,靈堂內(nèi)的尸體忽然破棺而出经窖,到底是詐尸還是另有隱情,我是刑警寧澤梭灿,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布画侣,位于F島的核電站,受9級(jí)特大地震影響堡妒,放射性物質(zhì)發(fā)生泄漏配乱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一皮迟、第九天 我趴在偏房一處隱蔽的房頂上張望搬泥。 院中可真熱鬧,春花似錦伏尼、人聲如沸忿檩。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)燥透。三九已至,卻和暖如春扰她,著一層夾襖步出監(jiān)牢的瞬間兽掰,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工徒役, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留孽尽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓忧勿,卻偏偏與公主長(zhǎng)得像杉女,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鸳吸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345