qiankun 實(shí)戰(zhàn)(一)

前言

前兩天用了一下微前端框架 icestark, 在實(shí)際架構(gòu)搭建過(guò)程中發(fā)現(xiàn)中發(fā)現(xiàn)在 Vue 主應(yīng)用子應(yīng)用之間切換 tag (tag 分別主應(yīng)用和子應(yīng)用的頁(yè)面)頁(yè)簽時(shí)會(huì)有子應(yīng)用數(shù)據(jù)狀態(tài)無(wú)法保存的情況糖耸,搜索了一波解決方案后發(fā)現(xiàn),icestarkReact 應(yīng)用實(shí)現(xiàn)了對(duì)數(shù)據(jù)狀態(tài)的緩存,Vue 里面沒(méi)有這個(gè)實(shí)現(xiàn)渡处。

React 實(shí)現(xiàn)的思路是通過(guò) Tabs 組件結(jié)合 icestark 實(shí)現(xiàn)的一種機(jī)制颇玷,但是沒(méi)有用到路由奢人。由于架構(gòu)時(shí)間有限闸昨,發(fā)現(xiàn)按照那個(gè)方案調(diào)整是實(shí)現(xiàn)方面時(shí)間代價(jià)有點(diǎn)大,嘗試了一下 qiankun 發(fā)現(xiàn)框架中可以不存在這個(gè)問(wèn)題,所以決定更換微前端框架方案為 qianun昔搂。

如果想了解 icestark 可以看如下文章, 里面有一些關(guān)于微前端架構(gòu)理念的思考

快速上手微前端框架 icestark (一)

快速上手微前端框架 icestark (二)

主應(yīng)用接入 qiankun

本地使用 vue-cli 創(chuàng)建了一個(gè) Vue2.0 純凈項(xiàng)目作為主應(yīng)用,執(zhí)行 yarn add qiankun 命名安裝 qiankun镐捧,在 main.js 中引入 qiankun, 注冊(cè)并啟動(dòng)

import Vue from 'vue'
import App from './App.vue'
import VueRouter from 'vue-router'

// --- 引入qiankun ---
import { registerMicroApps, start } from 'qiankun'

registerMicroApps([
  {
    name: 'vueApp',
    entry: '//localhost:8081',
    container: '#container',
    activeRule: '/app-vue'
  }
])

start();
// --- end ---

Vue.config.productionTip = false

Vue.use(VueRouter)

const router = new VueRouter({
  mode: 'hash',
  base: '/',
  routes: [
    {
      path: '/',
      name: 'home',
      component: () => import('./views/Home.vue')
    },
    {
      path: '/home',
      name: 'home',
      component: () => import('./views/Home.vue')
    },
    {
      path: '/hello',
      name: 'hello',
      component: () => import('./components/HelloWorld.vue')
    }
  ]
})

new Vue({
  router,
  render: h => h(App),
}).$mount('#app')
vue-router 安裝時(shí)遇到一個(gè)小異常

安裝 vue-router 時(shí)遇到一個(gè)版本兼容問(wèn)題,通過(guò) npm install vue-router --save 命令安裝會(huì)提示版本不兼容臭增,如下效果

圖片.png

提示版本不兼容懂酱,如果通過(guò)控制臺(tái)提示執(zhí)行 npm install vue-router --save --forcenpm install vue-router --save --legacy-peer-deps 可以安裝 vue-router,但是在 Vue 項(xiàng)目中使用時(shí)會(huì)有無(wú)法正確引入的異常

圖片.png

因?yàn)槟J(rèn)安裝的 vue-router 是4.0大版本和現(xiàn)在的 vue 版本不兼容誊抛,要么升級(jí) vue, 要么降級(jí) vue-router列牺,公司前端團(tuán)隊(duì)技術(shù)棧定的 Vue2.0 版本,果斷降級(jí) vue-router, 安裝時(shí) vue-router 時(shí)指定一個(gè)3.0的版本就行了, 執(zhí)行 npm install vue-router@3.0.2 --save 命令即可拗窃。

子應(yīng)用接入 qiankun

src 目錄創(chuàng)建 public-path.js 文件瞎领,如果項(xiàng)目 lint 校驗(yàn)不通過(guò)需要添加 /* eslint-disable */

/* eslint-disable */
if (window.__POWERED_BY_QIANKUN__) {
  __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__;
}

修改 main.js 文件, 引入 public-path, 添加 qiankun 配置

import './public-path'
import Vue from 'vue'
import App from './App.vue'
import routes from './router'
import VueRouter from 'vue-router'

import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css';
Vue.use(ElementUI)


Vue.config.productionTip = false

let router = null
let instance = null

function render(props = {}) {
  const { container } = props
  router = new VueRouter({
    base: window.__POWERED_BY_QIANKUN__ ? '/app-vue/' : '/',
    mode: 'history',
    routes
  })

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

// 獨(dú)立運(yùn)行
if (!window.__POWERED_BY_QIANKUN__) {
  console.log('111')
  render()
}


// qiankun 鉤子函數(shù)
export async function boostrap(){
  console.log('[vue] vue app bootstraped')
}

export async function mount(props) {
  console.log('[vue] props from main framework', props)
  render(props)
}

export async function unmount() {
  instance.$destory();
  instance.$el.innerHTML = '';
  instance = null;
  router = null;
}


// main.js 原始寫(xiě)法
// new Vue({
//   router,
//   render: h => h(App),
// }).$mount('#app')

修改 vue.config.js 文件中的打包配置

const { name } = require('./package.json');
module.exports = {
  devServer: {
    headers: {
      'Access-Control-Allow-Origin': '*',
    },
  },
  configureWebpack: {
    output: {
      library: `${name}-[name]`,
      libraryTarget: 'umd', // 把微應(yīng)用打包成 umd 庫(kù)格式
      jsonpFunction: `webpackJsonp_${name}`,
    },
  },
};

// 原始寫(xiě)法
// const { defineConfig } = require('@vue/cli-service')
// module.exports = defineConfig({
//   transpileDependencies: true
// })

這時(shí)子應(yīng)用的配置就添加好了

注意

Vue 子應(yīng)用的 @vue/cli-xxx 依賴(lài)不能為 5.0 版本,當(dāng)前配置下導(dǎo)致無(wú)法單獨(dú)運(yùn)行子應(yīng)用随夸。如果是安裝的最新 vue-cli 腳手架創(chuàng)建的項(xiàng)目最好看一下 @vue/cli-xxx 相關(guān)版本九默。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市宾毒,隨后出現(xiàn)的幾起案子驼修,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乙各,死亡現(xiàn)場(chǎng)離奇詭異墨礁,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)耳峦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)恩静,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人妇萄,你說(shuō)我怎么就攤上這事蜕企∫Ш桑” “怎么了冠句?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)幸乒。 經(jīng)常有香客問(wèn)我懦底,道長(zhǎng),這世上最難降的妖魔是什么罕扎? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任聚唐,我火速辦了婚禮,結(jié)果婚禮上腔召,老公的妹妹穿的比我還像新娘杆查。我一直安慰自己,他們只是感情好臀蛛,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布亲桦。 她就那樣靜靜地躺著,像睡著了一般浊仆。 火紅的嫁衣襯著肌膚如雪客峭。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,842評(píng)論 1 290
  • 那天抡柿,我揣著相機(jī)與錄音舔琅,去河邊找鬼。 笑死洲劣,一個(gè)胖子當(dāng)著我的面吹牛备蚓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播囱稽,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼郊尝,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了粗悯?” 一聲冷哼從身側(cè)響起虚循,我...
    開(kāi)封第一講書(shū)人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后横缔,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體铺遂,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年茎刚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了襟锐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡膛锭,死狀恐怖粮坞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情初狰,我是刑警寧澤莫杈,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站奢入,受9級(jí)特大地震影響筝闹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜腥光,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一关顷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧武福,春花似錦议双、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至界睁,卻和暖如春觉增,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背翻斟。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工逾礁, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人访惜。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓嘹履,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親债热。 傳聞我的和親對(duì)象是個(gè)殘疾皇子砾嫉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容