日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

詳解vue3的沙箱機制

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

vue3 沙箱主要分兩種

瀏覽器編譯版本,瀏覽器版本是使用with語法加上proxy代理攔截 本地預編譯版本,通過在模版預編譯階段轉(zhuǎn)換階段,使用轉(zhuǎn)換插件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 時,處于轉(zhuǎn)換階段時會對 變量表達式節(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
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
97精品国产一区二区三区 | 亚洲国产专区| 国产成人精品亚洲线观看| 国产极品一区| 久久三级毛片| 精品三级av| 91欧美国产| 色爱av综合网| 性欧美xxxx免费岛国不卡电影| 成人污污视频| 色爱综合网欧美| 五月激情久久| 欧美特黄一区| 伊人久久一区| 国产探花在线精品| 麻豆视频观看网址久久| 欧美黄页在线免费观看| 成人在线视频免费| 亚洲精品一区三区三区在线观看| 99精品在线免费在线观看| 亚洲黄色影院| 日韩av在线播放中文字幕| 国产精品v一区二区三区| 精品视频99| 激情久久五月| 日韩一区精品视频| 国产精品一区二区精品 | 亚洲国产欧美日本视频| 色偷偷偷在线视频播放| 久久久久中文| 亚洲一区二区三区高清| 日本少妇精品亚洲第一区| 美日韩一区二区三区| 日韩亚洲一区在线| 亚洲午夜在线| 日韩精品成人| 国产成人免费av一区二区午夜| 香蕉人人精品| 亚洲不卡系列| 婷婷成人在线| 国产精品成人3p一区二区三区| 亚洲人成亚洲精品| 99国产精品久久久久久久成人热 | 国产欧美在线观看免费| 日韩中文首页| 日韩二区三区在线观看| 亚洲欧美日韩国产综合精品二区| 成人在线视频中文字幕| 日韩精品一卡| 亚洲91网站| 欧美日韩国产免费观看视频| 国产精品美女午夜爽爽| 欧美精品97| 亚洲免费福利一区| 视频一区日韩| 欧美中文日韩| 精品久久一区| 夜鲁夜鲁夜鲁视频在线播放| 麻豆精品久久| 欧美精品资源| 久久xxxx| 久久久久久色| 91欧美极品| 色爱综合网欧美| 一级欧美视频| 国产亚洲欧美日韩精品一区二区三区| 婷婷久久免费视频| 久久亚洲国产精品一区二区| 国产精品18| 国产视频一区三区| 精品久久久久久久| 婷婷久久一区| 国产中文欧美日韩在线| 日韩在线观看中文字幕| 91精品国产91久久久久久黑人| 日韩国产欧美在线播放| 精品一区三区| 成人在线黄色| 91精品国产一区二区在线观看| 久久久久亚洲| 麻豆精品在线| 日日夜夜免费精品| 欧美亚洲国产激情| 免费视频一区二区三区在线观看| 尤物精品在线| 日韩欧美在线中字| 国产日韩精品视频一区二区三区| 99视频+国产日韩欧美| 国精品产品一区| 日韩av一级片| 蜜臀av国产精品久久久久| 亚洲91视频| 国产成人精品三级高清久久91 | 国产精品日本一区二区三区在线| 日韩网站在线| 91精品久久久久久久久久不卡| 久久超碰99| 日本一区二区中文字幕| 欧洲激情综合| 日韩国产综合| 日韩av二区在线播放| 国产婷婷精品| 激情久久五月| 欧美日韩一区二区三区视频播放| 色婷婷色综合| 国产第一亚洲| 国产精东传媒成人av电影| 中文字幕av一区二区三区四区| 91精品一区二区三区综合在线爱 | 国产精品三上| 国产91精品对白在线播放| 免费视频一区二区三区在线观看| 亚洲三级毛片| 亚洲2区在线| 蜜桃久久久久久| 国产视频亚洲| 久久亚洲美女| 一区二区三区四区精品视频| 91精品观看| 怡红院精品视频在线观看极品| 精品一区免费| 欧美日韩四区| 噜噜噜躁狠狠躁狠狠精品视频| 婷婷激情图片久久| 国产日韩专区| 中文字幕一区二区三区日韩精品 | 亚洲精品影视| 蜜桃视频一区二区三区在线观看| 国产亚洲毛片在线| 婷婷亚洲五月| 日韩视频不卡| 蜜臀av性久久久久蜜臀aⅴ四虎| 久久午夜影视| 亚洲免费一区三区| 欧美日韩调教| 精品国产午夜| 国产一区丝袜| 丁香六月综合| 激情久久婷婷| 久久午夜视频| 亚洲人成毛片在线播放女女| 亚洲三级在线| 国产精品igao视频网网址不卡日韩| 久久精品资源| 日韩欧美三级| 99在线精品免费视频九九视| 蜜臀精品久久久久久蜜臀| 热久久久久久| 精品久久久亚洲| 999精品色在线播放| 一区在线视频观看| 日韩在线一二三区| 欧美天堂一区二区| 高清av一区| 宅男在线一区| 亚洲精品一二| 久久精品一区| 色婷婷久久久| 久热综合在线亚洲精品| 国产免费av一区二区三区| 精品高清久久| 免费视频亚洲| 日本91福利区| 久久久久久网| 性欧美长视频| 另类欧美日韩国产在线| 亚洲天堂免费电影| 免费不卡在线视频| 你懂的国产精品| 999久久久免费精品国产| 亚洲1区在线| 精品视频网站| 宅男噜噜噜66国产日韩在线观看| 日韩国产欧美三级| 成人福利视频| 亚洲欧美日本国产| 国产一区二区三区网| 日韩午夜av在线| 久久精品国产99国产| 激情综合网站| 国产精品三p一区二区| 日韩精品欧美| 欧美色综合网| 午夜日韩av| 欧美成人aaa| 中文亚洲欧美| 91嫩草亚洲精品| 亚洲美女久久| 久久精品1区| 亚洲乱亚洲高清| 亚洲天堂一区二区| 国产欧美亚洲一区| 99国产精品| 国产66精品| 日韩手机在线| 午夜国产欧美理论在线播放 | 视频一区视频二区在线观看| 美女精品视频在线| 日韩影院在线观看| 播放一区二区|