乾坤-vue应用实例

乾坤-vue应用实例

1.前期准备工作
1.1 创建主应用

  1) vue 新建主应用

vue create qiankun-main

  2) 创建src/components/father.vue

<template>
     <div>我是father</div>
</template>

<script>
export default {
  name: 'Father'
}
</script>
<style scoped>

</style>

  3) src/router/index.js中添加路由信息

import Vue from 'vue'
import VueRouter from 'vue-router'

Vue.use(VueRouter)

const routes = [
  {
    path: '/',
    redirect: '/father'
  },
  {
    path: '/father',
    name: 'Father',
    component: () => import(/* webpackChunkName: "about" */ '@/components/Father')
  }

]

const router = new VueRouter({
  mode: 'history',
  routes
})

export default router

  4) 在main.js中引入路由

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

  app.vue和index.html 里面根id也要是base-app
  1. app.vue

<template>
  <div class="app" id="base-app">
  </div>
</template>

  2. index.html

  <div id="base-app"></div>

  5) 在项目根目录下新建vue.config.js,添加内容如下

module.exports = {
  devServer: {
    port: 8085,
    headers: {
      'Access-Control-Allow-Origin': '*' // 重点1: 允许跨域访问子应用页面
    }
  }
}

  6) 修改app.vue中的内容,如下:

<template>
  <div class="app" id="base-app">
    <span><router-link to="/">点击跳转到父页面</router-link></span>
    <span><router-link to="/vue">点击跳转到子页面</router-link></span>
    <router-view />
    <div id="vue"></div><!-- 重点2:子应用容器 id -->
  </div>
</template>

  7) 测试:运行程序后,浏览器打开本地http://localhost:8085/father,能成功显示father.vue页面的内容。结果如下:
在这里插入图片描述

1.2 创建子应用

  1) 新建子应用

vue create qiankun-vue-child

  2) 创建src/components/child.vue,内容如下:

<template>
  <div >
    我是子页面
  </div>
</template>

<script>
export default {
  name: 'Child',
  props: {
    msg: String
  }
}
</script>
<style scoped>

</style>

  3) src/router/index.js中添加路由信息,内容如下:

import Vue from 'vue'
import VueRouter from 'vue-router'
import '../public-path'
Vue.use(VueRouter)

const routes = [
  { path: '/', redirect: '/child' },
  { path: '/child', component: () => import('../components/Child') }
]

const router = new VueRouter({
  // 有些时候我们希望直接启动微应用从而更方便的开发调试,你可以使用这个全局变量来区分当前是否运行在 qiankun 的主应用的上下文中
  base: window.__POWERED_BY_QIANKUN__ ? '/vue' : '/', // 重点4
  mode: 'history', // 重点5
  routes
})

export default router

  4)在main.js中引入路由,内容如下:

import router from "./router"
Vue.use(Router)
new Vue({
    router,
    render: h => h(App),
}).$mount('#app')

  5)在项目根目录下新建vue.config.js,添加内容如下:

const { name } = require('./package')
module.exports = {
  devServer: {
    port: 8083, // 重点6
    headers: { // 重点7:同重点1,允许子应用跨域
      'Access-Control-Allow-Origin': '*'
    }
  },
  // 自定义webpack配置
  configureWebpack: {
    output: {
      library: `${name}-[name]`,
      libraryTarget: 'umd', // 把子应用打包成 umd 库格式
      jsonpFunction: `webpackJsonp_${name}`
    }
  }
}

  6)修改app.vue中的内容,如下:

<template>
  <div class="app">
    我是子应用
    <router-view/>
  </div>
</template>

  7)测试:运行程序后,浏览器打开本地http://localhost:8083/child,能成功显示child.vue页面的内容。结果如下:
在这里插入图片描述

2.乾坤简单配置步骤
2.1 主应用配置

  1) 安装乾坤

$ yarn add qiankun # 或者 npm i qiankun -S

  2) 在主应用入口文件src/main.js中注册子应用

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import { registerMicroApps, start } from 'qiankun'
Vue.config.productionTip = false

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

// 在主应用中注册子应用
registerMicroApps([{
  name: 'vue app',
  entry: '//localhost:8083', // 重点8:对应重点6
  container: '#vue', // 重点9:对应重点2
  activeRule: '/vue', // 重点10:对应重点4
  props: {
    data: 'child子应用'
  }
}]
)
// 启动
start()

  3) 主应用可以给子应用传值。

  通过props传递

registerMicroApps([{
  name: 'vue app',
  entry: '//localhost:8083', // 重点8:对应重点6
  container: '#vue', // 重点9:对应重点2
  activeRule: '/vue', // 重点10:对应重点4
  props: {
    data: 'child子应用'
  }
}]

  子应用可以在生命周期函数通过props接收数据

export async function bootstrap (props) {
  console.log('data bootstrap', props)
}
export async function mount (props) {
  console.log('乾坤子应用容器加载完成,开始渲染 child')
  console.log('props from main mount', props)
  render(props)
}
2.2 子应用配置

  1) 在src目录新增public-path.js,内容如下:

if (window.__POWERED_BY_QIANKUN__) {
  __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__
}

  2) 在main.js中配置如下:

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

Vue.config.productionTip = false

let instance = null
function render (props = {}) {
  const { container } = props
  instance = new Vue({
    router,
    render: h => h(App)
  }).$mount(container ? container.querySelector('#app') : '#app') // 为了避免根id#app与其他DOM冲突,需要限制查找范围
}

if (!window.__POWERED_BY_QIANKUN__) {
  render()
}

export async function bootstrap (props) {
  console.log('data bootstrap', props)
}
export async function mount (props) {
  console.log('乾坤子应用容器加载完成,开始渲染 child')
  console.log('props from main mount', props)
  render(props)
}
export async function unmount () {
  instance.$destroy()
  instance.$el.innerHTML = ''
  instance = null
}

说明:子应用的四个周期函数:

bootstrap:bootstrap 只会在微应用初始化的时候调用一次,下次微应用重新进入时会直接调用 mount 钩子,不会再重复触发 bootstrap。通常我们可以在这里做一些全局变量的初始化,比如不会在 unmount 阶段被销毁的应用级别的缓存等。
mount:应用每次进入都会调用 mount 方法,通常我们在这里触发应用的渲染方法。
unmount:应用每次 切出/卸载 会调用的方法,通常在这里我们会卸载微应用的应用实例。
update:可选生命周期钩子,仅使用 loadMicroApp 方式加载微应用时生效。
### 如何配置 Nginx 部署 Vue2 和 Qiankun 微前端项目 #### 使用 Nginx 进行微前端应用部署 对于基于 Vue2 构建并集成 Qiankun 实现的微前端架构的应用程序,在将其部署到生产环境时,通常会利用 Nginx 来处理静态资源分发以及反向代理请求。为了使这些应用程序能够正常工作,特别是在采用 `history` 路由模式的情况下,需要正确设置 Nginx 的配置文件。 #### 修改 Nginx 配置支持 History Mode 当使用 Vue Router 的 history 模式时,所有的 URL 请求都应被重定向至 index.html 文件,除非它们指向实际存在的静态资源(如图片、CSS 或 JavaScript)。这可以通过调整 Nginx 中 location 块内的 try_files 指令来实现: ```nginx server { listen 80; server_name localhost; root /path/to/vue-app/dist; location / { try_files $uri $uri/ /index.html; } # 对于 microApp 开头的子应用路径特别处理 location ~ ^/microApp- { proxy_pass http://backend_server_address; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } ``` 上述配置确保了即使用户直接访问某个特定页面地址也不会因为找不到对应文件而报错,而是返回单页应用入口 HTML 文档让其接管后续路由解析[^1]。 #### 整合 Qiankun 插件完成多框架协作 为了让多个独立开发的小型 SPA (Single Page Application) 可以无缝嵌入同一个主站之中形成统一界面体验,可以借助 qiankun 提供的能力来进行加载其他 vue 子模块作为远程组件的方式加入进来。安装依赖之后创建相应的注册表用于声明哪些位置会被替换成来自不同源的服务端渲染结果或者纯客户端脚本引入形式的内容[^2]。 通过以上方法即可实现在 nginx 上成功托管包含有 qiankun 支持特性的 vue2 应用实例,并且保持良好的用户体验不受影响。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值