微前端-qiankun:nuxt2 接入 nuxt2

简介: 微前端-qiankun:nuxt2 接入 nuxt2

一、背景

主应用:nuxt2、webpack

子应用:nuxt2、webpack

二、代码-配置主应用

2.1、安装

yarn add qiankun

2.2、/plugins/qiankun.js

export default async ({ store }) => {
    await store.dispatch('getMenus')
}

2.3、nuxt.config.js

export default {
  // Disable server-side rendering: https://go.nuxtjs.dev/ssr-mode
  ssr: false,
  // Global page headers: https://go.nuxtjs.dev/config-head
  head: {
    title: 'qiankun-base-main-nuxt2',
    htmlAttrs: {
      lang: 'en'
    },
    meta: [
      { charset: 'utf-8' },
      { name: 'viewport', content: 'width=device-width, initial-scale=1' },
      { hid: 'description', name: 'description', content: '' },
      { name: 'format-detection', content: 'telephone=no' }
    ],
    link: [
      { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }
    ]
  },
  // Global CSS: https://go.nuxtjs.dev/config-css
  css: [
    'element-ui/lib/theme-chalk/index.css'
  ],
  // Plugins to run before rendering page: https://go.nuxtjs.dev/config-plugins
  plugins: [
    '@/plugins/element-ui',
    { src: '~/plugins/qiankun.js', ssr: false },
  ],
  // Auto import components: https://go.nuxtjs.dev/config-components
  components: true,
  // Modules for dev and build (recommended): https://go.nuxtjs.dev/config-modules
  buildModules: [
    // https://go.nuxtjs.dev/eslint
    '@nuxtjs/eslint-module'
  ],
  // Modules: https://go.nuxtjs.dev/config-modules
  modules: [
    // https://go.nuxtjs.dev/axios
    '@nuxtjs/axios'
  ],
  // Axios module configuration: https://go.nuxtjs.dev/config-axios
  axios: {
    // Workaround to avoid enforcing hard-coded localhost:3000: https://github.com/nuxt-community/axios-module/issues/308
    baseURL: '/'
  },
  // Build Configuration: https://go.nuxtjs.dev/config-build
  build: {
    transpile: [/^element-ui/]
  }
}

2.4、layouts/default.vue

<template>
  <div id="app-wrapper">
    <div id="content-wrapper" class="mui--text-center">
      <div>default</div>
      <div v-if="qiankunStarted" id="subapp"></div>
      <nuxt v-if="!qiankunStarted" />
    </div>
  </div>
</template>
<script>
import { mapState } from 'vuex'
import { registerMicroApps, start } from 'qiankun'
export default {
  data () {
    return {
      qiankunStarted: null
    }
  },
  computed: {
    ...mapState({
      apps: state => state.apps || [],
      sdk: state => state.sdk || null
    })
  },
  mounted () {
    this.init()
    this.qiankunStarted = window.qiankunStarted
  },
  methods: {
    init () {
      registerMicroApps(this.apps)
      if (!window.qiankunStarted) {
        window.qiankunStarted = true
        start()
      }
    }
  }
}
</script>
<style>
</style>

2.5、store/index.js

import { Message } from 'element-ui'
import {
  initGlobalState
} from 'qiankun'
const TYPES = {
  INIT_APPS: 'init_apps'
}
export const state = () => ({
  apps: [],
  name: 'main',
  sdk: null
})
export const mutations = {
  [TYPES.INIT_APPS] (state, apps){
    // 初始化全局变量
    const actions = initGlobalState({
      name: state.name
    })
    // 使用 sdk 方式进行 父子应用通信, 这里大家可以根据自己项目进行增加删除
    const sdk = {
      globalState: actions,
      toast: (...args) => {
        Message(...args)
      },
      router: {
        push: (...args) => {
          this.$router.push(...args)
        },
        replace: (...args) => {
          this.$router.replace(...args)
        },
        resolve: (...args) => {
          this.$router.resolve(...args)
        }
      },
      store: {
        dispatch: (...args) => {
          this.dispatch(...args)
        },
        commit: (...args) => {
          this.commit(...args)
        },
        state: { ...this.state }
      },
      name: state.name
    }
    // 处理 apps 列表
    apps = apps.map((item) => {
      return {
        ...item,
        container: '#subapp',
        props: {
          sdk
        }
      }
    })
    // 处理路由表
    const routes = []
    apps.forEach((item, i) => {
      if (Array.isArray(item.activeRule)) {
        routes.push(...item.activeRule.map(i => ({
          path: `${i.slice(1)}`,
          name: `${item.name}${i}`,
          component: () => import('@/pages/spa.vue').then(m => m.default || m)
        })))
        return false
      }
      routes.push({
        path: `${item.activeRule.slice(1)}`,
        name: `${item.name}-i`,
        component: () => import('@/pages/spa.vue').then(m => m.default || m)
      })
    })
    // 动态增加路由, 这里要注意 404 页面不能直接写在 pages 中
    // 不然匹配的时候会根据顺序匹配到 * 就直接返回了 从而匹配不到我们后续添加的动态路由
    // console.log(routes)
    this.$router.addRoutes([].concat(...routes,
      {
        path: '404',
        name: 404,
        component: () => import('~/layouts/error.vue').then(m => m.default || m)
      }
    ))
    state.apps = apps
    state.sdk = sdk
  }
}
export const actions = {
  async getMenus ({ commit }) {
    const { payload } = await getMenus()
    commit(TYPES.INIT_APPS, payload)
  }
}
function getMenus () {
  return {
    code: 200,
    payload: [
      {
        name: 'subapp',
        container: '#subapp',
        activeRule: '/about',
        entry: '//localhost:3005', // 解决不同服务器和域名
        props: {
          msg: '我是主应用main' // 主应用向微应用传递参数
        }
      }
    ],
    message: 'success'
  }
}

三、接入子应用

微前端-qiankun:vue3-vite 接入 nuxt2_snow@li的博客-CSDN博客

四、访问qiankun主应用,访问成功

五、欢迎交流指正,关注我,一起学习。

相关文章
|
11月前
|
缓存 资源调度 前端开发
微前端-qiankun:vue3-vite 接入 vue3、nuxt3、vue2、nuxt2等子应用
微前端-qiankun:vue3-vite 接入 vue3、nuxt3、vue2、nuxt2等子应用
923 0
|
1月前
|
前端开发 JavaScript 容器
第九章(应用场景篇)Qiankun微前端深度解析与实践教程
第九章(应用场景篇)Qiankun微前端深度解析与实践教程
|
1月前
|
资源调度 前端开发 JavaScript
手把手带你实现简单的微前端qiankun搭建
手把手带你实现简单的微前端qiankun搭建
124 0
|
10月前
|
前端开发 JavaScript
微前端使用qiankun实现,react主应用同时兼顾react,vue3,umi子应用
微前端使用qiankun实现,react主应用同时兼顾react,vue3,umi子应用
531 0
|
11月前
|
前端开发 JavaScript 容器
微前端----qiankun
qiankun 是一个基于 single-spa 的微前端实现库,换句话说就是对single-spa进行了封装得到qiankun。 qiankun就是将一个大应用拆分成好多小项目,qiankun解决了我们协同开发的一些问题,其次更方便于我们进行更新代码 。
464 0
|
11月前
|
前端开发
微前端-qiankun:vue3-vite 接入 vue3-vite
微前端-qiankun:vue3-vite 接入 vue3-vite
554 0
|
11月前
|
前端开发
微前端-qiankun:vue3-vite 接入 vue3-webpack
微前端-qiankun:vue3-vite 接入 vue3-webpack
275 0
|
11月前
|
前端开发 JavaScript
前端架构成长之路——微前端系列(二)之qiankun框架实战
用微前端架构去对某个古老项目进行框架升级
528 0
|
监控 前端开发 Devops
微前端热度不再?qiankun 作者有话说
微前端热度不再?qiankun 作者有话说
246 0
|
19天前
|
JSON 前端开发 JavaScript
前端Ajax、Axios和Fetch的用法和区别笔记
前端Ajax、Axios和Fetch的用法和区别笔记
25 2