react16接入微前端到vue项目总结

本文总结了如何在Vue主应用中接入React微前端的步骤,包括Vue主应用的配置,如URL路径与activeRule的匹配,设置路由承载微应用,处理微应用的子路由问题,以及在React微应用端的改造,如basename的调整,使用umd格式打包和react-scripts的安装等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.vue主应用配置

// mian.js
const apps = [
    {
        name: 'react16',
        entry: '//localhost:3888', // 默认会加载这个html 解析里面的js 动态的执行 (子应用必须支持跨域)fetch
        container: '#react16',
        activeRule: '/rfmtools/#/react16'
    }
];
registerMicroApps(apps); // 注册应用
start(); //

1.1 url路径要和activeRule匹配上
在这里插入图片描述
1.2 主应用开个路由承载微应用
在这里插入图片描述
1.3 注意官网介绍 接入的微应用页面有子路由 要加*
在这里插入图片描述
1.4 开一个承载子应用的页面
在这里插入图片描述
命令改造

"scripts": {
        "install-all": "npm-run-all --serial install:*",
        "install:vue3": "cd qiankun/vue3 && yarn install",
        "install:react16": "cd qiankun/react16 && yarn install",
        "start": "npm-run-all --parallel start:*",
        "start:hf": "vue-cli-service serve",
        "start:vue3": "cd qiankun/vue3 && yarn serve",
        "start:react16": "cd qiankun/react16 && yarn dev",
        "build": "npm-run-all --parallel build:*",
        "dev": "vue-cli-service serve",
        "build:hf": "vue-cli-service build",
        "build:vue3": "cd qiankun/vue3 && yarn build",
        "build:react16": "cd qiankun/react16 && yarn build",
   }

2.微应用 react项目接入

// index.tsx
/// <reference path="index.d.ts" />
import './public-path';
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import * as serviceWorker from './serviceWorker';

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

function storeTest(props) {
    props.onGlobalStateChange(
        (value, prev) =>
            console.log(`[onGlobalStateChange - ${props.name}]:`, value, prev),
        true
    );
    props.setGlobalState({
        ignore: props.name,
        user: {
            name: props.name
        }
    });
}

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);
    storeTest(props);
    render(props);
}

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

// If you want your app to work offline and load faster, you can change
// unregister() to register() below. Note this comes with some pitfalls.
// Learn more about service workers: https://bit.ly/CRA-PWA
serviceWorker.unregister();

2.1 app.sx 改造下basename

basename={
            window.__POWERED_BY_QIANKUN__ ? '/rfmtools/#/react16' : '/'
        }
/*
 * @description:
 * @author: steve.deng
 * @Date: 2020-12-14 17:28:27
 * @LastEditors: steve.deng
 * @LastEditTime: 2020-12-28 17:02:41
 */
import React, { lazy, Suspense } from 'react';
import { BrowserRouter as Router, Link, Route, Switch } from 'react-router-dom';
import { Divider } from 'antd';

import 'antd/dist/antd.min.css';
import './App.css';

import LibVersion from './components/LibVersion';
import HelloModal from './components/HelloModal';

import Home from './pages/Home';
const About = lazy(() => import('./pages/About'));

const RouteExample: React.FC = () => {
    return (
        <Router
            basename={
                window.__POWERED_BY_QIANKUN__ ? '/rfmtools/#/react16' : '/'
            }
        >
            <nav>
                <Link to="/">Home</Link>
                <Divider type="vertical" />
                <Link to="/about">about</Link>
            </nav>
            <Suspense fallback={null}>
                <Switch>
                    <Route path="/" exact component={Home} />
                    <Route path="/about" component={About} />
                </Switch>
            </Suspense>
        </Router>
    );
};

export default function App() {
    return (
        <div className="app-main">
            <LibVersion />
            <HelloModal />
            <Divider />
            <RouteExample />
        </div>
    );
}

// 改造下 .rescriptsrc.js
umd格式打包

/*
 * @description: 改造下 
 * @author: steve.deng
 * @Date: 2020-12-16 14:20:20
 * @LastEditors: steve.deng
 * @LastEditTime: 2020-12-28 17:08:58
 */
const { name } = require('./package');

module.exports = {
    webpack: config => {
        config.output.library = `${name}-[name]`;
        config.output.libraryTarget = 'umd';
        config.output.jsonpFunction = `webpackJsonp_${name}`;
        config.output.globalObject = 'window';
        // config.output.publicPath = '//localhost:3888/';
        config.output.publicPath =
            process.env.NODE_ENV === 'production' ? '/rfmtools_react/' : '/';

        return config;
    },

    devServer: _ => {
        const config = _;
        config.headers = {
            'Access-Control-Allow-Origin': '*'
        };
        config.historyApiFallback = true;
        config.hot = false;
        config.watchContentBase = false;
        config.liveReload = false;

        return config;
    }
};

记得安装react-scripts

package.json
{
    "name": "react16",
    "version": "0.1.0",
    "private": true,
    "scripts": {
        "dev": "rescripts start",
        "build": "rescripts build",
        "test": "rescripts test",
        "eject": "rescripts eject"
    },
    "browserslist": {
        "production": [
            ">0.2%",
            "not dead",
            "not op_mini all"
        ],
        "development": [
            "last 1 chrome version",
            "last 1 firefox version",
            "last 1 safari version"
        ]
    },
    "dependencies": {
        "antd": "^3.25.2",
        "react": "^16.12.0",
        "react-dom": "^16.12.0",
        "react-router-dom": "^5.1.2"
    },
    "devDependencies": {
        "@rescripts/cli": "^0.0.14",
        "@types/node": "^14.14.14",
        "@types/react": "^17.0.0",
        "@types/react-dom": "^17.0.0",
        "react-scripts": "^3.4.1",
        "typescript": "^4.1.3"
    }
}

环境变量

.env

SKIP_PREFLIGHT_CHECK=true
BROWSER=none
PORT=3888
WDS_SOCKET_PORT=3888

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值