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

Vue編譯器AST抽象語法樹源碼分析

 更新時間:2022年07月13日 15:10:35   作者:李李  
這篇文章主要為大家介紹了Vue編譯器AST抽象語法樹源碼分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

引言

接上篇  Vue編譯器源碼分析compile 解析

baseCompile主要核心代碼

// `createCompilerCreator` allows creating compilers that use alternative
// parser/optimizer/codegen, e.g the SSR optimizing compiler.
// Here we just export a default compiler using the default parts.
var createCompiler = createCompilerCreator(function baseCompile(
	template,
	options
) {
	var ast = parse(template.trim(), options);
	if (options.optimize !== false) {
	}
	var code = generate(ast, options);
	return {
		ast: ast,
		render: code.render,
		staticRenderFns: code.staticRenderFns
	}
});

可以看到 baseCompile 的代碼非常的簡短主要核心代碼。

  • var ast =parse(template.trim(), options); parse 會用正則等方式解析 template 模板中的指令、class、style等數(shù)據(jù),形成AST。
  • optimize(ast, options); optimize 的主要作用是標記 static 靜態(tài)節(jié)點,這是 Vue 在編譯過程中的一處優(yōu)化,后面當 update 更新界面時,會有一個 patch 的過程, diff 算法會直接跳過靜態(tài)節(jié)點,從而減少了比較的過程,優(yōu)化了 patch 的性能。
  • var code =generate(ast, options); 生成目標平臺所需的代碼,將 AST 轉(zhuǎn)化成 render function 字符串的過程,得到結(jié)果是 render 的字符串以及 staticRenderFns 字符串。

最終 baseCompile 的返回值

{
 	ast: ast,
 	render: code.render,
 	staticRenderFns: code.staticRenderFns
 }

最終返回了抽象語法樹( ast ),渲染函數(shù)( render ),靜態(tài)渲染函數(shù)( staticRenderFns ),且render 的值為code.render ,staticRenderFns 的值為code.staticRenderFns ,也就是說通過 generate 處理 ast 之后得到的返回值 code 是一個對象 ...

接下來讓我們把目光聚焦在 Vue 的 parser,它是如何將字符串模板解析為抽象語法樹(AST)的。

var ast = parse(template.trim(), options);

在講解parse之前你需要對編譯過程以及其中的技術(shù)點有個宏觀、概要的了解。

引用自維基百科:

它主要的目的是將便于人編寫、閱讀、維護的高級計算機語言所寫作的源代碼程序,翻譯為計算機能解讀、運行的低階機器語言的程序。源代碼一般為高階語言(High-level language),如Pascal、C、C++、C# 、Java等,而目標語言則是匯編語言或目標機器的目標代碼(Object code)。

編譯器的技術(shù)分為詞法分析、語法分析和語義分析三個部分,通常編譯器的第一項工作叫做詞法分析。就像閱讀文章一樣,文章是由一個個的中文單詞組成的。程序處理也一樣,只不過這里不叫單詞,而是叫做“詞法記號”,英文叫 Token。

<div id="app" v-if="ret">{{ message }}</div>

編譯器會識別出 div a span 這些標簽,id class style v-if v-for 這樣的屬性、指令,還有花括號符號這樣的插值操作...等。這些都是 Token。

如何寫一個程序來識別 Token

那么,如何寫一個程序來識別 Token 呢?

其實,我們可以手寫程序制定一些規(guī)則來區(qū)分每個不同的 Token,這些規(guī)則用“正則文法”表達,符合正則文法的表達式稱為“正則表達式”。通過他們來完成具體的詞法分析工作。

編譯器下一個階段的工作是語法分析。詞法分析是識別一個個的單詞,而語法分析就是在詞法分析的基礎(chǔ)上識別出程序的語法結(jié)構(gòu)。這個結(jié)構(gòu)是一個樹狀結(jié)構(gòu),是計算機容易理解和執(zhí)行的。

程序也要定義良好的語法結(jié)構(gòu),它的語法分析過程,就是構(gòu)造這么一棵樹。一個程序就是一棵樹,這棵樹叫做抽象語法樹(Abstract Syntax Tree,AST)。樹的每個節(jié)點(子樹)是一個語法單元,這個單元的構(gòu)成規(guī)則就叫“語法”。

而我們這里要講的 parser 就是在編譯器對源代碼處理的第一步,parser 把某種特定格式的文本(字符串)轉(zhuǎn)換成某種數(shù)據(jù)結(jié)構(gòu)的程序(對象),并且這個數(shù)據(jù)結(jié)構(gòu)是編譯器能夠理解的,因為編譯器的后續(xù)步驟,比如上面提到的 句法分析,類型檢查/推導(dǎo),代碼優(yōu)化,代碼生成 等等都依賴于該數(shù)據(jù)結(jié)構(gòu)。

注:parse & parser 這兩個單詞,不要混淆,parse 是動詞,代表“解析”的過程,parser 是名詞,代表“解析器”。

Vue 的編譯器也不例外, 在詞法分析階段 Vue 會把字符串模板解析成一個個的令牌(token),該令牌將用于句法分析階段,在句法分析階段會根據(jù)令牌生成一棵 AST,最后再根據(jù)該 AST生成最終的渲染函數(shù),這樣就完成了代碼的生成。

var ast = parse(template.trim(), options);

parse 函數(shù)解析模板字符串

回歸到剛剛的代碼,已知 parse 函數(shù)就是用來解析模板字符串的,最終生成AST。

function parse(template, options) {
   // 省略...
  parseHTML(template, {
    warn,
    expectHTML: options.expectHTML,
    isUnaryTag: options.isUnaryTag,
    canBeLeftOpenTag: options.canBeLeftOpenTag,
    shouldDecodeNewlines: options.shouldDecodeNewlines,
    shouldDecodeNewlinesForHref: options.shouldDecodeNewlinesForHref,
    shouldKeepComment: options.comments,
    start (tag, attrs, unary) {
      // 省略...
    },
    end () {
      // 省略...
    },
    chars (text: string) {
      // 省略...
    },
    comment (text: string) {
      // 省略...
    }
  })
  return root
}

需要注意到在parse 函數(shù)內(nèi)部主要通過調(diào)用parseHTML 函數(shù)對模板字符串進行解析,實際上parseHTML 函數(shù)的作用就是用來做詞法分析的,而parse函數(shù)的作用則是在詞法分析的基礎(chǔ)上做句法分析從而生成一棵AST。本節(jié)我們主要分析一下Vue是如何對模板字符串進行詞法分析的,也就是parseHTML 函數(shù)的實現(xiàn)。

接下來我們章節(jié)會分為兩個方向

一:parseHTML 函數(shù)源碼解析

二:Vue編譯器token解析規(guī)則-正則分析

以上就是Vue編譯器AST抽象語法樹源碼分析的詳細內(nèi)容,更多關(guān)于Vue編譯器AST抽象語法樹的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • vue關(guān)于頁面刷新的幾個方式解讀

    vue關(guān)于頁面刷新的幾個方式解讀

    這篇文章主要介紹了vue關(guān)于頁面刷新的幾個方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Vue Steps步驟條渲染異常問題

    Vue Steps步驟條渲染異常問題

    這篇文章主要介紹了Vue Steps步驟條渲染異常問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Vue中的事件綁定問題

    Vue中的事件綁定問題

    這篇文章主要介紹了Vue中的事件綁定問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Vue.js如何利用v-for循環(huán)生成動態(tài)標簽

    Vue.js如何利用v-for循環(huán)生成動態(tài)標簽

    這篇文章主要給大家介紹了關(guān)于Vue.js如何利用v-for循環(huán)生成動態(tài)標簽的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2022-01-01
  • vue引入Excel表格插件的方法

    vue引入Excel表格插件的方法

    這篇文章主要為大家詳細介紹了vue引入Excel表格插件的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • vue axios請求攔截實例代碼

    vue axios請求攔截實例代碼

    axios 是一個基于Promise 用于瀏覽器和 nodejs 的 HTTP 客戶端.這篇文章主要介紹了vue/axios請求攔截的相關(guān)知識,需要的朋友可以參考下
    2018-03-03
  • Vue3實現(xiàn)pdf預(yù)覽功能

    Vue3實現(xiàn)pdf預(yù)覽功能

    在開發(fā)中,PDF預(yù)覽和交互功能是一個常見的需求,無論是管理系統(tǒng)、在線教育平臺,還是企業(yè)內(nèi)部的知識庫,能夠高效地展示和操作PDF文件都能極大地提升用戶體驗,本文將詳細介紹如何在Vue項目中實現(xiàn)pdf預(yù)覽功能,需要的朋友可以參考下
    2025-03-03
  • vue3.0如何修改瀏覽器標題(靜態(tài))

    vue3.0如何修改瀏覽器標題(靜態(tài))

    這篇文章主要介紹了vue3.0如何修改瀏覽器標題(靜態(tài)),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • vue項目怎樣用nginx反向代理WebSocket請求地址

    vue項目怎樣用nginx反向代理WebSocket請求地址

    這篇文章主要介紹了vue項目怎樣用nginx反向代理WebSocket請求地址問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 干貨!教大家如何選擇Vue和React

    干貨!教大家如何選擇Vue和React

    Vue和React之間如何選擇,這篇文章主要為大家詳細介紹了Vue和React兩者之間的相同之處,教大家該如何進行選擇,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03

最新評論

安新县| 兴义市| 永春县| 山东省| 纳雍县| 马鞍山市| 巴东县| 庄浪县| SHOW| 丰宁| 聊城市| 阿坝| 怀安县| 罗山县| 亚东县| 积石山| 汝南县| 和田县| 长春市| 张家川| 杭州市| 渝中区| 阜南县| 郑州市| 丰县| 沈丘县| 重庆市| 威信县| 勐海县| 万全县| 嘉义县| 芒康县| 玛多县| 名山县| 文登市| 法库县| 增城市| 阳信县| 阿拉尔市| 南郑县| 淮北市|