iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >vue3的沙箱机制是什么
  • 330
分享到

vue3的沙箱机制是什么

2023-06-14 13:06:04 330人浏览 薄情痞子
摘要

今天就跟大家聊聊有关vue3的沙箱机制是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Vue3 沙箱主要分两种浏览器编译版本,浏览器版本是使用with语法加上proxy代理拦截本

今天就跟大家聊聊有关vue3的沙箱机制是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

Vue3 沙箱主要分两种

  1. 浏览器编译版本,浏览器版本是使用with语法加上proxy代理拦截

  2. 本地预编译版本,通过在模版预编译阶段转换阶段,使用转换插件transfORMExpression将非白名单标识符挂在在组件代理对象下

浏览器编译版本

render 函数编译结果

<div>{{test}}</div><div>{{Math.floor(1)}}</div>

to

const _Vue = Vue;return function render(_ctx, _cache, $props, $setup, $data, $options) {  with (_ctx) {    const {      toDisplayString: _toDisplayString,      createVnode: _createVNode,      Fragment: _Fragment,      openBlock: _openBlock,      createBlock: _createBlock,    } = _Vue;    return (      _openBlock(),      _createBlock(        _Fragment,        null,        [          _createVNode("div", null, _toDisplayString(test), 1 ),          _createVNode(            "div",            null,            _toDisplayString(Math.floor(1)),            1           ),        ],        64       )    );  }};

从上面的代码,我们能发现,变量标识符没有增加前缀,只是用with语法包裹了一下,延长作用域链,那么是如何做到 js 沙箱拦截的呢?例如变量test,理论上说,当前作用域链没有test变量,变量会从上一层作用域查找,直到查找到全局作用域,但是,实际上只会在_ctx上查找,原理很简单,_ctx是一个代理对象,那么我们如何使用Proxy做拦截,示例代码如下:

const GLOBALS_WHITE_LISTED =  "Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI," +  "decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array," +  "Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt";const isGloballyWhitelisted = (key) => {  return GLOBALS_WHITE_LISTED.split(",").includes(key);};const hasOwn = (obj, key) => {  return Object.prototype.hasOwnProperty.call(obj, key);};const origin = {};const _ctx = new Proxy(origin, {  get(target, key, reciever) {    if (hasOwn(target, key)) {      Reflect.get(target, key, reciever);    } else {      console.warn(        `Property ${JSON.stringify(key)} was accessed during render ` +          `but is not defined on instance.`      );    }  },  has(target, key) {    // 如果是 全局对象 返回false,不触发get 拦截,从上一层作用域查找变量    // 如果不是 全局对象 返回true,触发get 拦截    return !isGloballyWhitelisted(key);  },});

代码很简单,为什么这么简单的代码就能做到拦截?
因为 with 语句会触发 has 拦截,当 has 返回 true,就会 触发代理对象 get 拦截,如果返回 false, 则代理对象 get 拦截不会触发,变量不在当前代理对象查找,直接查找更上一层作用域

本地预编译版本

<div>{{test}}</div><div>{{Math.floor(1)}}</div>

to

import {  toDisplayString as _toDisplayString,  createVNode as _createVNode,  Fragment as _Fragment,  openBlock as _openBlock,  createBlock as _createBlock,} from "vue";export function render(_ctx, _cache, $props, $setup, $data, $options) {  return (    _openBlock(),    _createBlock(      _Fragment,      null,      [        _createVNode("div", null, _toDisplayString(_ctx.a), 1 ),        _createVNode(          "div",          null,          _toDisplayString(Math.floor(1)),          1         ),      ],      64     )  );}

从上面的代码我们可以发现,非白名单标识符都添加了_ctx 变量前缀,那么是如何做到的呢?当本地编译 template 时,处于转换阶段时会对 变量表达式节点NodeTypes.SIMPLE_EXPRESSION进行添加前缀处理,示例代码如下:

const GLOBALS_WHITE_LISTED =  "Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI," +  "decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array," +  "Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt";const isGloballyWhitelisted = (key) => {  return GLOBALS_WHITE_LISTED.split(",").includes(key);};const isLiteralWhitelisted = (key)=>{  return 'true,false,null,this'.split(',').includes(key)}export function processExpression(  node) {  const rewriteIdentifier = (raw) => {    return `_ctx.${raw}`  }  const rawExp = node.content  if (isSimpleIdentifier(rawExp)) {    const isAllowedGlobal = isGloballyWhitelisted(rawExp)    const isLiteral = isLiteralWhitelisted(rawExp)    if (!isAllowedGlobal && !isLiteral) {      node.content = rewriteIdentifier(rawExp)    }    return node  }

当然上面的代码只是简化版本,原版插件还做了精确到了__props $setup,减短变量查询路径,提高性能,还有通过babel编译复杂表达式比如:箭头函数。

看完上述内容,你们对vue3的沙箱机制是什么有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网精选频道,感谢大家的支持。

--结束END--

本文标题: vue3的沙箱机制是什么

本文链接: https://www.lsjlt.com/news/271055.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • vue3的沙箱机制是什么
    今天就跟大家聊聊有关vue3的沙箱机制是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。vue3 沙箱主要分两种浏览器编译版本,浏览器版本是使用with语法加上proxy代理拦截本...
    99+
    2023-06-14
  • 详解vue3沙箱机制
    目录前言浏览器编译版本本地预编译版本总结参考前言 vue3 沙箱主要分两种 浏览器编译版本,浏览器版本是使用with语法加上proxy代理拦截 本地预编译版本,通...
    99+
    2024-04-02
  • 详解vue3的沙箱机制
    目录前言浏览器编译版本本地预编译版本总结前言 vue3 沙箱主要分两种 浏览器编译版本,浏览器版本是使用with语法加上proxy代理拦截 本地预编译版本,通过在...
    99+
    2024-04-02
  • android沙箱机制是什么
    Android沙箱机制是一种安全机制,用于隔离不同应用程序之间的访问权限,确保应用程序只能访问其被授权的资源和数据。它通过将每个应用...
    99+
    2023-08-26
    android
  • Java应用程序的安全沙箱机制是什么
    这篇“Java应用程序的安全沙箱机制是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java应用程序的安全沙箱机制是什么...
    99+
    2023-06-03
  • android沙箱机制怎么应用
    Android沙箱机制是指将每个应用程序都限制在自己的运行环境中,不能访问其他应用程序的资源和数据。应用程序之间相互隔离,提高了系统...
    99+
    2023-09-20
    android
  • docker怎么使用沙箱机制
    Docker使用了Linux内核提供的沙箱机制来隔离应用程序的运行环境。下面是使用Docker的沙箱机制的步骤:1. 安装Docke...
    99+
    2023-09-20
    docker
  • javascript沙箱指的是什么意思
    小编给大家分享一下javascript沙箱指的是什么意思,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! javascript中沙箱是指一块完全独立的区域,使用的...
    99+
    2024-04-02
  • Flex跨域访问沙箱问题的解决方案是什么
    Flex跨域访问沙箱问题的解决方案是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。当Flex访问WebService服务时,在本地能够正常访问,当部署到we...
    99+
    2023-06-17
  • 美国服务器沙箱、蜜罐和欺骗防御的概念是什么
    美国服务器沙箱、蜜罐和欺骗防御的概念是:1、沙箱是为测试人工智能应用程序而引入的技术,能令恶意软件在一个封闭的环境中安装并执行;2、蜜罐是为诱捕攻击者而专门设置的脆弱系统,常被配置成模拟一个实际的网络,有文件服务器、Web服务器等;3、网络...
    99+
    2024-04-02
  • Vue3的setup执行时机是什么
    本文小编为大家详细介绍“Vue3的setup执行时机是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue3的setup执行时机是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新...
    99+
    2024-04-02
  • 怎么实现JavaScript沙箱的基础功能
    这篇文章主要介绍“怎么实现JavaScript沙箱的基础功能”,在日常操作中,相信很多人在怎么实现JavaScript沙箱的基础功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么实现JavaScript沙...
    99+
    2023-06-25
  • Vue3组件异步更新和nextTick运行机制是什么
    这篇文章主要讲解了“Vue3组件异步更新和nextTick运行机制是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue3组件异步更新和nextTick运行机制是什么”吧!组件的异步更新...
    99+
    2023-07-06
  • Java中的装箱和拆箱是什么
    本篇内容介绍了“Java中的装箱和拆箱是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录装箱拆箱==null总结装箱八大基本类型都有一...
    99+
    2023-06-20
  • C#装箱和拆箱是什么
    这篇文章主要讲解了“C#装箱和拆箱是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#装箱和拆箱是什么”吧!装箱:将值类型转换为引用类型。拆箱:将引用类型转换为值类型。值类型是一种相对轻...
    99+
    2023-06-17
  • java装箱和拆箱的概念是什么
    Java装箱和拆箱是将基本数据类型转换为对应的包装类类型(装箱)和将包装类类型转换为对应的基本数据类型(拆箱)的过程。装箱(Boxi...
    99+
    2023-10-07
    java
  • Java的SPI机制是什么
    本篇内容介绍了“Java的SPI机制是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!SPI的全名为Service Provider In...
    99+
    2023-06-17
  • Java的ClassLoader机制是什么
    本篇内容介绍了“Java的ClassLoader机制是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!JVM在加载类的时候,都是通过Cla...
    99+
    2023-06-17
  • MapReduce的Shuffle机制是什么
    这篇文章主要介绍“MapReduce的Shuffle机制是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MapReduce的Shuffle机制是什么”文章能帮助大家解决问题。Shuffle过程,...
    99+
    2023-06-27
  • 长沙建立网站的流程是什么
    长沙建立网站的流程包括以下步骤:1. 确定网站目标和需求:确定网站用途、目标受众、功能需求等,制定网站策略。2. 网站设计:根据网站...
    99+
    2023-06-13
    长沙建立网站
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作