微前端学习

在微前端架构中,with关键字和Proxy对象常被用来实现子应用的运行时隔离,确保不同微应用之间的全局变量、函数等资源互不影响,从而保障系统的稳定性与安全性。以下是它们在微前端场景下的具体应用和区别:

with关键字

作用: with语句允许在特定对象的作用域内执行代码,暂时修改作用域链。在微前端背景下,with常被用来创建一个封闭的环境,使得子应用的代码在执行时,对全局变量的访问实际上被导向到一个特定的对象(如一个模拟的全局对象或一个Proxy对象),而不是真实的全局对象(如window)。

const sandbox = {};
with (sandbox) {// 子应用代码在此处执行// 对任何未在sandbox对象中定义的全局变量的访问都将尝试从sandbox对象中查找
}

优点

  • 简单易用,只需配合一个对象即可快速创建一个隔离上下文。

缺点

  • 性能影响:由于with改变了作用域链,可能导致JavaScript引擎优化受阻,影响性能。
  • 不推荐使用:ECMAScript规范已不推荐使用with,因为它可能导致代码可读性降低,且容易引发意外的变量遮蔽问题。
  • 不全面的隔离:仅能拦截对全局变量的直接访问,无法阻止通过其他途径(如evalFunction构造函数等)访问真实全局对象。

Proxy对象

作用: Proxy是ES6引入的一种强大的对象代理机制,它可以创建一个代理对象,对外部代码的访问、赋值、删除等操作进行拦截和自定义处理。在微前端场景下,Proxy被用来创建一个包裹真实全局对象的代理对象,对子应用的所有操作进行透明拦截,确保其对全局资源的影响仅限于代理对象内部。

const globalProxy = new Proxy(window, {get(target, key) {if (key in target) {return target[key];} else {// 对不存在的属性,可以返回自定义值、抛出错误或进行其他逻辑处理return undefined;}},set(target, key, value) {// 可以在此处记录变更、限制特定属性的修改等target[key] = value;return true;},// 可以添加更多handler方法来拦截其他操作,如deleteProperty、apply等
});// 子应用代码在使用globalProxy作为全局对象的环境中执行

优点

  • 全面的控制Proxy可以拦截几乎所有的对象操作,包括属性访问、赋值、删除、函数调用等,提供了更精细、全面的隔离能力。
  • 动态行为:代理的行为可以在运行时动态调整,可以根据需要灵活地添加、修改隔离策略。
  • 类型安全:与TypeScript等静态类型检查工具结合良好,有助于编写更健壮、类型安全的代码。

缺点

  • 浏览器兼容性Proxy是ES6新特性,对于不支持它的旧版浏览器,可能需要polyfill或采取其他兼容方案。
  • 学习成本:使用Proxy需要理解其复杂的API和工作原理,对于初学者可能有一定的学习曲线。
  • 性能开销:尽管现代JavaScript引擎对Proxy的性能进行了优化,但在大量、频繁的操作下仍可能存在一定的性能开销。

综上所述,在微前端场景中,with关键字提供了一种简单但有局限性的隔离手段,而Proxy对象则提供了更为强大、全面且可定制的隔离解决方案。考虑到with的诸多缺点和ECMAScript对其的不推荐使用,现代微前端框架和库倾向于使用Proxy来实现更高级别的隔离和安全性。同时,实际应用中可能还会结合其他技术(如iframe、Web Components等)以及框架提供的特定API(如qiankunsandbox机制)来进一步增强微应用的隔离效果。

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

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

相关文章

跨域和跨域解决方案

跨域 制定HTML规则时,出于安全的考虑,一个源的网站不允许与另一个源的资源进行交互,浏览器制定此规则为同源策略。 同源即指的网站具有相同的域,即 协议(protocol)、主机(host)、端口号(port) 相同。 跨域资源嵌入是允许的&am…

力扣 | 234. 回文链表

用到快慢指针! /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next;…

SQLite的PRAGMA 声明

PRAGMA 语句是特定于 SQLite 的 SQL 扩展,用于 修改 SQLite 库的操作或查询 SQLite 库 内部(非表)数据。PRAGMA声明使用相同的 接口作为其他 SQLite 命令(例如 SELECT、INSERT)但 在以下重要方面有所不同: …

ZooKeeper分布式服务与Kafka消息队列+ELKF整合方案

前言 ZooKeeper 是一个分布式的、开放源码的分布式应用程序协调服务,提供配置维护、命名服务、分布式同步、组服务等功能; Kafka 是一个开源的分布式流处理平台,它被设计用来处理实时数据流,包括发布和订阅消息系统、日志收集以…

叉车载货出入库AI检测算法介绍及应用

随着物流行业的快速发展,叉车作为物流运输的重要设备,其安全性和效率性越来越受到人们的关注。然而,在实际操作中,由于人为因素和操作环境的复杂性,叉车事故时有发生,给企业和个人带来了巨大的损失。为了提…

HarmonyOS开发实例:【app帐号管理】

应用帐号管理 介绍 本示例选择应用进行注册/登录,并设置帐号相关信息,简要说明应用帐号管理相关功能。效果图如下: 效果预览 使用说明参考鸿蒙文档:qr23.cn/AKFP8k点击或者转到。 1.首页面选择想要进入的应用,首次进…

JetBrains PhpStorm 2024.1 发布 - 高效智能的 PHP IDE

JetBrains PhpStorm 2024.1 发布 - 高效智能的 PHP IDE 请访问原文链接:JetBrains PhpStorm 2024.1 (macOS, Linux, Windows) - 高效智能的 PHP IDE,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org JetBrains PhpSt…

每日一题 第八十八期 洛谷 滑动窗口

滑动窗口 /【模板】单调队列 题目描述 有一个长为 n n n 的序列 a a a,以及一个大小为 k k k 的窗口。现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值。 例如,对于序列 [ 1 , 3 , − …

C语言: 字符串函数(下)

片头 在上一篇中,我们介绍了字符串函数。在这一篇章中,我们将继续学习字符串函数,准备好了吗?开始咯! 1.strncpy函数 1.1 strncpy函数的用法 strncpy是C语言中的一个字符串处理函数,它用于将一个字符串的一部分内容…

【Linux】linux 在指定根目录下,查找wav文件并删除

要在Linux的指定根目录下查找.wav文件并删除它们,您可以使用find命令结合-exec选项来执行删除操作。请注意,这个操作是不可逆的,所以在执行之前请确保您知道自己在做什么,并且已经备份了重要数据。 以下是一个示例命令&#xff0…

C++ | Leetcode C++题解之第14题最长公共前缀

题目&#xff1a; 题解&#xff1a; class Solution { public:string longestCommonPrefix(vector<string>& strs) {if (!strs.size()) {return "";}int minLength min_element(strs.begin(), strs.end(), [](const string& s, const string& t)…

TL431内部架构学习

在V/I转换那个篇章里面看到了TL431的内部架构,那我们这一篇一点点的解析TL431的构成,首先TL431的内部详细原理图如下图1所示,为了便于理解我对管子进行了标注,倒时候我们好分析 图1:TL431内部原理图 拿到原理图后我们先简单的拆分,Q10和Q11就是达林顿管,控制Cathode的电压的Q2…

18.java openCV4.x 入门- Imgproc之色彩映射及颜色空间转换

专栏简介 &#x1f492;个人主页 &#x1f4f0;专栏目录 点击上方查看更多内容 &#x1f4d6;心灵鸡汤&#x1f4d6;我们唯一拥有的就是今天&#xff0c;唯一能把握的也是今天建议把本文当作笔记来看&#xff0c;据说专栏目录里面有相应视频&#x1f92b; &#x1f9ed;文…

Python | Leetcode Python题解之第26题删除有序数组中的重复项

题目&#xff1a; 题解&#xff1a; class Solution:def removeDuplicates(self, nums: List[int]) -> int:if not nums:return 0n len(nums)fast slow 1while fast < n:if nums[fast] ! nums[fast - 1]:nums[slow] nums[fast]slow 1fast 1return slow

设计模式详解(十四)——策略模式

策略模式简介 策略模式定义 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;它使能在运行时改变对象的行为。策略模式属于对象行为模式&#xff0c;它定义了一系列的算法&#xff0c;并将每一个算法封装起来&#xff0c;使它们可以互相替换…

【央国企专场】——国家电网

国家电网目录 一、电网介绍1、核心业务2、电网组成 二、公司待遇三、公司招聘1、招聘平台2、考试安排2.3 考试内容 一、电网介绍 1、核心业务 国家电网公司&#xff08;State Grid Corporation of China&#xff0c;简称SGCC&#xff09;是中国最大的国有企业之一&#xff0c…

第三周周一技术课讲义

第三周周一技术课讲义 条件控制语句 break 不能单独存在的。可以用在switch和循环中&#xff0c;表示结束&#xff0c;跳出的意思。 代码示例&#xff1a; //1.找出100-1000中前5个79的倍数 ​ int j 0; //用来计数 for (int i 100; i < 1000; i) {if(i % 79 0){j; …

LeetCode 热题 100 题解(二):双指针部分(2)| 滑动窗口部分(1)

题目四&#xff1a;接雨水&#xff08;No. 43&#xff09; 题目链接&#xff1a;https://leetcode.cn/problems/trapping-rain-water/description/?envTypestudy-plan-v2&envIdtop-100-liked 难度&#xff1a;困难 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&am…

树的总结学习

一、树的遍历 其实深度优先遍历&#xff1a;是指先序、中序和后序&#xff0c;广度优先就是层序遍历。 ①、先序遍历 void PreOrder(BTNode *b) {if(b ! NULL){std::cout << b->data << std::endl;PreOrder(b->left);PreOrder(b->right);} } ②、中序…

如何将三方库集成到hap包中——通过IDE集成非cmake方式构建的C/C++三方库

简介 DevEco Studio(简称IDE)目前只支持cmake构建方式&#xff0c;对于非cmake构建方式的三方库需要通过IDE工具集成的话&#xff0c;我们需要对原生库编写一个cmake的构建脚本。本文通过tinyxpath三方库为例介绍如何在IDE上移植一个非cmake构建方式的三方库。 cmake构建脚本…