日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > vue >内容正文

vue

[Vue源码分析] 模板的编译

發(fā)布時間:2023/12/31 vue 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Vue源码分析] 模板的编译 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

最近小組有個關于vue源碼分析的分享會,提前準備一下…
前言:
Vue有兩個版本:Runtime + Compiler 、 Runtime only ,前者是包含編譯代碼的版本,后者不包含編譯代碼,編譯過程需要借助webpack的vue-loader,接下來分析的是Runtime + Compiler版本,編譯過程感覺挺復雜的,所以下邊只是大概分析一下整個流程,源碼理解直接寫在源碼中。

模板的編譯

之前分析Virtual DOM的時候我們分析過模板到真實 DOM 渲染的過程,中間有一個環(huán)節(jié)把模板編譯成render函數(shù),這個過程稱作編譯。

(1)編譯入口追蹤

編譯入口在分析virtual dom的時候已經(jīng)提及過,位于src/platforms/web/entry-runtime-with-compiler.js下的$mount方法(紅框部分):

可以看到compileToFunctions方法將模板編譯成了render以及staticRenderFns函數(shù),通過對象的解構賦值獲取結果并賦值給options。

compileToFunctions在 src/platforms/web/compiler/index.js中定義,如下:

發(fā)現(xiàn)這是一個賦值的過程,值由createCompiler產生,createCompiler方法在 src/compiler/index.js 中定義,如下:

這個方法是createCompilerCreator的返回值,createCompilerCreator中傳入的參數(shù)是一個方法,在此暫時不看參數(shù)方法里邊的內容,因為這里只是一個調用,并沒有執(zhí)行什么。先看看createCompilerCreator的定義,它的定義在src/compiler/create-compiler.js中,如下:

createCompilerCreator返回一個 createCompiler 的函數(shù),該函數(shù)返回的是一個對象,包括 compile 和compileToFunctions , compileToFunctions對應的就是$mount方法中調用的compileToFunctions 方法,它是 createCompileToFunctionFn 方法的返回值,我們接下來看一下 createCompileToFunctionFn 方法,它的定義在 src/compiler/to-function/js 中,這個函數(shù)便是compileToFunctions的最終定義,如下:

compileToFunctions中編譯的核心是compile的調用,compile是通過參數(shù)的方式傳入的,也就是createCompilerCreator中定義的compile,現(xiàn)在我們返回去看compile是什么,之前的圖折疊了,現(xiàn)在展開如下:

compile前部分代碼都是在處理配置參數(shù),實際上的編譯過程只有代碼中紅框部分,也就是調用baseCompile方法,這個方法時調用createCompilerCreator時通過參數(shù)的方式傳入的,也就是之前介紹到的當時說暫時不用看的代碼,重新上一次圖:

編譯入口追蹤到這里告一段落(vue項目支持多個平臺,不同平臺配置不一樣,所以入口繞了很多個圈)??梢钥吹阶罱K主要步驟有三步,一步是通過parse生成ast樹,一步是optimize,看英文意思及傳入?yún)?shù)應該是對ast樹進行優(yōu)化的一個過程,一步是調用generate生成code,接下來看看這幾個步驟都干了什么。

(2) parse

編譯過程首先就是對模板做解析,生成 AST語法樹,我們可以在parse后debugger一下,看看AST語法樹的模樣。

新建一個vue demo,在main.js做如下配置:

然后再源碼中parse后打個斷點,或者打印一下:

可以看到,控制臺輸入了以下內容,這便是ast的結構:

至此ast的結構我們了解了,但ast是怎么生成的呢?接下來我們看看parse是什么。parse的定義位于src/compiler/parser/index.js中。
這個過程很復雜,概括地說就是把template模板字符串轉換成AST樹,它是一種用JavaScript對象的形式來描述整個模板。整個parse的過程是利用正則表達式順序解析模板,當解析到開始標簽、閉合標簽、文本的時候都會分別執(zhí)行對應的回調函數(shù),最終達到構造AST樹的目的。
這塊內容很多,挑幾個點講一下:

①:解析標簽

解析HTML是通過調用parseHML方法完成的,它的定義位于src/compiler/parser/html-parser
調用:

定義:

這個方法也是比較復雜,整體來說就是循環(huán)解析template ,用頂部預先定義好的一堆正則表達式做正則匹配,處理開始標簽和結束標簽,對于不同情況分別進行不同的處理,直到解析完畢。

比較關鍵的一個點事在匹配的過程中會利用 advance 函數(shù)不斷前進整個模板字符串,直到字符串末尾。

舉個例子:

假如模板本來是這個樣子的,可以理解為一個隊列,目前隊列的索引為0:

通過調用advance(4)后,通過html.substring(4),隊列的索引就變成了4,當前待解析模板就變成了如下:

②:解析文本、表達式

除了處理開始標簽和結束標簽,還需要處理文本,通過parseText實現(xiàn),源碼位于src/compiler/parser/text-parsre.js

回頭看看之前打印出來的ast,可以看到打上標記的表達式:

③:解析指令,以v-for為例

v-for指令解析的入口是processFor方法,該方法定義位于src/compiler/parser/index.js,此方法依賴parseFor以及extend方法,共同完成v-for的解析。

大概思路:通過正則匹配v-for,匹配到了就調用parseFor方法,parseFor方法位于同文件中:

這個方法也是通過正則匹配,分別匹配出不同的內容,比如’v-for="(item, index) in data"’,匹配出來的res.for是data,res.alias是item,res.iterator是index,隨后返回解析出來的 結果,傳給processFor中的res常量res,接著調用extend方法完成解析,extend方法的定義位于src/shared/util.js中,如下:

其實extend只是一個循環(huán),把之前解析出來的屬性循環(huán)出來并掛載到傳入的ast對象上。(更新于2019.02.25 )
更多指令的解析有興趣可以自行研究一下~~

總結

以上是生活随笔為你收集整理的[Vue源码分析] 模板的编译的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲成熟少妇视频在线观看 | 日韩精品区| 国产69精品久久久久999小说 | 97精品人妻一区二区三区 | 婷婷亚洲综合 | 少妇无套内谢免费视频 | 色就是色亚洲色图 | 成年人视频在线观看免费 | 日本人三级 | 韩国激情呻吟揉捏胸视频 | 又黄又爽的视频在线观看 | 国产福利在线免费观看 | 一道本不卡视频 | 韩日产理伦片在线观看 | 国产成人av电影 | 假日游船法国满天星 | 亚洲av熟女国产一区二区性色 | 精品蜜桃av| 男女作爱免费网站 | 欧美性猛交xxx乱久交 | 一级二级毛片 | 自拍偷拍在线播放 | 欧美一二三级 | 色视av | 欧美a网站 | 亚洲免费高清 | 9色视频| 九色视频网站 | 91成人看片 | 亚洲欧洲国产精品 | 国产美女无遮挡免费 | 亚洲熟女综合色一区二区三区 | 欧美日韩三级 | 红桃视频在线播放 | 天天操天天摸天天干 | 欧美做受xxxxxⅹ性视频 | 肥婆大荫蒂欧美另类 | 国产成人aaaa | 日产电影一区二区三区 | 日韩中文字幕在线 | 国产在线观看网站 | 天天色影院 | 深夜视频免费在线观看 | 国产精品女人精品久久久天天 | 国产一级片a | 91亚洲精品久久久蜜桃网站 | 日本色综合 | av免费网站在线观看 | 亚洲国产精品毛片av不卡在线 | 免费在线观看毛片视频 | 999国产在线 | 永久av| 日韩高清av | 永久福利视频 | 新超碰97| 国产精品欧美久久久久天天影视 | 肥臀熟女一区二区三区 | 五月天久久久久久 | 日韩一级片在线观看 | 中文在线8资源库 | 国产伦理自拍 | 性欧美成人播放77777 | 污污视频在线免费观看 | 色姐| 成人中文字幕+乱码+中文字幕 | 少妇一区二区视频 | 日本人添下边视频免费 | 99热精品在线播放 | 国产性猛交xxxx免费看久久 | 中国丰满老妇xxxxx交性 | 青草视频在线播放 | 久久久久久久久久电影 | 在线视频三区 | 日韩欧美一区二区三区视频 | 红桃视频成人在线 | www日韩在线观看 | av中文字幕亚洲 | 成人精品亚洲 | 欧美日韩一区二区在线播放 | 国产黄色av| 国精产品一区一区三区免费视频 | 国产98色在线 | 日韩 | 公妇借种乱htp109cc | 激情草逼 | 色七七桃花综合影院 | 偷拍久久久| 国产av无毛 | 成人a区 | 99久免费精品视频在线观78 | 少妇精品无码一区二区三区 | 精品国产乱码久久久久久久软件 | 国产欧美日韩三级 | av首页在线| 超级碰碰97| 国产乱子一区二区 | 91福利免费| 无码人妻一区二区三区线 | 亚洲免费色视频 | 久久久久国产一区二区三区 |