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

歡迎訪問 生活随笔!

生活随笔

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

vue

.6-Vue源码之AST(2)

發布時間:2025/4/9 vue 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .6-Vue源码之AST(2) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  上一節獲取到了DOM樹的字符串,準備進入compile階段:

// Line-9326function compileToFunctions(template,options,vm) {// 獲取配置參數options = options || {};// ...// Go!var compiled = compile(template, options);// ...}

  該函數接受兩個參數,DOM樹字符串、配置參數,如圖:,進函數:

// Line-9287function compile(template, options) {var finalOptions = Object.create(baseOptions);var errors = [];var tips = [];finalOptions.warn = function(msg, tip$$1) {(tip$$1 ? tips : errors).push(msg);};// 合并參數if (options) {if (options.modules) {finalOptions.modules = (baseOptions.modules || []).concat(options.modules);}if (options.directives) {finalOptions.directives = extend(Object.create(baseOptions.directives),options.directives);}for (var key in options) {if (key !== 'modules' && key !== 'directives') {finalOptions[key] = options[key];}}}// 核心編譯函數var compiled = baseCompile(template, finalOptions);errors.push.apply(errors, detectErrors(compiled.ast));// 提示與報錯屬性添加compiled.errors = errors;compiled.tips = tips;return compiled}

  compile主要做了3件事:

  1、參數合并

  這里涉及到baseOptions與傳進來的options,baseOptions是內置對象,與options合并后得到finalOptions作為參數傳進第二步的函數。

// Line-9529var baseOptions = {expectHTML: true,modules: modules$1,directives: directives$1,isPreTag: isPreTag,isUnaryTag: isUnaryTag,mustUseProp: mustUseProp,canBeLeftOpenTag: canBeLeftOpenTag,isReservedTag: isReservedTag,getTagNamespace: getTagNamespace,staticKeys: genStaticKeys(modules$1)};

  這個對象十分復雜,涉及的時候再做講解。

?

  2、調用baseCompile函數

  該函數接受2個參數:字符串、參數對象。

// Line-9261function baseCompile(template, options) {// 解析字符串為ASTvar ast = parse(template.trim(), options);// 優化 optimize(ast, options);// var code = generate(ast, options);return {ast: ast,render: code.render,staticRenderFns: code.staticRenderFns}}

  簡單看一眼這個函數,3個調用都很簡單暴力,后面一個一個講解。

?

  3、添加提示、報錯屬性并返回compiled值

  將過程中出現的error與tips作為屬性添加到compiled對象上,以便一次性輸出。

?

  跑流程的話,主要還是看第二步,理一理DOM樹字符串是如何被解析和編譯的,來看parse這個函數吧! 

  這函數太長了,分兩部分來: 

// Line-7982function parse(template, options) {// 參數修正warn$2 = options.warn || baseWarn;// 這幾個屬性都是原型鏈上面的platformGetTagNamespace = options.getTagNamespace || no;platformMustUseProp = options.mustUseProp || no;platformIsPreTag = options.isPreTag || no;preTransforms = pluckModuleFunction(options.modules, 'preTransformNode');transforms = pluckModuleFunction(options.modules, 'transformNode');postTransforms = pluckModuleFunction(options.modules, 'postTransformNode');// 這是自家的 值為undefined…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) {if (!warned) {warned = true;warn$2(msg);}}function endPre(element) {if (element.pre) {inVPre = false;}if (platformIsPreTag(element.tag)) {inPre = false;}}parseHTML( /*...*/ );return root}

?  首先是獲取options參數的屬性,其中大部分都是定義在原型上,即baseOptions,所以沒什么講的。唯一涉及的函數就是pluckModuleFunction,比較簡單,看一下內容:

// Line-5684function pluckModuleFunction(modules, key) {// 返回modules[key]組成的數組return modules ?modules.map(function(m) {return m[key];}).filter(function(_) {return _;}) : []}

  簡而言之,就是返回一個數組,內容是modules[key],這里返回空數組。

?

  第一部分沒什么講的,主要是聲明一些變量,第二部分才是核心:

// Line-7982function parse(template, options) {// ...part-1 parseHTML(template, {warn: warn$2,expectHTML: options.expectHTML,isUnaryTag: options.isUnaryTag,canBeLeftOpenTag: options.canBeLeftOpenTag,shouldDecodeNewlines: options.shouldDecodeNewlines,start: function start(tag, attrs, unary) {/* code... */},end: function end() {/* code... */},chars: function chars(text) {/* code... */}});return root}

  這部分就是巨大的函數調用,第一個參數為DOM字符串,第二個參數是一個對象,包含多個屬性與方法,屬性內容如下:

// Line-7578// 自閉合標簽var isUnaryTag = makeMap('area,base,br,col,embed,frame,hr,img,input,isindex,keygen,' +'link,meta,param,source,track,wbr');// 可以省略閉合標簽var canBeLeftOpenTag = makeMap('colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source');// 當前瀏覽器是否會對換行轉義var shouldDecodeNewlines = inBrowser ? shouldDecode('\n', '&#10;') : false;function shouldDecode(content, encoded) {var div = document.createElement('div');div.innerHTML = "<div a=\"" + content + "\">";return div.innerHTML.indexOf(encoded) > 0}

  第一個expectHTML在baseOptions中是默認true的,其余幾個是標簽名數組與換行轉義判斷的集合。

?

  剩余三個方法包括start、end、chars,單獨講不好講,在parseHTML方法邊跑邊說。

  暫時結束,parseHTML方法非常長,單獨講。

轉載于:https://www.cnblogs.com/QH-Jimmy/p/6905272.html

總結

以上是生活随笔為你收集整理的.6-Vue源码之AST(2)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 欧美午夜剧场 | 成人xxxxx| 女王脚交玉足榨精调教 | 久久综合91| 天堂中文资源在线 | 日韩污视频 | 欧美日韩免费一区二区 | 青娱乐导航| 亚洲精品二三区 | 欧美色图一区二区 | 麻豆传媒在线 | 综合激情伊人 | 国产熟女一区二区丰满 | 四虎精品成人免费网站 | 一区二区亚洲视频 | 日韩在线视频看看 | 999国内精品永久免费视频 | 欧美成人影音 | 女人扒开腿免费视频app | 日韩美女免费线视频 | 五月婷婷中文 | aaa久久| 久久九九国产 | 亚洲成人精品一区二区三区 | 亚洲图片中文字幕 | 露脸啪啪清纯大学生美女 | 精品国产精品三级精品av网址 | 午夜精品在线免费观看 | av片一区二区三区 | 久久久久久久极品内射 | 欧美黄色免费看 | 国产精品五区 | 国产精品中文无码 | 午夜啪啪网 | 亚洲黄色第一页 | 黑人操中国女人视频 | 亚洲射射射 | 色婷婷精品久久二区二区密 | 日本中文字幕网 | 秋霞午夜鲁丝一区二区 | 在线欧美亚洲 | 青青草原国产在线观看 | 国产激情毛片 | 岛国av网址| 国产精欧美一区二区三区白种人 | 国产人澡人澡澡澡人碰视频 | 色图自拍| 伊人网站在线观看 | 被灌满精子的波多野结衣 | 欧美丰满熟妇bbbbbb百度 | 国产午夜精品一区二区三区四区 | 新香蕉视频 | 色网视频 | 精人妻无码一区二区三区 | 高跟鞋和丝袜猛烈xxxxxx | 国产成人精品一区二区三区视频 | 欧美3p视频 | 在线不欧美| 天天天色综合 | 国产卡一卡二 | 国产大奶在线 | 丁香色综合 | 成人网久久 | 欧美日韩黄色一区二区 | 免费的av在线 | 国产精品无码av在线有声小说 | 亚洲欧洲一二三区 | 亚洲无限看 | 一级久久久久 | 性久久久久 | 99热一区| 欧美日韩91 | www日本免费 | 韩日av | 一区二区三区精彩视频 | 懂色av一区二区三区 | 欧美韩国日本 | 欧美乱妇在线观看 | 久久久久久久久久久久电影 | 国模视频一区二区 | 牛人盗摄一区二区三区视频 | 国产二区自拍 | 日韩亚洲国产欧美 | 一区二区在线不卡 | 雪花飘电影在线观看免费高清 | 国产又黄又大又粗视频 | 中文在线a√在线8 | 中文字幕一区二区视频 | 北条麻妃在线一区二区 | 黄色一级片免费 | 一区三区在线观看 | 少妇一级淫片 | 先锋av资源网 | 能直接看的av网站 | 午夜电影一区二区三区 | 欧美性猛交99久久久久99按摩 | 最新视频–x99av | 久久66热这里只有精品 | 中文写幕一区二区三区免费观成熟 |