成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

詳解vue3的沙箱機制

瀏覽:2日期:2022-09-30 16:42:22
前言

vue3 沙箱主要分兩種

瀏覽器編譯版本,瀏覽器版本是使用with語法加上proxy代理攔截 本地預編譯版本,通過在模版預編譯階段轉換階段,使用轉換插件transformExpression將非白名單標識符掛在在組件代理對象下 瀏覽器編譯版本

render 函數(shù)編譯結果

<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 /* TEXT */), _createVNode( 'div', null, _toDisplayString(Math.floor(1)), 1 /* TEXT */ ),],64 /* STABLE_FRAGMENT */ ) ); }};

從上面的代碼,我們能發(fā)現(xiàn),變量標識符沒有增加前綴,只是用with語法包裹了一下,延長作用域鏈,那么是如何做到 js 沙箱攔截的呢?例如變量test, 理論上說,當前作用域鏈沒有test變量,變量會從上一層作用域查找,直到查找到全局作用域,但是,實際上只會在_ctx上查找, 原理很簡單,_ctx是一個代理對象,那么我們?nèi)绾问褂肞roxy做攔截,示例代碼如下:

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,不觸發(fā)get 攔截,從上一層作用域查找變量 // 如果不是 全局對象 返回true,觸發(fā)get 攔截 return !isGloballyWhitelisted(key); },});

代碼很簡單,為什么這么簡單的代碼就能做到攔截? 因為 with 語句會觸發(fā) has 攔截,當 has 返回 true,就會 觸發(fā)代理對象 get 攔截,如果返回 false, 則代理對象 get 攔截不會觸發(fā),變量不在當前代理對象查找,直接查找更上一層作用域

本地預編譯版本

<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 /* TEXT */),_createVNode( 'div', null, _toDisplayString(Math.floor(1)), 1 /* TEXT */), ], 64 /* STABLE_FRAGMENT */ ) );}

從上面的代碼我們可以發(fā)現(xiàn),非白名單標識符都添加了_ctx 變量前綴,那么是如何做到的呢?當本地編譯 template 時,處于轉換階段時會對 變量表達式節(jié)點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編譯復雜表達式比如:箭頭函數(shù)。

總結

整個 vue3 js 沙箱機制就解釋結束了,當初瀏覽器編譯版本困擾了我很久,因為不知道 has 可以攔截 with 語句變量查詢

以上就是詳解vue3的沙箱機制的詳細內(nèi)容,更多關于vue3 沙箱機制的資料請關注好吧啦網(wǎng)其它相關文章!

標簽: Vue
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
精品99一区二区| 亚洲欧美日韩国产成人精品影院 | 国产午夜精品久久| 国产成人精品亚洲午夜麻豆| 在线观看国产91| 午夜精品成人在线视频| 男女精品视频| 亚洲国产一二三| 国产精品久久777777毛茸茸| 亚洲日本va在线观看| 激情视频一区二区三区| 亚洲国产精品二十页| 99精品国产一区二区三区不卡| 91精品国产91久久综合桃花 | 日韩亚洲视频| 亚洲久草在线视频| 亚洲毛片av| 亚洲国产日产av| 久久久久一区二区三区| 日本人妖一区二区| 欧美综合天天夜夜久久| 黄色资源网久久资源365| 欧美精品精品一区| 韩国精品主播一区二区在线观看| 91福利视频久久久久| 美女免费视频一区二区| 欧美在线视频你懂得| 久久成人免费电影| 欧美精品三级在线观看| 国产精品99久久久久久宅男| 日韩欧美国产午夜精品| 99re热这里只有精品视频| 久久久影院官网| 激情成人综合| 亚洲视频一区二区在线| 99re热精品| 日韩国产欧美一区二区三区| 欧美日韩一本到| 丁香天五香天堂综合| 日韩欧美成人一区二区| 国产成人av福利| 久久久精品免费网站| 欧美成人中文| 中文字幕一区二区三中文字幕| 9色精品在线| 亚洲成人你懂的| 在线免费观看不卡av| 激情都市一区二区| 久久亚洲私人国产精品va媚药| 韩日视频一区| 午夜日韩在线电影| 欧美日韩一区二区三区不卡| 成人性色生活片免费看爆迷你毛片| 久久免费看少妇高潮| 亚洲欧美一级二级三级| 一区二区三区在线免费播放| 99久久综合精品| 成人欧美一区二区三区1314| 色综合久久久网| 国内欧美视频一区二区| 久久嫩草精品久久久久| 永久久久久久| 亚洲777理论| 91精品国产aⅴ一区二区| av在线播放成人| 一区二区中文字幕在线| 久久大香伊蕉在人线观看热2| 老司机精品视频在线| 日韩一区二区影院| 亚洲第一狼人社区| 欧美精品精品一区| 99国产精品视频免费观看| 成人欧美一区二区三区白人| 久久久久久穴| 国产一区二区三区蝌蚪| 欧美va亚洲va| 亚洲香蕉网站| 亚洲图片欧美色图| 欧美日韩综合色| 成人97人人超碰人人99| 亚洲欧美在线观看| 色综合久久精品| 国产成人精品免费| 国产精品麻豆欧美日韩ww| 国产欧美一区二区色老头| 麻豆精品久久久| 国产亚洲欧美色| 一区二区三区成人精品| 国产在线不卡视频| 欧美激情艳妇裸体舞| 久久成人亚洲| 国产美女久久久久| 国产欧美一区二区三区鸳鸯浴 | 欧美亚洲不卡| 亚洲综合久久久| 8x8x8国产精品| 亚洲欧洲另类| 蜜桃在线一区二区三区| 久久久久久久网| 蘑菇福利视频一区播放| 国产一区二区成人久久免费影院| 久久久www免费人成精品| 国产九区一区在线| 国产91精品露脸国语对白| 最新日韩在线视频| 欧美日韩aaaaa| 国内精品福利| 久久国产日韩欧美精品| 欧美国产一区二区在线观看| 先锋a资源在线看亚洲| 成人丝袜18视频在线观看| 亚洲制服丝袜av| wwwwww.欧美系列| 久久成人国产| 97精品超碰一区二区三区| 亚洲一区二区偷拍精品| 精品少妇一区二区三区 | 激情综合在线| 久久91精品国产91久久小草 | 免费观看一级欧美片| 国产调教视频一区| 国产精品推荐精品| 99久久综合色| 久久99久久99| 亚洲精品中文字幕在线观看| 日韩三级在线观看| 欧美亚洲视频| 欧美+日本+国产+在线a∨观看| 日本视频中文字幕一区二区三区| 日本一区二区三区dvd视频在线| 色成人在线视频| 欧美精品导航| 久久精品国产99国产精品| 中文字幕在线播放不卡一区| 欧美亚洲图片小说| 亚洲国产精品久久久久婷婷老年 | 欧美激情偷拍| 喷水一区二区三区| 国产精品二三区| 欧美一区二区三区免费观看视频 | 国产精品电影一区二区| 91精品国产91热久久久做人人| 亚洲美女少妇无套啪啪呻吟| 处破女av一区二区| 天天综合网天天综合色 | 精品一区二区三区在线播放 | 国产亚洲高清视频| 暖暖成人免费视频| 狠狠v欧美v日韩v亚洲ⅴ| 亚洲综合一二区| 欧美日韩精品免费| 国产一区二区三区免费不卡| 午夜天堂精品久久久久| 九九九久久久精品| 午夜欧美电影在线观看| 中文字幕va一区二区三区| 日韩视频一区二区三区在线播放| 久久综合中文色婷婷| 国产日韩在线一区二区三区| 欧美成人午夜| 成人av先锋影音| 国产剧情一区二区三区| 欧美aaaaaa午夜精品| 亚洲最新在线观看| 国产精品视频一二三区| 日韩欧美国产系列| 欧美麻豆精品久久久久久| 亚洲欧美日韩视频二区| 欧美a级一区| 成人精品电影在线观看| 激情综合亚洲精品| 天天色天天操综合| 午夜精品福利一区二区蜜股av| 亚洲精品免费播放| 国产精品看片你懂得| 久久男人中文字幕资源站| 精品国产乱码久久久久久闺蜜| 欧美一卡二卡三卡| 欧美午夜精品免费| 91国产视频在线观看| 久久久一本精品99久久精品66| 在线日韩电影| 含羞草久久爱69一区| 日韩中文字幕区一区有砖一区| 亚洲国产精品一区二区尤物区| 亚洲天堂久久久久久久| 亚洲国产精品av| 久久精品亚洲精品国产欧美| 欧美精品一区二区三区四区| 日韩欧美一级精品久久| 欧美一三区三区四区免费在线看 | 91高清在线观看| 亚洲日本无吗高清不卡| 在线国产精品一区| 永久91嫩草亚洲精品人人| 国产精品mv在线观看| 欧美一区成人| 92国产精品观看| 成人动漫一区二区三区| 国产.欧美.日韩|