微应用跨域问题-京东MicroApp篇

前言

公司近段时间准备将之前的一个大规模平台进行拆分,拆分成一个个小平台。因此需要采用微前端技术进行重构。调研了目前流行的微前端架构,包含阿里的Qiankun,京东的MicroApp,腾讯的Wujie。对这三个架构使用之后,发现MicroApp具有如下优势:

  1. 使用简单,开发成本最低。
  2. 对子应用的侵入最小,只需修改主应用即可。
  3. 默认支持vite,符合公司架构。

概念

微应用(MicroApp)

微前端是一种页面整合方案,它的核心在于将一个庞大的前端应用拆分成多个独立灵活的小型应用,每个应用都可以独立开发、独立运行、独立部署,再将这些小型应用融合为一个完整的应用,统一展示。

使用

主应用(react + vite)

  1. 安装依赖
css 复制代码
npm i @micro-zoe/micro-app --save
  1. 在App.tsx初始化Micro-App
javascript 复制代码
import microApp from '@micro-zoe/micro-app';
import { useEffect } from 'react';
function App() {
   useEffect(() => {
    microApp.start(); 
  },[]); 
}
  1. 嵌入子应用
javascript 复制代码
import React from 'react'
export default function MicroApp() {
  // 返回值会放入数组中传递给setData的回调函数
  return (
    <micro-app
      name='children-app'
      url='http://localhost:3003/' 
      iframe
      router-mode='pure'
    >
    </micro-app>
  )
}

url表示子应用的启动地址,name表示子应用的名字,如果子应用是vite需要将其沙箱设置为iframe

跨域

跨域(Cross-Origin)是指在 Web 开发中,浏览器的同源策略(Same-Origin Policy)限制下,一个网页的资源请求与当前页面的源(协议、域名、端口)不同。同源策略是一种安全机制,限制网页从一个源加载的资源与另一个源进行交互,以防止恶意的跨站脚本攻击。因此在实际开发过程中,主应用访问子应用会出现跨域问题。

预检请求(options)

触发条件

  • 跨域的情况下,会发生预请求
  • 使用了PUT、DELETE、CONNECT、OPTIONS、TRACE、PATCH方法
  • 人为设置了非规定内的其他首部字段,参考上面简单请求的安全字段集合,还要特别注意Content-Type的类型
  • XMLHttpRequestUpload 对象注册了任何事件监听器
  • 请求中使用了ReadableStream对象

跨域问题解决

MicroApp官方解决跨域的方法是在webpack-dev-server的headers中设置跨域支持。

css 复制代码
devServer: {
  headers: {
    'Access-Control-Allow-Origin': '*',
  }
},

但在实际项目中,由于项目中的请求携带了token,由于预检请求的原因,设置了这个并不能解决跨域问题。需要对预检请求也要进行跨域处理。根据打包工具的不同,需要对其进行相应的设置。

webpack@4, webpack-dev-server@3

在webpackDevServer.config.js中进行如下配置

javascript 复制代码
// webpackDevServer.config.js
// 处理访问微应用的跨域问题
headers: { 
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Headers": "*"
}
// 微应用请求接口的跨域问题
before(app){
  app.use((req, res, next) => {
    if (req.method === 'OPTIONS') {
        res.header("Access-Control-Allow-Origin", "*")
        res.header("Access-Control-Allow-Headers", "*")
        res.sendStatus(200)
    } else {
        next();
    }
  })
}

webpack@5, webpack-dev-server@4

javascript 复制代码
// 处理访问微应用的跨域问题
headers: { 
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Headers": "*"
}
// 处理options方法不同
onBeforeSetupMiddleware(app){
  app.use((req, res, next) => {
    if (req.method === 'OPTIONS') {
        res.header("Access-Control-Allow-Origin", "*")
        res.header("Access-Control-Allow-Headers", "*")
        res.sendStatus(200)
    } else {
        next();
    }
  })
}

umi@3, express

javascript 复制代码
// config.dev.ts
devServer: {
      beforeMiddlewares: [
        (req, res, next) => {
          if (req.method === 'OPTIONS') {
            res.header("Access-Control-Allow-Origin", "*")
            res.header("Access-Control-Allow-Headers", "*")
            res.sendStatus(200)
          } else {
            next();
          }
        }
      ],
      headers: {
        "Access-Control-Allow-Origin": "*",
        "Access-Control-Allow-Headers": "*"
      }
    }

上述只针对开发环境,对于生产环境,通过nginx配置跨域即可。

相关推荐
blackorbird1 小时前
Edge 浏览器 IE 模式成攻击突破口:黑客借仿冒网站诱导攻击
前端·edge
谷歌开发者2 小时前
Web 开发指向标 | Chrome 开发者工具学习资源 (一)
前端·chrome·学习
名字越长技术越强2 小时前
Chrome和IE获取本机ip地址
前端
天***88962 小时前
Chrome 安装失败且提示“无可用的更新” 或 “与服务器的连接意外终止”,Chrome 离线版下载安装教程
前端·chrome
半梦半醒*2 小时前
zabbix安装
linux·运维·前端·网络·zabbix
清羽_ls3 小时前
React Hooks 核心规则&自定义 Hooks
前端·react.js·hooks
你的人类朋友3 小时前
“签名”这个概念是非对称加密独有的吗?
前端·后端·安全
西陵3 小时前
Nx带来极致的前端开发体验——任务缓存
前端·javascript·架构
10年前端老司机4 小时前
Promise 常见面试题(持续更新中)
前端·javascript
潘小安4 小时前
跟着 AI 学 (一)- shell 脚本
前端·ci/cd·vibecoding