MicroApp的Vite项目,特别全面

news2024/11/15 18:17:03

目录

前言

简介

分离

修改基座

子应用修改

修改vite.config.js​编辑

修改index.html

基座修改

处理子应用静态资源

效果

基座与子应用传值

在基座的MicroApp的index页面修改

在子应用的App.tsx文件进行useEffect的监听

效果​编辑

去掉菜单栏头部

效果​编辑

总结


前言

该文章用的技术栈是React+Vite+Ts,他的microApp配置相对于React和vue配置相对复杂一些,如果您没有了解基础可以看看(2条消息) 新星微前端MicroApp的基础教程_强壮的糙汉子的博客-CSDN博客这篇文章

简介

这个是我们公司所有后台的管理系统,大家可以看大非常非常的复杂,而我在的部门在分销部门,我们只开发这个部分

可是就会发现有两个问题:

1、虽然我们已经在项目中使用vite,但是它启动的时候还是速度不够理想

2、我们有很多部门在一起开发,每次提交拉去的时候都可能会面临冲突问题

基于以上这几点,我们调研现在比较火的微前端,经过了一系列的技术选型最后定了微前端中的新星京东的microApp

 

分离

我们把项目复制一份,

 

然后把分销作为子应用,原有项目作为基座

我们把分销的路由进行注释一下,把其全部分离出来(我们先把分离出来,随后分离成功在去删除依赖,以及删除页面,减轻打包负担,从而可以起服务更快)

然后就会发现这个项目被单独分离出来了

修改基座

我们需要创建一个页面,在src文件下,创建一个MicroApp文件,并创建index.tsx文件!

 

写入如下代码

import React, { useEffect } from 'react'
import microApp from '@micro-zoe/micro-app'

export default function Distribution() {
  return (
      <micro-app
        name='distribution'
        url='http://localhost:8001/'
        inline // 使用内联script模式
        disableSandbox // 关闭沙箱
      />
  )
}

我们把子应用分离出来了,但是我们的基座还有页面,我们把基座关于分销的页面路由的element都指向

 然后就会看到页面

 这一步我们就是分离成功!

以上就是关于个人项目的私有配置,可以进行参考,如下是一些官方的配置!

子应用修改

如上只是分离成功了,但是并没有,达到我们想要的效果,

如果有需要可以看下官方的配置Vite (jd.com)

修改vite.config.js

 这是官方给的例子我们进行修改

上面位置可以直接复制,但是需要配置跨域问题

/* eslint-disable import/extensions */
import { writeFileSync } from 'fs'
import path from 'path'
import { join } from 'path'
...
const env = process.env.ENV

...

export default defineConfig({
  base: process.env.NODE_ENV === 'production' ? cmsPath[env] : '/distribution',
  plugins: [
  ....
    (function () {
      let basePath = ''
      return {
        name: "distribution",
        apply: 'build',
        configResolved(config) {
          basePath = `${config.base}${config.build.assetsDir}/`
        },
        writeBundle(options, bundle) {
          for (const chunkName in bundle) {
            if (Object.prototype.hasOwnProperty.call(bundle, chunkName)) {
              const chunk = bundle[chunkName]
              if (chunk.fileName && chunk.fileName.endsWith('.js')) {
                chunk.code = chunk.code.replace(/(from|import\()(\s*['"])(\.\.?\/)/g, (all, $1, $2, $3) => {
                  return all.replace($3, new URL($3, basePath))
                })
                const fullPath = join(options.dir, chunk.fileName)
                writeFileSync(fullPath, chunk.code)
              }
            }
          }
        },
      }
    })(),
  ],


 
...
  },
  server: {
    headers: {
      'Access-Control-Allow-Origin': '*',
    },
   ....
  },
})

修改index.html

由于我们关闭了沙箱模式

我们的顶级作用于就会泄露为全局作用域

所以我们把index.html中的id="root"换成

    <div id="distribution-root"></div>

并且在mian.tsx文件中进行修改

 

这个原因是,基座的项目id是root,我们子应用的id要为root的话,可能会造成一些无法预知的问题

基座修改

处理子应用静态资源

官方例子

 

 

我们进行修改,

注意是在基座的mian.tsx文件下,进行修改!

// entry
// eslint-disable-next-line import/order
import microApp from '@micro-zoe/micro-app'
microApp.start({
  plugins: {
    modules: {
      // appName即应用的name值
      distribution: [
        {
          loader(code) {
            if (process.env.NODE_ENV === 'development') {
              // 这里 basename 需要和子应用vite.config.js中base的配置保持一致
              code = code.replace(/(from|import)(\s*['"])(\/distribution\/)/g, all => {
                return all.replace('/distribution/', 'http://localhost:8001/distribution/')
              })
            }

            return code
          },
        },
      ],
    },
  },
})

效果

随后我们就可以看到这个样式!也就是我们成功了4分之三了!

 

 

基座与子应用传值

我们会发现,上面的基座路由与子应用路由并不拼配,我们需要用传值的方式让子应用实例去操作子应用路由

在基座的MicroApp的index页面修改

import React, { useEffect } from 'react'
import microApp, { EventCenterForMicroApp } from '@micro-zoe/micro-app'

import { useLocation } from 'react-router-dom'

export default function Distribution() {
  const location = useLocation()
  console.log(location.pathname) //distribution/goodsPromotion/list
  // 注意:每个vite子应用根据appName单独分配一个通信对象   创建实例
  window.eventCenterForDistribution = new EventCenterForMicroApp('distribution')
  useEffect(() => {
  //基座发送数据
    microApp.setData('distribution', { path: location.pathname })
  }, [location.pathname])
  return (
      <micro-app
        name='distribution'
        url='http://localhost:8001/'
        inline // 使用内联script模式
        disableSandbox // 关闭沙箱
      />
  )
}

在子应用的App.tsx文件进行useEffect的监听

const navigate = useNavigate()
  useEffect(() => {

    if(window.eventCenterForDistribution) {
      window.eventCenterForDistribution.addDataListener((data) => {
        // 当基座下发跳转指令时进行跳转
        if (data.path) {
          navigate(data.path)
        }
      })
    }

效果

 

我们会发现子应用会随着基座路由跳转而跳转了!

去掉菜单栏头部

我们发现子应用全部嵌套早基座上,包含已经有了的菜单栏,以及头部

我们找到子应用的layou页面进行判断

     window.__MICRO_APP_BASE_APPLICATION__

 这个是,如果在基座环境为true,不再基座为false

我们就可以判断

 

 

效果

 

总结

这个microApp对于新手还是很友好的,官方文档写的蛮详细的,但是对于vite配置,可能会出现一些问题,但是不敢巧,我们公司用的vite,所以,发布了这篇文章。希望大家多多点赞支持!谢谢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/12693.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot面试

0. Spring Boot 原理 Spring Boot 是由 Pivotal 团队提供的全新框架&#xff0c;其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。通过这种方式&#xff0c;Spring Boot 致力…

D. Bandit in a City(DFS + 叶子节点数目)

Problem - 1436D - Codeforces 输出标准输出 城市里出现了强盗! 他们中的一个正试图尽可能多地抓捕市民。 这个城市由n个广场组成&#xff0c;由n-1条道路连接&#xff0c;从任何其他广场都可以到达任何广场。1号广场是主广场。 星期天散步后&#xff0c;所有的道路都改为单行…

uni-app —— 小程序登录功能的相关实现

文章目录 前言一、示例图二、静态页面的搭建 1.登录页面的静态页面css样式设置2.我的页面的静态页面css样式设置三、登录页面的实现逻辑 1.进行表单验证的组件2.验证登录成功的思路3.具体代码实现一、示例图 二、静态页面的搭建 实现思路&#xff1a; 主要需要实现的功能点&am…

企业为什么做不好生产计划?

生产计划是企业对生产任务作出统筹安排&#xff0c;具体拟定生产产品的品种、数量、质量和进度的计划。是企业经营计划的重要组成部分&#xff0c;是企业进行生产管理的重要依据。既是实现企业经营目标的重要手段&#xff0c;也是组织和指导企业生产活动有计划进行的依据。企业…

【微服务】SpringCloud微服务注册源码解析

目录 一、前言 1、简述 2、SpringCloudCommons 项目 二、客户端服务注册 1、流程图 2、入口 2.1、客户端注册引入依赖 3、EurekaServiceRegistry服务注册机 3.1、EurekaServiceRegistry注册逻辑 4、ApplicationInfoManager 4.1、setInstanceStatus(InstanceStatus s…

【区块链技术与应用】(七)

资料来源 https://pkg.go.dev/github.com/hyperledger/fabric-sdk-go#section-readme https://github.com/hyperledger/fabric-sdk-go https://wiki.hyperledger.org/display/fabric https://github.com/hyperledger/fabric-samples 书接上回&#xff0c;补充getway链码分析 上…

maven assembly打包生成Java应用启动脚本bat和sh

1. maven插件介绍 springboot应用通过maven插件appassembler-maven-plugi生成启动脚本bat和sh。根据官网介绍&#xff0c;这个插件主要用于生成启动 java应用程序的脚本&#xff0c;能将项目依赖jar能够打包目录中&#xff0c;并且它们加入启动脚本类路径中。 主要命令 appas…

springboot瑞吉外卖

创建数据库,项目初始化静态资源不在static目录下&#xff0c;如何映射结果类登录过滤器拦截路径全局异常处理器分页查询消息转换器修改禁用分页编辑公共字段自动填充使用ThreadLocal新增用户绑定的数据不可删除上传下载前端传递的数据&#xff0c;不在同一张表时&#xff0c;DT…

java设计模式之策略模式

一&#xff1a;策略模式 1.什么是策略模式? 模板方法模式是一种行为设计模式&#xff0c; 它在超类中定义了一个算法的框架&#xff0c; 允许子类在不修改结构的情况下重写算法的特定步骤。 策略模式的基本介绍 1.策略模式&#xff08;Strategy Pattern&#xff09;中&#x…

【MQ基本概念 MQ的工作原理】

一、MQ基本概念 1、MQ概述 MQ全称Message Queue&#xff08;消息队列&#xff09;&#xff0c;是在消息的传输过程中保存 消息的容器。多用于分布式系统之间进 行通信。 小结 MQ&#xff0c;消息 队列&#xff0c;存储消息的中间件 分布式系统通信两种方式&#xff1a;直接远程…

2022年数维杯D题 极端天气问题思路指导

D题损失评估与应对策略的研究三重拉尼娜事件下的极端气候灾害 很明显D题是一个数据收集➕数据处理类型题目&#xff0c;这与美赛中的E题题型相似。该题所涉及的极端天气与2021年小美赛极端天气题目高度相似。因此&#xff0c;我们首先对大家整理了去年小美赛极端天气的相关论文…

Kubeadm搭建kubernetes集群

Kubeadm搭建kubernetes集群 环境说明 | 角色 | ip | 操作系统 |组件 | | – | – | – | | master | 192.168.226.10 |centos8 | docker&#xff0c;kubectl&#xff0c;kubeadm&#xff0c;kubelet | | node1 | 192.168.226.20 |centos8 |docker&#xff0c;kubectl&#xff…

登陆拦截案例

登陆拦截案例 登陆拦截器小案例&#xff0c;判断登陆的用户名及密码是否正确&#xff1b;&#xff1a; 1.创建一个maven项目&#xff0c;导入相关的坐标&#xff1a; <dependencies><dependency><groupId>org.springframework</groupId><artifact…

【Hack The Box】windows练习-- Blackfield

HTB 学习笔记 【Hack The Box】windows练习-- Blackfield &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月17日&#x1f334; &…

[Games 101] Lecture 10 Geometry 1 (Introduction)

Geometry 1 (Introduction) Ways to Represent Geometry 隐式 (Implicit) 几何 只告诉点满足某种约束或关系&#xff0c;并不给出实际的点&#xff0c;也就是说&#xff0c;定义 f(x,y,z)0f(x,y,z) 0 f(x,y,z)0 例如&#xff0c;定义三维空间中的点&#xff0c;满足&#…

上海亚商投顾:信创概念掀涨停潮

上海亚商投顾前言&#xff1a;无惧大盘大跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪指数早盘低开低走&#xff0c;沪指一度跌超1%&#xff0c;失守3100点关口&#xff0c;创业板指盘中跌逾2%&#xff…

软件工程毕业设计 SSM计算机毕设项目合集【源码+论文】

文章目录前言 题目1 : 基于SSM的网上租车系统 <br /> 题目2 : 基于SSM的药品管理系统 <br /> 题目3 : 基于SSM的药源药品商城保健品购物网站 <br /> 题目4 : 基于SSM的疫情防控物业管理系统 <br /> 题目5 : 基于SSM的音乐网站 <br />前言 &…

如何通过更好的文档管理减轻小型企业的压力

如何通过更好的文档管理减轻小型企业的压力 企业如何处理企业文档在很大程度上体现了企业以目前的形式茁壮成长的能力以及在当今的市场中成长为成熟的、有竞争力的实体的能力。 具体来说&#xff0c;在小型企业中&#xff0c;许多员工都需要承担多种职责&#xff0c;每一分钟…

代码随想录58——单调栈:739每日温度、 496下一个更大元素I

文章目录1.739每日温度1.1.题目1.2.解答1.2.1.单调栈使用情况1.2.2.本题解答2. 496下一个更大元素I2.1.题目2.2.解答1.739每日温度 参考&#xff1a;代码随想录&#xff0c;739每日温度&#xff1b;力扣题目链接 1.1.题目 1.2.解答 1.2.1.单调栈使用情况 首先想到的当然是暴…

通过STM32Cube配置完成基于I2C协议的AHT20温湿度传感器的数据采集

文章目录前言一、I2C协议1、应用2、组成3、软件I2C和硬件I2C3.1软件I2C3.2硬件I2C二、通过硬件I2C协议采集AHT20的数据1、配置项目2、配置代码三、效果四、总结五、参考资料前言 硬件&#xff1a;stm32f103c8t6 核心板软件&#xff1a;STM32CubeMX 6.4.0软件&#xff1a;keil5…