core-js常见于qiankun中的多份polyfill冲突问题

news2024/11/27 12:46:56

问题

开门见山,你可能会在 qiankun 等微前端体系中,有多个子应用时,发生这样的加载崩溃问题:

Cannot redefine property: DEG_PER_RAD

Cannot redefine property: RAD_PER_DEG

实际上 DEG_PER_RADRAD_PER_DEG 都是 Math 上的静态常量,在以下的描述中,我们就以 Math.DEG_PER_RAD 为例进行拆解。

原因拆解

崩溃的根本原因是,core-js 在 3.23.0 做出了一个改动:不能对 Math.DEG_PER_RAD 重复赋值( 相关 issue 详见 #1091 )。

在 core-js 3.23.0Math.DEG_PER_RAD 设定为了 nonConfigurable: truenonWritable: true 的( 代码详见 esnext.math.deg-per-rad.js ),所以当加载了 >= 3.23.0 的 polyfill 后,不能对 Math.DEG_PER_RAD 重新写入了,此时再加载 < 3.23.0 的 polyfill ,就会发生崩溃报错。

而先加载了 < 3.23.0 的 polyfill ,再加载 >= 3.23.0 的话,是没问题的。

为什么常会发生在微前端下?

通过问题拆解,我们发现此报错是与 core-js 不同版本的加载 顺序 强相关的,而在 qiankun 类似的微前端体系下,往往每个子应用都会有一份 polyfill ,所以他们可能会发生本文中的致命冲突,导致应用彻底崩溃。

你可以在全局变量 window['__core-js_shared__'] 中看到当前项目中有多少 core-js 版本:

解法

这里我们先不进一步探究,直接提供解法:

要解的无非是 Math.DEG_PER_RADMath.RAD_PER_DEG 的问题,那我们直接排除这两个 polyfill 就可以了,他们在 core-js 中的名字是 esnext.math.deg-per-radesnext.math.rad-per-deg

如何排除?

对于社区中大部分的脚手架来说,他们的 babel polyfill 策略都是 usage ,所以当你不使用这两个 Math.xxx 常量的时候他是不会引入 polyfill 的。

既然发生了此问题,说明你的 polyfill 大概率是 entry 策略(此处不再展开讲解 babel polyfill 策略),是全量引入的,所以你应该找到相关源头,排除掉他们。

由于排除的手段和 框架 / 脚手架 实现逻辑强相关,所以本文不做具体描述,在排除过程中,除了可以定点排除 esnext.math.deg-per-radesnext.math.rad-per-deg 外,考虑到未来如果新增其他的 Math.constant 常量,也要再排除,同时 esnext.math.xxx 都是 stage 1 的 polyfill (详见 proposal-math-extensions ),几乎不会有人使用到,全部排除了也是没什么风险的,故可以把 esnext.math.xxx 全部过滤掉。

当你无法触及、或不了解框架行为,不能自行解决时,可以考虑到相关框架、脚手架的 issue 区反馈,寻求维护者的帮助。

swc 的 polyfill 策略排除法

为了讲解的更全面,此处我们还提供 swc 的 polyfill 排除解法。对于 swc 来说,我们推荐使用的 polyfill 策略是人工指定 includes 方法(因为 swc 的 usage 策略速度慢,且更新不及时),详见:

  • 《 swc兼容polyfill的权衡与选择 》

那在获取 polyfill 列表结束后,人工过滤掉 esnext.math.xxx 的 polyfill 即可:

// 过滤部分逻辑
const filteredList = (list as string[]).filter(line => {
  // https://github.com/zloirock/core-js/issues/1091
  // Prevent `Math.DEG_PER_RAD` / `Math.RAD_PER_DEG` constant override problem in qiankun micro app
  return !line.startsWith('esnext.math.')
})

其他可能的解法

除了从 core-js 本身上来解决该问题,这里再提供一些其他的解法思路:

  1. 将主应用、子应用全部升级到最新的 core-js 版本,避开含有 < 3.23.0core-js 情况,可解此问题。

  2. 因为主应用含有 polyfill ,子应用没有独立使用的场景时,无需 polyfill ,把子应用的 polyfill 关掉就可以了。

总结

core-js 本身是没问题的,只不过你加载了多份 polyfill ,那就说不准了,这就是:微前端路漫漫其修远兮,只有踩过了坑才知道事出不易。

由于本文探讨的问题场景比较特定和深入,更多的面向对 webpack 比较了解的用户,跳过了很多基础概念的介绍,希望对你有所帮助。

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

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

相关文章

Android面经_111道安卓基础问题(四大组件Activity、Service篇)

111道Android面试基础题目&#xff0c;巩固基础作用。 Android基础问题——四大组件之Activity、Service1、Activity1.1、请介绍activity的生命周期1.1.1、生命周期回调之onCreate()1.1.2、生命周期回调之onStart()1.1.3、生命周期回调之onResume()1.1.4、生命周期回调之onPaus…

【java】java多线程及线程池面试题

目录前言线程是什么&#xff1f;多线程是什么&#xff1f;多线程的作用和好处以及缺点守护线程和用户线程并发和并行的区别一.线程的状态和常用方法1.线程各种状态转化图2.线程相关常用方法有① wait()② sleep(long timeout)③ join()④ yield()⑤ notify()和notifyAll()3.wai…

全流量分析为企业提升SAP用户体验

前言 某汽车总部已部署NetInside流量分析系统&#xff0c;使用流量分析系统提供实时和历史原始流量&#xff0c;重点针对SAP系统性能进行分析&#xff0c;以供安全取证、应用事务分析、网络质量监测以及深层网络分析。 本次分析报告包含&#xff1a;SAP系统性能分析。 分析对…

【北京理工大学-Python 数据分析-3.2Pandas数据特征分析】

对一组数据的理解 数据摘要&#xff1a;通过以下方法&#xff1a;有损地提取数据特征的过程。 基本统计&#xff08;含排序&#xff09;分布/累计统计数据特征相关性周期性等数据分析 Pandas库的数据排序 .sort_index(axis0,asccendingTrue)。.sort_index()方法在指定轴上根…

Tomcat 三种简单网站部署方式

Tomcat 服务部署 1、隐式部署 为什么可以隐式部署&#xff0c;是因为 Tomcat 配置了默认主机 webapps&#xff0c;在 Engine 下你也可以配置其他主机&#xff08;要保证你配置的主机在 ect/host 下有对应关系&#xff09;&#xff0c;但是 appBase 要确保唯一。保证每台主机下…

Effective C++条款40:明智而审慎地使用多重继承(Use multiple inheritance judiciously)

Effective C条款40&#xff1a;明智而审慎地使用多重继承&#xff08;Use multiple inheritance judiciously&#xff09;条款40&#xff1a;明智而审慎地使用多重继承1、多重继承的两个阵营2、多重继承中&#xff0c;接口调用的歧义性3、菱形继承与虚(virtual)继承3.1 菱形继承…

注意力FM模型AFM

1. 概述 在CTR预估任务中&#xff0c;对模型特征的探索是一个重要的分支方向&#xff0c;尤其是特征的交叉&#xff0c;从早起的线性模型Logistic Regression开始&#xff0c;研究者在其中加入了人工的交叉特征&#xff0c;对最终的预估效果起到了正向的效果&#xff0c;但是人…

华为MPLS跨域C1方案实验配置

目录 配置接域内IGP路由协议与LDP协议 配置IPv4的BGP邻居 配置PE之间的Vpnv4邻居 配置PE与CE设备对接命令 ASBR上手工为PE地址分配标签 MPLS隧道——跨域解决方案C1、C2讲解_静下心来敲木鱼的博客-CSDN博客_route-policy rr permit node 10 if-match mpls-labelhttps://bl…

IB地理课选课指南,SL还是HL适合呢?

IB地理科的标准级别&#xff08;Standard Level&#xff0c; SL&#xff09;课程跟高级级别&#xff08;Higher Level&#xff0c;HL&#xff09;课程的最大不同处在于&#xff0c;考卷的数量跟题目的数量是不同的。可是&#xff0c;两者之间的教学内容和科目指引&#xff08;S…

二十八、Kubernetes中job详解

1、概述 在kubernetes中&#xff0c;有很多类型的pod控制器&#xff0c;每种都有自己的适合的场景&#xff0c;常见的有下面这些&#xff1a; ReplicationController&#xff1a;比较原始的pod控制器&#xff0c;已经被废弃&#xff0c;由ReplicaSet替代 ReplicaSet&#xff…

CentOS 7 升级安装 Python 3.9 版本

由于 yum install python3 默认安装的 Python 版本较低&#xff0c;现如今有更高版本的 Python 需求&#xff0c;就想用编译安装的方法安装一个较高版本的 Python&#xff0c;顺道记录一下安装过程。 注意&#xff1a;不要卸载自带的 python2&#xff0c;由于 yum 指令需要 pyt…

idea中代码git的版本穿梭Git Rest三种模式详解(soft,mixed,hard)

使用Git进行版本控制开发时难免会遇到回顾的情况&#xff0c;这里来解释下该如何正确的回滚 文章目录1.本地仓库回滚2.远程仓库回滚2.1错误案例2.2正确操作3.代码提交到错误的分支解决4.Git Rest三种模式详解&#xff08;soft,mixed,hard&#xff09;4.1操作演示reset --hard&a…

【论文简述】FlowFormer:A Transformer Architecture for Optical Flow(ECCV 2022)

一、论文简述 1. 第一作者&#xff1a;Zhaoyang Huang、Xiaoyu Shi 2. 发表年份&#xff1a;2022 3. 发表期刊&#xff1a;ECCV 4. 关键词&#xff1a;光流、代价体、Transformer、GRU 5. 探索动机&#xff1a;现有的方法对代价体的信息利用有限。 6. 工作目标&#xff1…

RabbitMQ 部署及配置详解(集群部署)

RabbitMQ 集群是一个或 多个节点&#xff0c;每个节点共享用户、虚拟主机、 队列、交换、绑定、运行时参数和其他分布式状态。一、RabbitMQ 集群可以通过多种方式形成&#xff1a;通过在配置文件中列出群集节点以声明方式以声明方式使用基于 DNS 的发现以声明方式使用 AWS &…

Java中的LinkedList

文章目录前言一、LinkedList的使用1.1 什么是LinkedList1.2 LinkedList的使用1.2.1 LinkedList的构造1.2.2 LinkedList的其他常用方法介绍1.2.3 LinkedList的遍历二、LinkedList的模拟实现三、ArrayList和LinkedList的区别总结前言 上一节中我们讲解了Java中的链表&#xff0c…

vue3.0中echarts实现中图地图的省份切换,并解决多次切换后地图卡死的情况

一、echarts安装及地图的准备 1、安装echarts npm install echarts2、下载china.js等json文件到项目中的文件夹 map的下载地址&#xff1a; 等审核 二、代码说明 <template><div class"center-body"><div class"map" id"map"…

fork函数详解

文章目录fork函数例子详解工作原理GDB 多进程调试fork函数 fork系统调用用于创建一个新进程&#xff0c;称为子进程&#xff0c;它与进程&#xff08;称为系统调用fork的进程&#xff09;同时运行&#xff0c;此进程称为父进程。创建新的子进程后&#xff0c;两个进程将执行fo…

jvm系列(2)--类加载子系统

目录第2章-类加载子系统内存结构概述简图详细图类加载器子系统类加载器ClassLoader角色类加载过程概述加载阶段链接阶段验证(Verify)准备(Prepare)解析(Resolve)初始化阶段类的初始化时机clinit()1&#xff0c;2&#xff0c;3说明4说明5说明6说明类加载器的分类概述虚拟机自带的…

【web安全】——文件上传的绕过方式

作者名&#xff1a;白昼安全主页面链接&#xff1a; 主页传送门创作初心&#xff1a; 舞台再大&#xff0c;你不上台&#xff0c;永远是观众&#xff0c;没人会关心你努不努力&#xff0c;摔的痛不痛&#xff0c;他们只会看你最后站在什么位置&#xff0c;然后羡慕或鄙夷座右铭…

价值创造链路及经营计划

“价值创造过程最主要的环节是建立链接&#xff0c;北京万柳书院在网上热议&#xff0c;其背后是人与人的大量链接&#xff0c;近期热议的湖南卫视春晚亦如是&#xff0c;这种链接为价值的设计、沟通、传递创造条件&#xff1b;企业以客户为中心设计产品&#xff0c;往大了说是…