qiankun:react18主应用 + 微应用 react18 + vue3

这篇具有很好参考价值的文章主要介绍了qiankun:react18主应用 + 微应用 react18 + vue3。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一:主应用
搭建react项目

npx create-react-app react-qiankun-main

安装Antd

npm install antd –save

在 index.js中引入

import { ConfigProvider } from "antd";
import zhCN from "antd/locale/zh_CN";
import "antd/dist/reset.css";
// ...
root.render(
  <ConfigProvider locale={zhCN}>
    <React.StrictMode>
      <App />
    </React.StrictMode>
  </ConfigProvider>
);

安装react-router :

npm i react-router-dom

在 index.js中引入

import { BrowserRouter } from "react-router-dom";

// …
 <BrowserRouter>
    <ConfigProvider locale={zhCN}>
      <React.StrictMode>
        <App />
      </React.StrictMode>
    </ConfigProvider>
  </BrowserRouter>
  

安装 qiankun :

 npm i qiankun -S

在主应用中注册微应用,在 index.js中引入

// …
import { registerMicroApps, start } from "qiankun";

registerMicroApps([
  {
    name: "react app", // 子应用的名称,必须唯一。
    entry: "//localhost:3004", // 子应用项目本地运行地址
    container: "#lyContainer", //  子应用的容器(子应用嵌入到主项目id为lyContainer的地方)
    activeRule: "/react-app", // 子应用激活时的路由规则(子应用路由)
  },
  {
    name: "vue app",
    entry: "//localhost:5173",
    container: "#lyContainer",
    activeRule: "/vue-app",
  },
]);

start();
// …

注:子应用嵌入到主应用的地方,id要跟index.js下registerMicroApps里面的container设置一致
qiankun:react18主应用 + 微应用 react18 + vue3,vue.js

修改App.js文件,将如下代码放入App.js

import React, { useState } from "react";
import "./App.css";
import {
  MenuFoldOutlined,
  MenuUnfoldOutlined,
  UserOutlined,
  VideoCameraOutlined,
} from "@ant-design/icons";
import { Layout, Menu, Button } from "antd";
import { NavLink } from "react-router-dom";
const { Header, Sider, Content } = Layout;

function App() {
  const [collapsed, setCollapsed] = useState(false);
  return (
    <div className="App">
      <Layout className="layout-container">
        <Sider trigger={null} collapsible collapsed={collapsed}>
          <div className="logo">logo</div>
          <Menu
            theme="dark"
            mode="inline"
            defaultSelectedKeys={["1"]}
            items={[
              {
                key: "1",
                icon: <UserOutlined />,
                label: <NavLink to="/vue-app">vue应用</NavLink>,
              },
              {
                key: "2",
                icon: <VideoCameraOutlined />,
                label: <NavLink to="/react-app">react应用</NavLink>,
              },
            ]}
          />
        </Sider>
        <Layout className="layout-main">
          <Header className="header">
            <Button
              type="text"
              icon={collapsed ? <MenuUnfoldOutlined /> : <MenuFoldOutlined />}
              onClick={() => setCollapsed(!collapsed)}
              className="collapse-btn"
            />
          </Header>
          <Content id="lyContainer" className="layout-content">
            Content
          </Content>
        </Layout>
      </Layout>
    </div>
  );
}

export default App;

修改App.css样式如下:

#root,
.App,
.layout-container {
  width: 100%;
  height: 100%;
}
.logo {
  height: 64px;
  line-height: 64px;
  color: #fff;
  text-align: center;
}
.layout-main {
  overflow-y: auto;
}
.header {
  padding: 0;
  background-color: #fff;
}
.header .collapse-btn {
  font-size: 16px;
  width: 64px;
}
.layout-content{
  padding: 24px;
}


效果如下:
qiankun:react18主应用 + 微应用 react18 + vue3,vue.js
二、react微应用

npx create-react-app react-qiankun-sub
cd react-qiankun-sub
npm start

修改index.html下的id
qiankun:react18主应用 + 微应用 react18 + vue3,vue.js
在src下新建public-path.js,将如下代码放进去

if (window.__POWERED_BY_QIANKUN__) {
  // eslint-disable-next-line no-undef
  __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__;
}

安装react-router :

npm i react-router-dom

设置 history 模式路由的 base,并在index.js中导入public-path.js,修改index.js中代码如下:

import { BrowserRouter } from "react-router-dom";

import "./public-path";

let root = null;
function render(props) {
  const { container } = props;
  root =
    root ||
    ReactDOM.createRoot(
      container
        ? container.querySelector("#subRoot")
        : document.getElementById("subRoot")
    );
  root.render(
    <BrowserRouter
      basename={window.__POWERED_BY_QIANKUN__ ? "/react-app" : "/"}
    >
      <React.StrictMode>
        <App />
      </React.StrictMode>
    </BrowserRouter>
  );
}

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);
}
// https://github.com/kobeyk/micro-app-react-template/blob/main/config-overrides.js
export async function unmount(props) {
  // const { container } = props;
  root.unmount();
  root = null;
}

// 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();

修改webpack配置,安装craco:

npm i @craco/craco

根目录新增 craco.config.js,将如下代码放进去:

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

module.exports = {
  webpack: {
    configure: (webpackConfig) => {
      webpackConfig.output.library = `${name}-[name]`;
      webpackConfig.output.libraryTarget = "umd";
      webpackConfig.output.chunkLoadingGlobal = `webpackJsonp_${name}`;
      return webpackConfig;
    },
  },
  devServer: (devServerConfig) => {
    devServerConfig.historyApiFallback = true;
    devServerConfig.open = false;
    devServerConfig.hot = false;
    devServerConfig.watchFiles = [];
    devServerConfig.headers = {
      "Access-Control-Allow-Origin": "*",
    };
    return devServerConfig;
  },
};

修改package.json里面启动的命令,因为安装了craco

 "scripts": {
    "start": "craco start",
    "build": "craco build",
    "test": "craco test",
    "eject": "react-scripts eject"
  },

qiankun:react18主应用 + 微应用 react18 + vue3,vue.js

三、vue3微应用

npm init vue@latest

qiankun:react18主应用 + 微应用 react18 + vue3,vue.js

cd vue-qiankun
npm install
npm run format
npm run dev

qiankun:react18主应用 + 微应用 react18 + vue3,vue.js
安装vite-plugin-qiankun:

npm i vite-plugin-qiankun

https://www.npmjs.com/package/vite-plugin-qiankun
在vite.config.js加入如下配置



import qiankun from 'vite-plugin-qiankun'

// https://vitejs.dev/config/
export default defineConfig({
  // 生产环境需要指定运行域名作为base
  // base: 'http://xxx.com/'
  plugins: [
    vue(),
    qiankun('vue-app', {
      //  'vue-app' 是子应用名,与主应用注册时保持一致
      useDevMode: true // 如果是在主应用中加载子应用vite,必须打开这个,否则vite加载不成功, 单独运行没影响
    })
  ],
  resolve: {
    alias: {
      '@': fileURLToPath(new URL('./src', import.meta.url))
    }
  },
  server: {
    port: '5173',
    cors: true,
    origin: 'http://localhost:5173',  // 子应用引入到主应用之后,子应用中的图片在主应用下加载不出来、找不到,需要将origin设置成子应用本地运行地址
  }
})

在main.js中修改代码,如下:

import './assets/main.css'

import { createApp } from 'vue'
import { createPinia } from 'pinia'

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

import { renderWithQiankun, qiankunWindow } from 'vite-plugin-qiankun/dist/helper'
import { createRouter, createWebHistory } from 'vue-router'

let router = null
let instance = null
let history = null

function render(props = {}) {
  const { container } = props
  history = createWebHistory(qiankunWindow.__POWERED_BY_QIANKUN__ ? '/vue-app' : '/')
  router = createRouter({
    history,
    routes
  })

  instance = createApp(App)
  instance.use(router)
  instance.use(createPinia())
  instance.mount(container ? container.querySelector('#app') : '#app')
  if (qiankunWindow.__POWERED_BY_QIANKUN__) {
    console.log('我正在作为子应用运行')
  }
}

// some code
renderWithQiankun({
  bootstrap() {
    console.log('bootstrap')
  },
  mount(props) {
    console.log('viteapp mount')
    render(props)
    // console.log(instance.config.globalProperties.$route,333);
  },
  unmount() {
    console.log('vite被卸载了')
    instance.unmount()
    instance._container.innerHTML = ''
    history.destroy() // 不卸载  router 会导致其他应用路由失败
    router = null
    instance = null
  }
})

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

效果如下:

qiankun:react18主应用 + 微应用 react18 + vue3,vue.js
qiankun:react18主应用 + 微应用 react18 + vue3,vue.js

问题:

  1. 应用间的样式隔离:
    在最新的 qiankun 版本中,你也可以尝试通过配置{ sandbox : { experimentalStyleIsolation: true } } 的方式开启运行时的 scoped css 功能,从而解决应用间的样式隔离问题

在主应用的index.js下的start中加入sandbox配置 ,代码如下:


start({ sandbox : { experimentalStyleIsolation: true }});

qiankun:react18主应用 + 微应用 react18 + vue3,vue.js

  1. 主应用中切换到子应用对应的页面,子应用空白,控制台也不报错
    元素检查看主应用中是否有子应用的元素,如果有,那可能是样式原因导致的

下方是我微信公众号的二维码,关于react及其他相关知识点会在公众号上面更新,可以扫码关注以下,有什么问题也可以通过公众号跟我留言哦~
qiankun:react18主应用 + 微应用 react18 + vue3,vue.js文章来源地址https://www.toymoban.com/news/detail-595885.html

到了这里,关于qiankun:react18主应用 + 微应用 react18 + vue3的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微前端-qiankun:vue3-vite 接入 vue3、nuxt3、vue2、nuxt2等子应用

    一、了解qiankun.js qiankun - qiankun 1.1、简单, 任意 js 框架均可使用。微应用接入像使用接入一个 iframe 系统一样简单,但实际不是 iframe。 1.2、完备, 几乎包含所有构建微前端系统时所需要的基本能力,如 样式隔离、js 沙箱、预加载等。解耦,与技术无关。 1.3、生产可用, 已

    2024年02月03日
    浏览(69)
  • qiankun微服务怎么用,怎么实现集成react和vue

    Qiankun 是一个能够帮助开发者实现微前端的框架,它可以支持多种前端框架的混合开发,包括 React、Vue 等。下面我将详细介绍如何使用 Qiankun 实现集成 React 和 Vue。 Qiankun 是一个基于 Single-SPA 的微前端解决方案,它是由阿里巴巴前端团队开发的。Qiankun 提供了一套完整的微前端

    2024年02月13日
    浏览(43)
  • 基于vue3+webpack5+qiankun实现微前端

    一 主应用改造(又称基座改造) 1 在主应用中安装qiankun(npm i qiankun -S)  2 在src下新建micro-app.js文件,用于存放所有子应用。  3 改造vue.config.js,允许跨域访问子应用页面  4 改造main.js   5 在App.vue中写响应跳转子应用(根据自己的项目找对应位置写,不局限于App.vue)   需要注

    2024年02月13日
    浏览(62)
  • qiankun vue子应用升级webpack5问题记录

    升级的方式是使用最新版本的 vue-cli 脚手架,重新创建一个新项目,然后复制 @vue/cli-xxx , vue 相关依赖最新版本到子应用项目 - 核对 babel , eslint 相关配置的变化 - 重新安装依赖,处理出现的相各种异常情况 - 启动项目检查功能是否正常。 本次升级主要是为了使用 webpack5 。 以

    2023年04月26日
    浏览(40)
  • 【几乎最全/全网最长的 2 万 字】前端工程化完整流程:从头搭到尾(vue3 + vite + qiankun + docker + tailwindcss + iview......)

    使用 Vite + Vue3 + Typescript + axios + echarts + pinia + view-ui-plus + vue-router + less + sass + scss + css + tailwindcss + animate.css + vite-svg-loader + postcss + stylelint + eslint + prettier + autoprefixer + commitizen + commitlint + vite-plugin-compression + vite-plugin-qiankun + Docker + nginx.conf…等等插件,带你从 0 开始一步一步搭

    2024年02月12日
    浏览(68)
  • Vue3.2 + TypeScript + Pinia + Vite4 + Element-Plus + 微前端(qiankun) 后台管理系统模板(已开源---显示项目页面截图)

    Wocwin-Admin,是基于 Vue3.2、TypeScript、Vite、Pinia、Element-Plus、Qiankun(微前端) 开源的一套后台管理模板;同时集成了微前端 qiankun也可以当做一个子应用。项目中组件页面使用了Element-plus 二次封装 t-ui-plus 组件,目前已新增fastmock接口。 Link:https://wocwin.github.io/wocwin-admin/ 账号:

    2024年02月08日
    浏览(82)
  • 【React】React18+Typescript+craco配置最小化批量引入Svg并应用的组件

    无论是哪种 Web UI 框架都不可避免的要与 Svg 打交道,那么批量引入才更方便管理 Svg 。 https://ryanhutzley.medium.com/dynamic-svg-imports-in-create-react-app-d6d411f6d6c6 https://github.com/airbnb/babel-plugin-inline-react-svg/issues/51 https://blog.shianqi.com/2017/12/13/Webpack/SVG-sprite/ https://pganalyze.com/blog/building-svg

    2024年04月10日
    浏览(47)
  • 用i18next使你的应用国际化-React

    ref: https://www.i18next.com/ i18next是一个用JavaScript编写的国际化框架。 i18next为您提供了一个完整的解决方案,本地化您的产品从web端到移动端和桌面端。 在react项目中安 i18next 依赖: i18next react-i18next i18next-browser-languagedetector,用于检测用户语言 创建 i18n.js 文件: 在 index.js 中导

    2024年02月15日
    浏览(34)
  • electron27+react18集成搭建跨平台应用|electron窗口多开

    electron27-vite4-react18基于electron27结合vite4构建工具快速创建react18跨端应用实践。 版本列表 快速创建react18项目 这里选择使用vite.js构建工具来快速创建一个react18项目。 这样一个简单的react18项目就已经创建完毕了。 安装electron依赖包 注意:electron依赖安装在 devDependencies 里面。

    2024年02月08日
    浏览(56)
  • vue3中使用vue-i18n

    1.先在项目中下载vue-i18n 2.1 .为了结构清晰,在src目录下创建一个lang文件夹 2.2 . 在lang文件夹分别下创建两个文件:en.js    /    zh.js代表两种语言 en.js: zh.js: 2.3 . 接着在lang文件夹下创建一个index.js文件: 现在目录结构是这样: 3. 在main.js中引入并use刚才创建的index.js文件:

    2024年02月06日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包