最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue parseHTML函數(shù)源碼解析 AST預(yù)備知識

 更新時(shí)間:2022年07月13日 17:15:23   作者:李李  
這篇文章主要為大家介紹了vue parseHTML函數(shù)源碼解析 AST預(yù)備知識示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

正文

接上章節(jié):parseHTML 函數(shù)源碼解析AST 基本形成

在正式扎進(jìn)Vue parse源碼之前,我們先了解下他周邊的工具函數(shù), 這能幫我們快速的去理解閱讀。

還記得我們在上章節(jié)講的element元素節(jié)點(diǎn)的描述對象嗎?

var element = {
	type: 1,
	tag: tag,
	parent: null,
	attrsList: attrs,
	children: []
}

在源碼中定義了一個(gè)createASTElement函數(shù),用來創(chuàng)建一個(gè)元素的描述對象。

createASTElement函數(shù)

function createASTElement(tag, attrs, parent) {
		return {
			type: 1,
			tag: tag,
			attrsList: attrs,
			attrsMap: makeAttrsMap(attrs),
			parent: parent,
			children: []
		}
	}

解析指令所用正則

var onRE = /^@|^v-on:/;
var dirRE = /^v-|^@|^:/;
var forAliasRE = /([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/;
var forIteratorRE = /,([^,\}\]]*)(?:,([^,\}\]]*))?$/;
var stripParensRE = /^\(|\)$/g;
var argRE = /:(.*)$/;
var bindRE = /^:|^v-bind:/;
var modifierRE = /\.[^.]+/g;

在解析開始標(biāo)簽的時(shí)候你遇到的不僅有屬性,還有一些Vue 自定義的指令。下面一起來分析下解析指令會(huì)有用哪些正則。

onRE

var onRE = /^@|^v-on:/;

匹配以字符 @ 或 v-on: 開頭的字符串,主要作用是檢測標(biāo)簽屬性名是否是監(jiān)聽事件的指令。

dirRE

var const dirRE = /^v-|^@|^:/

匹配以字符 v- 或 @ 或 : 開頭的字符串,主要作用是檢測標(biāo)簽屬性名是否是指令。在Vue中所有以 v- 開頭的屬性都被認(rèn)為是指令,另外@字符是 v-on 的縮寫,: 字符是 v-bind 的縮寫。

forAliasRE

var forAliasRE = /([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/;

匹配 v-for 屬性的值,并捕獲 in 或 of 前后的字符串。都是正則大神就不解釋怎么捕獲的了。

forIteratorRE

var forIteratorRE = /,([^,\}\]]*)(?:,([^,\}\]]*))?$/;

這個(gè)也是匹配v-for的屬性值,不過比之前要稍微復(fù)雜點(diǎn):列表渲染 v-for(https://cn.vuejs.org/v2/guide/list.html)需要先了解下這個(gè)。

//示例:1
<div v-for="(value, name) in object">
  {{ name }}: {{ value }}
</div>
//示例:2 
<div v-for="(value, name, index) in object">
  {{ index }}. {{ name }}: {{ value }}
</div>

沒錯(cuò)就是用來捕獲,示例1中的:'obj , index' 示例2中的:'value, key, index' 。

stripParensRE

var stripParensRE = /^\(|\)$/g;

這個(gè)捕獲組用來捕獲要么以字符 ( 開頭,要么以字符 ) 結(jié)尾的字符串,或者兩者都滿足。那么這個(gè)正則的作用是什么呢?我們在講解正則 forIteratorRE 時(shí)有個(gè)細(xì)節(jié)不知道大家注意到了沒有,就是 forIteratorRE 正則所匹配的字符串是 'obj, index' ,而不是 '(obj, index)' ,這兩個(gè)字符串的區(qū)別就在于第二個(gè)字符串擁有左右括號,所以在使用 forIteratorRE 正則之前,需要使用 stripParensRE 正則去掉字符串 '(obj, index)' 中的左右括號,實(shí)現(xiàn)方式很簡單:

"(obj, index)".replace(stripParensRE, "")

argRE

var argRE = /:(.*)$/;

argRE正則用來匹配指令編寫中的參數(shù),并且擁有一個(gè)捕獲組,用來捕獲參數(shù)的名字。

示例:

<div v-on:click.item="handle"></div>

其中 v-on 為指令,click為傳遞給 v-on 指令的參數(shù),stop 為修飾符。

bindRE

var bindRE = /^:|^v-bind:/;

該正則用來匹配以字符:或字符串 v-bind: 開頭的字符串,主要用來檢測一個(gè)標(biāo)簽的屬性是否是綁定(v-bind)。

modifierRE

var modifierRE = /\.[^.]+/g;

該正則用來匹配修飾符的,但是并沒有捕獲任何東西,但你可以用match、exec等方法獲取與當(dāng)前正則匹配成功的信息。

parse 函數(shù)中的變量

在講解 parse 函數(shù)直接我們還需要先了解下它內(nèi)部所定義的一些變量以及用途。

function parse(template, options) {
	warn$2 = options.warn || baseWarn;
	platformIsPreTag = options.isPreTag || no;
	platformMustUseProp = options.mustUseProp || no;
	platformGetTagNamespace = options.getTagNamespace || no;
	transforms = pluckModuleFunction(options.modules, 'transformNode');
	preTransforms = pluckModuleFunction(options.modules, 'preTransformNode');
	postTransforms = pluckModuleFunction(options.modules, 'postTransformNode');
	delimiters = options.delimiters;
	var stack = [];
	var preserveWhitespace = options.preserveWhitespace !== false;
	var root;
	var currentParent;
	var inVPre = false;
	var inPre = false;
	var warned = false;
	function warnOnce(msg) {
        //...
	}
	function closeElement(element) {
       //...
	}
	parseHTML(template, {
		warn: warn$2,
		expectHTML: options.expectHTML,
		isUnaryTag: options.isUnaryTag,
		canBeLeftOpenTag: options.canBeLeftOpenTag,
		shouldDecodeNewlines: options.shouldDecodeNewlines,
		shouldDecodeNewlinesForHref: options.shouldDecodeNewlinesForHref,
		shouldKeepComment: options.comments,
		start: function start(tag, attrs, unary) {},
		end: function end() {},
		chars: function chars(text) {},
		comment: function comment(text) {},
	});
	return root
}

我們先來看下針對web平臺(tái)初始化的一些變量。

warn$2 = options.warn || baseWarn;
platformIsPreTag = options.isPreTag || no;
platformMustUseProp = options.mustUseProp || no;
platformGetTagNamespace = options.getTagNamespace || no;
transforms = pluckModuleFunction(options.modules, 'transformNode');
preTransforms = pluckModuleFunction(options.modules, 'preTransformNode');
postTransforms = pluckModuleFunction(options.modules, 'postTransformNode');
delimiters = options.delimiters;
  • warn$2 函數(shù) 毋庸置疑它作用是用來打印警告信息的
  • platformIsPreTag 函數(shù)是一個(gè)編譯器選項(xiàng),其作用是通過給定的標(biāo)簽名字判斷該標(biāo)簽是否是 pre 標(biāo)簽。
  • platformMustUseProp 該函數(shù)也是一個(gè)編譯器選項(xiàng),其作用是用來檢測一個(gè)屬性在標(biāo)簽中是否要使用元素對象原生的 prop 進(jìn)行綁定。
  • platformGetTagNamespace 該函數(shù)是一個(gè)編譯器選項(xiàng),其作用是用來獲取元素(標(biāo)簽)的命名空間。
  • transforms 、preTransforms 、postTransforms 還沒講到它們的上下文,暫時(shí)不解釋它們的作用。
  • delimiters 它的值為 options.delimiters 屬性,它的值就是在創(chuàng)建 Vue 實(shí)例對象時(shí)所傳遞的 delimiters 選項(xiàng)。

繼續(xù)往下看:

var stack = [];
var preserveWhitespace = options.preserveWhitespace !== false;
var root;
var currentParent;
var inVPre = false;
var inPre = false;
var warned = false;
  • stack 初始值是一個(gè)空數(shù)組,作用在上個(gè)章節(jié)我們講到,回退操作為了讓子元素描述對象的parent屬性能夠正確指向其父元素。
  • preserveWhitespace 是一個(gè)布爾值并且它的值與編譯器選項(xiàng)中的options.preserveWhitespace選項(xiàng)有關(guān),只要 options.preserveWhitespace 的值不為false,那么 preserveWhitespace 的值就為真。其中 options.preserveWhitespace 選項(xiàng)用來告訴編譯器在編譯 html 字符串時(shí)是否放棄標(biāo)簽之間的空格,如果為 true 則代表放棄。
  • root 存儲(chǔ)最終生成的AST。
  • currentParent 通過上章節(jié)了解到,該變量維護(hù)元素描述對象之間的父子關(guān)系。
  • inVPre 初始值:false。標(biāo)識當(dāng)前解析的標(biāo)簽是否在擁有 v-pre (跳過這個(gè)元素和它的子元素的編譯過程。)的標(biāo)簽之內(nèi)。
  • inPre 初始值:false。標(biāo)識當(dāng)前正在解析的標(biāo)簽是否在 <pre></pre> 標(biāo)簽之內(nèi)。
  • warned 初始值:false。用來打印警告信息的函數(shù),只不過 warnOnce 函數(shù)就如它的名字一樣,只會(huì)打印一次警告信息,并且 warnOnce 函數(shù)也是通過調(diào)用 warn 函數(shù)來實(shí)現(xiàn)的。

好了一些邊邊角角的東西就先講到這,接下來我們一起來分析Vue parse源碼看看一顆完整的AST樹是如何構(gòu)建出來的。更多關(guān)于vue parseHTML函數(shù)AST預(yù)備的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • vue3響應(yīng)式Proxy與Reflect的理解及基本使用實(shí)例詳解

    vue3響應(yīng)式Proxy與Reflect的理解及基本使用實(shí)例詳解

    這篇文章主要為大家介紹了vue3響應(yīng)式Proxy與Reflect的理解及基本使用實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • VUE中的filters過濾器使用方法

    VUE中的filters過濾器使用方法

    這篇文章主要介紹了VUE中的filters過濾器使用方法,文章主要通過描述全局過濾器、全局過濾器之單一掛載、全局過濾器之批量掛載?、組件過濾器展開內(nèi)容,具有一定的參考價(jià)值組要的小伙伴可以參考一下
    2022-03-03
  • vue實(shí)現(xiàn)PC端分辨率適配操作

    vue實(shí)現(xiàn)PC端分辨率適配操作

    這篇文章主要介紹了vue實(shí)現(xiàn)PC端分辨率適配操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Vue中component標(biāo)簽解決項(xiàng)目組件化操作

    Vue中component標(biāo)簽解決項(xiàng)目組件化操作

    這篇文章主要介紹了Vue中component標(biāo)簽解決項(xiàng)目組件化操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • vue 解除鼠標(biāo)的監(jiān)聽事件的方法

    vue 解除鼠標(biāo)的監(jiān)聽事件的方法

    這篇文章主要介紹了vue 解除鼠標(biāo)的監(jiān)聽事件的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • vue實(shí)現(xiàn)table表格里面數(shù)組多層嵌套取值

    vue實(shí)現(xiàn)table表格里面數(shù)組多層嵌套取值

    這篇文章主要介紹了vue實(shí)現(xiàn)table表格里面數(shù)組多層嵌套取值,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • vue+node 實(shí)現(xiàn)視頻在線播放的實(shí)例代碼

    vue+node 實(shí)現(xiàn)視頻在線播放的實(shí)例代碼

    這篇文章主要介紹了vue+node 實(shí)現(xiàn)視頻在線播放的實(shí)例代碼,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Vue如何處理圖片加載失敗時(shí)自動(dòng)替換備用圖片

    Vue如何處理圖片加載失敗時(shí)自動(dòng)替換備用圖片

    這篇文章主要為大家詳細(xì)介紹了當(dāng)圖片加載失敗時(shí),Vue如何實(shí)現(xiàn)自動(dòng)替換備用圖片功能,文中的示例代碼簡潔易懂,有需要的小伙伴可以了解下
    2024-11-11
  • vue + element ui實(shí)現(xiàn)播放器功能的實(shí)例代碼

    vue + element ui實(shí)現(xiàn)播放器功能的實(shí)例代碼

    這篇文章主要介紹了vue + element ui實(shí)現(xiàn)播放器功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • vue任意關(guān)系組件通信與跨組件監(jiān)聽狀態(tài)vue-communication

    vue任意關(guān)系組件通信與跨組件監(jiān)聽狀態(tài)vue-communication

    這篇文章主要介紹了vue任意關(guān)系組件通信與跨組件監(jiān)聽狀態(tài)vue-communication,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10

最新評論

包头市| 昆山市| 丹江口市| 胶南市| 鹿泉市| 北川| 镇原县| 阳新县| 行唐县| 永川市| 孟村| 新丰县| 彭山县| 西和县| 沙湾县| 宝丰县| 南平市| 洪湖市| 浏阳市| 郧西县| 扬州市| 绥棱县| 沁源县| 东乌| 赤水市| 永兴县| 芜湖市| 浦东新区| 平和县| 肇东市| 府谷县| 惠州市| 金坛市| 华池县| 汨罗市| 杭州市| 宁陕县| 濮阳市| 景东| 本溪| 沁阳市|