qiankun前端微服务 demo项目


一、创建项目

本文使用react项目作为主应用。一个vue项目、一个react项目作为微应用。

1.创建主应用react项目:base,输入cmd命令

create-react-app base

2.创建微应用1 vue项目:m-vue,输入cmd命令

vue create m-vue

如图所示选择手动配置
在这里插入图片描述
接下来的很多选择如图
在这里插入图片描述3.创建微应用2 react项目:m-react,输入cmd命令

create-react-app m-react

二、主应用

1.先安装好react-router-dom和qiankun
输入cmd命令

$ yarn add react-router-dom 或 npm i react-router-dom
$ yarn add qiankun # 或者 npm i qiankun -S

2.在src文件夹下新建registerApp.js文件,注册微应用并启动:

import { registerMicroApps, start } from 'qiankun';

const loader = (loading) =>{
  console.log(loading)
}

registerMicroApps([
    {
      name: 'm-vue',
      entry: '//localhost:20000',
      container: '#container',
      activeRule: '/vue',
      loader
    },
    {
      name: 'm-react',
      entry: '//localhost:30000',
      container: '#container',
      activeRule: '/react',
      loader
    }
  ],{
    beforeLoad:()=>{
      console.log("加载前")
    },
    beforeMount:()=>{
      console.log("挂载前")
    }
  });
  
  // 启动 qiankun
  start();

3.在index.js文件中引入registerApp.js

import './registerApp.js';

4.修改App.js文件

import './App.css';
import{BrowserRouter as Router,Link} from 'react-router-dom'

function App() {
  return (
    <div className="App">
      <Router>
        <Link to="/vue">vue应用</Link>
        <Link to="/react">react应用</Link>
      </Router>
      {/**切换导航,将微应用渲染到container容器中 */}
      <div id="container"></div>
    </div>
  );
}

export default App;

三、vue微应用

1.在 src 目录新增 public-path.js:

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

2.在src文件夹下的router文件夹下的index.js文件中的顶部引入public-path.js:

import '../public-path'
import { createRouter, createWebHashHistory } from 'vue-router'
import HomeView from '../views/HomeView.vue'

const routes = [
  {
    path: '/',
    name: 'home',
    component: HomeView
  },
  {
    path: '/about',
    name: 'about',
    // route level code-splitting
    // this generates a separate chunk (about.[hash].js) for this route
    // which is lazy-loaded when the route is visited.
    component: () => import(/* webpackChunkName: "about" */ '../views/AboutView.vue')
  }
]


export default routes

在顶部引入

3.入口文件 main.js 修改,为了避免根 id #app 与其他的 DOM 冲突,需要限制查找范围。

import { createApp } from 'vue'
import { createRouter, createWebHistory } from 'vue-router';
import App from './App.vue'
import routes from './router'

let history;
let router;
let app;

function render(props = {}) {
    history = createWebHistory('/vue');
    router = createRouter({
        history,
        routes
    });
    app = createApp(App);
    let { container } = props;
    app.use(router).mount(container ? container.querySelector('#app') : "#app")
}

// 独立运行时
if (!window.__POWERED_BY_QIANKUN__) {
    render();
}

export async function bootstrap() {
    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() {
    console.log('[vue] vue app unmount');
    history = null;
    app = null;
    router = null;
}

4.打包配置修改(vue.config.js):

const { name } = require('./package');

module.exports = {
  lintOnSave: false,
  devServer: {
    headers: {
      'Access-Control-Allow-Origin': '*',
    },
  },
  configureWebpack: {
    output: {
      library: `${name}-[name]`,
      libraryTarget: 'umd', // 把微应用打包成 umd 库格式
    },
  },
};

四、react微服务

以 create-react-app 生成的 react 项目为例,搭配 react-router-dom 5.x。
1.在 src 目录新增 public-path.js:

/* global __webpack_public_path__:writable */
if (window.__POWERED_BY_QIANKUN__) {
    __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__;
  }

2.入口文件 index.js 修改,并在顶部引入public-path.js。为了避免根 id #root 与其他的 DOM 冲突,需要限制查找范围。

import './public-path';
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';


// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();

function render(props = {}) {
  const { container } = props;
  ReactDOM.render(<App />, container ? container.querySelector('#root') : document.querySelector('#root'));
}

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

export async function bootstrap() {
  console.log('[react16] react app bootstraped');
}

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

export async function unmount(props) {
  const { container } = props;
  ReactDOM.unmountComponentAtNode(container ? container.querySelector('#root') : document.querySelector('#root'));
}

4.修改 webpack 配置
安装插件 @rescripts/cli

npm i -D @rescripts/cli

根目录新增 .rescriptsrc.js:

const { name } = require('./package');

module.exports = {
  webpack: (config) => {
    config.output.library = `${name}-[name]`;
    config.output.libraryTarget = 'umd';
    
    return config;
  },

  devServer: (_) => {
    const config = _;

    config.headers = {
      'Access-Control-Allow-Origin': '*',
    };

    return config;
  },
};

修改 package.json:

-   "start": "react-scripts start",
+   "start": "rescripts start",
-   "build": "react-scripts build",
+   "build": "rescripts build",
-   "test": "react-scripts test",
+   "test": "rescripts test",
-   "eject": "react-scripts eject"

根目录新增 .env:

PORT = 30000
WDS_SOCKET_PORT = 30000
Qiankun 是一个微前端框架,可以帮助我们将多个独立的前端应用整合到一个主应用中,实现多个应用的共存和互通。如果你想在 Vue2 的项目中使用 Qiankun,需要按照以下步骤操作: 1. 安装 qiankun: ``` npm install qiankun --save ``` 2. 在主应用中创建一个容器组件: 在主应用中创建一个容器组件,用于渲染子应用的内容。该组件可以使用 `qiankun` 提供的 `VueRender` 组件。 ``` <template> <div> <h1>Vue2 主应用</h1> <div id="subapp-viewport"></div> <vue-render ref="subapp" /> </div> </template> <script> import { VueRender } from 'qiankun' export default { name: 'App', components: { VueRender }, mounted() { // 注册子应用 registerMicroApps([ { name: 'vue2_subapp', entry: 'http://localhost:8081', // 子应用的地址 container: '#subapp-viewport', activeRule: '/subapp' // 子应用的激活规则 } ]) // 启动应用 start() } } </script> ``` 3. 在子应用中添加导出函数: 在子应用的入口文件中,需要导出一个函数,用于初始化子应用。该函数需要返回一个 Promise 对象,用于在子应用加载完成后通知主应用。 ``` import Vue from 'vue' import App from './App.vue' import router from './router' Vue.config.productionTip = false // 导出初始化函数 export async function bootstrap() { console.log('Vue2 子应用启动') } export async function mount() { new Vue({ router, render: h => h(App) }).$mount('#app') } export async function unmount() { console.log('Vue2 子应用卸载') } ``` 4. 在子应用中添加 `qiankun` 配置: 在子应用的入口文件中,需要添加 `qiankun` 的配置,用于告诉主应用如何加载子应用。 ``` import { registerMicroApps, start } from 'qiankun' // 注册子应用 registerMicroApps([ { name: 'vue2_subapp', entry: 'http://localhost:8081', // 子应用的地址 container: '#app', // 子应用的容器 activeRule: '/subapp', // 子应用的激活规则 props: {} // 子应用的 props } ]) // 启动应用 start() ``` 5. 启动主应用和子应用: 启动主应用和子应用即可。 以上是在 Vue2 中使用 Qiankun 的简单示例,具体实现还需要根据自身业务进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值