micro-app 基本使用(三)

1,350 阅读4分钟

        在上一篇章中,我们介绍了micro-app提供的一部分功能,接下来继续介绍提供的剩余功能。

预加载

        通常来说,micro-app只有用户在访问对应的子应用时,才会加载渲染资源,并且子应用的资源通常都是较为庞大的,这样就导致首屏渲染时间长,用户体验较差。

        micro-app提供了预加载功能,当浏览器空闲时,就可加载尚未渲染的应用资源并缓存,这样就可以降低首屏渲染时间,提升用户体验。

        可通过 microApp.preFetch(Array<app>|Function=>Array<app>)实现,使用方式如下:

import microApp from '@micro-zoe/micro-app'

// 方式一
microApp.preFetch([
  { name: 'my-app', url: 'xxx' }
])

// 方式二
microApp.preFetch(() => [
  { name: 'my-app', url: 'xxx' }
])

// 方式三
microApp.start({
  preFetchApps: [
    { name: 'my-app', url: 'xxx' }
  ],
  // 函数类型
  // preFetchApps: () => [
  //   { name: 'my-app', url: 'xxx' }
  // ],
})

keep-alive

        默认情况下,micro-app在切换应用时,会进行销毁。如果我们想要保留应用的状态以及提升重复渲染的性能,可以开启 keep-alive 达到这样的效果。

基本使用

        具体使用如下所示:

<template>
  <div>
    <h1>子应用1</h1>
    <micro-app 
      name='app1'
      url='http://localhost:8081/'
      @unmount="unmountHandle"
      keep-alive
    />
  </div>
</template>

<script>

export default {
  name: 'AppOne',
  data() {
    return {
    }
  },
  methods: {
    unmountHandle() {
      console.log('app1 被销毁了');
    }
  }
}
</script>

<style lang="less">

</style>

image.png

        可以看到,在切换应用时,控制台并没有输出app1 被销毁了。所以可以keep-alive的应用不会被真正卸载,也不会触发 unmount 事件。

        micro-app为开启keep-alive的应用提供了三个新的生命周期函数,用来供用户回调。

<template>
  <div>
    <h1>子应用1</h1>
    <micro-app 
      name='app1'
      url='http://localhost:8081/'
      @afterhidden="afterhidden"
      @beforeshow="beforeshow"
      @aftershow="aftershow"
      keep-alive
    />
  </div>
</template>

<script>

export default {
  name: 'AppOne',
  data() {
    return {
    }
  },
  methods: {
    unmountHandle() {
      console.log('app1 被销毁了');
    },
    afterhidden() {
      console.log('已卸载');
    },
    beforeshow () {
      console.log('即将重新渲染,初始化时不执行');
    },
    aftershow () {
      console.log('已经重新渲染,初始化时不执行');
    },
  }
}
</script>

<style lang="less">

</style>
  • 第一次渲染 app-1

image.png

  • 切换应用,触发 afterhidden 函数

image.png

  • 再次渲染 app-1

image.png

子应用

        keep-alive模式下,在子应用卸载、重新渲染时,micro-app都会向子应用发送名为appstate-change的自定义事件,子应用可以通过监听该事件获取当前状态,状态值可以通过事件对象属性e.detail.appState获取。

// micro-app-1/main.js

// 监听keep-alive模式下的应用状态
window.addEventListener('appstate-change', function (e) {
  if (e.detail.appState === 'afterhidden') {
    console.log('app1 已卸载')
  } else if (e.detail.appState === 'beforeshow') {
    console.log('app1 即将重新渲染')
  } else if (e.detail.appState === 'aftershow') {
    console.log('app1 已经重新渲染')
  }
});

image.png

路由

路由配置

路由类型约束

  • 1、基座是hash路由,子应用也必须是hash路由
  • 2、基座是history路由,子应用可以是hash或history路由

基础路由

        通常基座应用和子应用各有一套路由系统,为了防止冲突,基座需要分配一个路由给子应用,称之为基础路由,子应用可以在这个路由下渲染,但不能超出这个路由的范围,这就是基础路由的作用。

        基座应用中通过设置 <micro-app>baseroute属性下发,子应用通过window.__MICRO_APP_BASE_ROUTE__获取此值并设置基础路由。

        可参考如下更多内容

应用跳转

        每个应用的路由实例都是不同的,应用的路由实例只能控制自身,无法影响其它应用,包括基座应用无法通过控制自身路由影响到子应用。

        倘若我们在 app1 中有如下的路由配置。 image.png

        正常访问页面则是通过如下方式。

image.png

        如果我们想在基座中通过侧边栏去访问的话,不管是通过编程式导航还是声明式,因为路由实例不同,所以是没办法实现跳转的。

image.png

        为此,micro-app提供了如下方式来进行应用跳转

// micro-app-base/App.vue
<template>
  <div id="app">
    <section class="aside">
      <p><router-link to="one">应用一</router-link></p>
      <p class="app-item"><a @click="jump('app1', 'pageOne')">页面1</a></p>
      <p class="app-item"><a @click="jump('app1', 'pageTwo')">页面2</a></p>
      <p><router-link to="two">应用二</router-link></p> 
    </section>
    <section class="main">
      <router-view></router-view>
    </section>
  </div>
</template>

<script>

import microApp from '@micro-zoe/micro-app'

export default {
  name: 'App',
  methods: {
    jump(appName, path) {
      microApp.setData(appName, { path });
    }
  }
}
</script>

// micro-app-1/main.js

// 监听基座下发的数据变化
window.microApp.addDataListener((data) => {
  console.log(data);
  // 当基座下发跳转指令时进行跳转
  if (data.path) {
    router.push(data.path)
  }
})

image.png

        如此便完成了路由跳转功能。

总结

        以上便是micro-app提供的常用功能,更多功能可参考官方文档。

        下一篇文章我们将总结对比一下micro-appiframe的异同。