随着应用架构复杂,微前端方案的出现,js运行环境沙箱在浏览器中的需求越来越多

需要js沙箱的场景

  1. 多个微前端应用中,变量冲突
  2. 执行第三方js:当你有必要执行第三方js的时候,而这份js文件又不一定可信的时候

需要实现的功能

一个独立的上下文作用域,其中的代码执行不会影响到其他的运行环境。
需要支持多个沙箱环境存在,每个沙箱需要有加载、卸载、再次恢复的能力,其对应着微应用的运行生命周期。

实现过程


上面的get/set条件不够完善,应该使用如下:

1、核心是使用proxy对象创建window代理,并将需要被隔离起来的代码的执行作用域绑定到proxy对象上
2、属性active用来外界控制沙箱是否运行
3、new set()injectedKeys用于记录添加的属性,在沙箱停止的时删除
4、使用Reflect高级地实现属性操作
5、withcallwindow的执行绑定到proxyWindow

微前端应用:
5、微应用初始化的时候 new sandbox
6、ajax获取script标签的代码,并调用bindScope方法用eval在全局作用域执行
7、webpack打包后动态加载的js是使用document.createElementhead里增加了script标签,浏览器自动执行。则对document.createElement重新复制并代理src属性的getset,在set中获取js内容并在沙箱中执行

proxynew Proxy(target, handler)handler中指定对象的属性的getset等操作。详见MDN
Object.defineProperty:对象的某个属性的操作进行代理Object.defineProperty(obj, prop, descriptor)descriptor中(valuewritable)与(getset)是两者其中之一,不能同时都有,详见MDN
题外话:vue3 /2 分别用上述原理实现响应式
Reflect:和直接对象赋值没有区别,优点在于可以知道set的结果成功/失败,且不会因为报错而中断正常的代码逻辑执行,还有厉害的receiver参数,详见:张鑫旭
eval(string)工作在当前作用域下,会将传入的字符串当做 JavaScript 代码进行执行。使用引用或者(0, eval)(‘x + y’)会工作在全局作用域下
题外话:eval的使用
with语句 扩展一个语句的作用域链,指定代码执行的默认对象。详见:MDN


一些优化

1、实现沙箱的再次恢复
2、不使用eval和with来实现对应功能

参考:从零开始写一个微前端框架-沙箱篇

JS 沙箱隔离简单实现相关推荐

  1. 前端技术探索 - 你不知道的JS 沙箱隔离

    点击上方关注 前端技术江湖,我们一起学习,天天进步 一些「炒冷饭」背景介绍 本文并不会从头开始介绍 Web Worker 的基础知识和基本 API 的使用等(只是部分有涉及),若还未了解过 Web W ...

  2. 你不知道的JS 沙箱隔离

    点击上方 前端Q,关注公众号 回复加群,加入前端Q技术交流群 一些「炒冷饭」背景介绍 本文并不会从头开始介绍 Web Worker 的基础知识和基本 API 的使用等(只是部分有涉及),若还未了解过 ...

  3. Shadow DOM 样式隔离 js沙箱

    这种方法可能适用于中台这种嵌套其他子应用的场景,目前没遇到其他使用场景或有更好的解决方案 在线demo 不管是link导入的样色还是<style>标签样色都可以被隔离,不影响shadow ...

  4. Node.js沙箱逃逸

    什么是沙箱(sandbox) 在计算机安全性方面,沙箱(沙盒.sanbox)是分离运行程序的安全机制,提供一个隔离环境以运行程序.通常情况下,在沙箱环境下运行的程序访问计算机资源会受到限制或者禁止,资 ...

  5. 微前端之实践环境变量设置、快照沙箱隔离、代理沙箱隔离、css 样式隔离、父子应用间通信和子应用间通信

    一.微前端之实践环境变量设置.快照沙箱隔离.代理沙箱隔离.css 样式隔离.父子应用间通信和子应用间通信 微前端环境变量设置,如下所示: 在 micro 下的 sandbox 中 performScr ...

  6. 用html做12进制时钟特效,js+css3实现简单时钟特效

    本文实例为大家分享了js+css3实现简单时钟的具体代码,供大家参考,具体内容如下 1.实现了时钟的特效,可以转动,时间准确,画面美观大气: 2.用到了css3的transform: rotate,t ...

  7. 【转】JS回调函数--简单易懂有实例

    JS回调函数--简单易懂有实例 初学js的时候,被回调函数搞得很晕,现在回过头来总结一下什么是回调函数. 我们先来看看回调的英文定义:A callback is a function that is ...

  8. linux脚本石英钟,原生JS实现的简单小钟表功能示例

    本文实例讲述了原生JS实现的简单小钟表功能.分享给大家供大家参考,具体如下: 先来看看运行效果: 完整代码: www.jb51.net 钟表 body { background-color:#00A2 ...

  9. [转]九个Console命令,让js调试更简单

    转自:九个Console命令,让js调试更简单 一.显示信息的命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <!DOCTYPE html> <html ...

最新文章

  1. OpenGL环境下的射线选择
  2. aix察看根目录各文件和子目录大小,去除文件系统统计
  3. 在大促中什么影响了数据库性能
  4. squid 服务器的应用
  5. php制作简单的用户登陆,如何用php代码实现简单的用户登陆以及登陆验证功能
  6. 国防科技大学计算机学院教员,我国最好的四所科技大学,第一名排名世界前列,还有一所是铁饭碗...
  7. 构建房屋预测回归模型
  8. arcgis 删除图形重复折点_【干货】ArcGIS中画环状图斑、挑子区及消除图斑重复区域...
  9. 【Code-Snippet】ProgressBar
  10. 关于个人博客转移的那些事
  11. js open 和close 方法
  12. idea git提交代码步骤
  13. 我国5G现状:今年底或发放5G牌照
  14. 中文汉字错别字纠错方法
  15. Halcon实战之MLP颜色匹配(一)
  16. Mysql——》索引存储模型推演
  17. sourceinsight 查看源码的利器
  18. Android 电话系统框架介绍
  19. 个人的敏感信息需要怎么进行安全保护的一些思考记录
  20. 合泰单片机AD转换Adc_Init.c

热门文章

  1. 用递归和非递归求斐波那契数列
  2. python大气校正_全自动多源遥感影像大气校正方法
  3. python复制文件夹shutil.copytree
  4. java人工智能之神经网络中的层数怎么确定
  5. 人工智能( AI )将如何颠覆项目管理?看看这六大关键领域
  6. 贼好用,冰河再次升级了这款开源的精准定时任务和延时队列框架!!
  7. 正则表达式 行首行尾替换
  8. c语言编程显示未定义的引用,c – 链接时奇怪的未定义引用
  9. 熊梓淇 《国民老公2》看到乔安好扮演者,迫不及待想追了
  10. 马其顿驱动电源项目调光LED闪烁原因