現(xiàn)在我們講compileToFunctions 的使用方法,現(xiàn)在看看內(nèi)容:
// compile var compiled = compile(template, options);
其實真正應(yīng)該講的就是 compile 函數(shù)。
解析 compile
上述代碼在調(diào)用 compile ,其中模板字符串 template ,就是讓選項參數(shù) options 的第二個參數(shù)傳遞給 compile 函數(shù),下面就是有關(guān)傳遞過去的options如下:
{ shouldDecodeNewlines, shouldDecodeNewlinesForHref, delimiters, comments, warn }
compile 源碼
現(xiàn)在我們看看 compile 的源碼。
function createCompilerCreator(baseCompile) { return function createCompiler(baseOptions) { function compile( template, options ) { var finalOptions = Object.create(baseOptions); var errors = []; var tips = []; finalOptions.warn = function(msg, tip) { (tip ? tips : errors).push(msg); }; if (options) { // merge custom modules if (options.modules) { finalOptions.modules = (baseOptions.modules || []).concat(options.modules); } // merge custom directives if (options.directives) { finalOptions.directives = extend( Object.create(baseOptions.directives || null), options.directives ); } // copy other options 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 } return { compile: compile, compileToFunctions: createCompileToFunctionFn(compile) } } }
·首先可以看到:
var finalOptions = Object.create(baseOptions);
配置選項
finalOptions的配置上的選項最終是要掛載在指定對象上,其中baseOptions包含編譯器在運作的時候所需的配置選項。
var 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) };
屬性分別解析
第一個屬性: expectHTML 被設(shè)置為 true 。
第二個屬性:modules
var modules$1 = [ klass$1, style$1, model$1 ]; var klass$1 = { staticKeys: ['staticClass'], transformNode: transformNode, genData: genData }; var style$1 = { staticKeys: ['staticStyle'], transformNode: transformNode$1, genData: genData$1 }; var model$1 = { preTransformNode: preTransformNode };
我們一起來細細將屬性:
第三個屬性:directives 值是三個屬性 (model、text、html) 的對象,且屬性的值都是函數(shù)。
第四個屬性:isPreTag 它是一個函數(shù),其作用是通過給定的標(biāo)簽名字檢查標(biāo)簽是否是 'pre' 標(biāo)簽。
第五個屬性:isUnaryTag 是一個通過makeMap生成的函數(shù),該函數(shù)的作用是檢測給定的標(biāo)簽是否是一元標(biāo)簽。
第六個屬性:mustUseProp 它是一個函數(shù),其作用是用來檢測一個屬性在標(biāo)簽中是否要使用props進行綁定。
第七個屬性:canBeLeftOpenTag 一個使用makeMap生成的函數(shù),它的作用是檢測非一元標(biāo)簽,但卻可以自己補全并閉合的標(biāo)簽。比如 div 標(biāo)簽是一個雙標(biāo)簽,你需要這樣使用<div> text </div>,但是你依然可以省略閉合標(biāo)簽,直接這樣寫:<div> text ,且瀏覽器會自動補全。但是有些標(biāo)簽?zāi)悴豢梢赃@樣用,它們是嚴格的雙標(biāo)簽。
第八個屬性:isReservedTag 它是一個函數(shù),其作用是檢查給定的標(biāo)簽是否是保留的標(biāo)簽。
第九個屬性:getTagNamespace 它也是一個函數(shù),其作用是獲取元素(標(biāo)簽)的命名空間。
第十個屬性:staticKeys 它的值是通過以 modules 為參數(shù)調(diào)用 genStaticKeys 函數(shù)的返回值得到的。 其作用是根據(jù)編譯器選項的 modules 選項生成一個靜態(tài)鍵字符串。
我們接下來繼續(xù)看看baseOptions 中各個屬性的作用,看看源代碼。
繼續(xù)往下看:
var errors = []; var tips = []; finalOptions.warn = function(msg, tip) { (tip ? tips : errors).push(msg); };
finalOptions添加warn 方法
我們在finalOptions加入warn 方法,有兩個參數(shù):
msg 錯誤或提示的信息
tip 用來標(biāo)示 msg 是錯誤還是提示。
warn選項主要用在編譯過程中的錯誤和提示收集,如果收集的信息是錯誤信息就將錯誤信息添加到前面定義的errors數(shù)組里,如果是提示信息就將其添加到 tips 數(shù)組里。
繼續(xù):
if (options) { // merge custom modules if (options.modules) { finalOptions.modules = (baseOptions.modules || []).concat(options.modules); } // merge custom directives if (options.directives) { finalOptions.directives = extend( Object.create(baseOptions.directives || null), options.directives ); } // copy other options for (var key in options) { if (key !== 'modules' && key !== 'directives') { finalOptions[key] = options[key]; } } }
上述代碼主要檢查 options 證明存在,options 主要是使用編譯器編譯模板時傳遞的選項參數(shù),簡單來說就是為調(diào)用 compileToFunctions 函數(shù)時傳遞的選項參數(shù)。
而baseOptions理解為編譯器的默認選項或者基本選項,options 是用來提供定制能力的擴展選項。上面的代碼主要是將options 對象柔和到 finalOptions 中。
現(xiàn)在說說兩個特殊的屬性處理
modules: 假如 options.modules 存在,當(dāng)在 finalOptions 對象上柔和進 modules 屬性,想要組合并后的新數(shù)組就要用baseOptions.modules 和 options.modules 。
directives: 對于directives 采用原型鏈的原理實現(xiàn)擴展屬性對基本屬性的覆蓋。
繼續(xù):
var compiled = baseCompile(template, finalOptions); { errors.push.apply(errors, detectErrors(compiled.ast)); } compiled.errors = errors; compiled.tips = tips;
上面的代碼調(diào)用了 baseCompile 函數(shù),并分別將字符串模板(template),以及最終的編譯器選項(finalOptions)傳遞了過去。
compiled 是 baseCompile 對模板的編譯結(jié)果因此上面代碼就是為了讓用通過抽象語法樹來證明是否有存在錯誤表達,當(dāng)利用 detectErrors 函數(shù)實現(xiàn),利用compiled.ast 作為參數(shù)傳遞給 detectErrors 函數(shù),最終就會返會一個包含所有錯誤數(shù)值的集合,最終通過這句代碼將錯誤添加到errors。
將收集到的錯誤(errors)和提示(tips)添加到compiled上并返回。
baseCompile 函數(shù)是在 createCompilerCreator 函數(shù)調(diào)用時傳遞的實參。
// `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) { optimize(ast, options); } var code = generate(ast, options); return { ast: ast, render: code.render, staticRenderFns: code.staticRenderFns } });
現(xiàn)在內(nèi)容也基本上述完畢,后續(xù)更多精彩內(nèi)容請多多關(guān)注。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/127805.html
摘要:源碼目錄結(jié)構(gòu)打包相關(guān)的配置文件,其中最重要的是。主要是根據(jù)不同的入口,打包為不同的文件。這個目錄下的代碼邏輯會把文件內(nèi)容解析成一個的對象。 源碼目錄結(jié)構(gòu) VUE 2.6.10 ├── scripts # 打包相關(guān)的配置文件,其中最重要的是config.js。主要是根據(jù)不同的入口,打 包為不同的文件。 ├── dist # 打包之后文...
摘要:頁面這個實例,按理就需要解析兩次,但是有緩存之后就不會理清思路也就是說,其實內(nèi)核就是不過是經(jīng)過了兩波包裝的第一波包裝在中的內(nèi)部函數(shù)中內(nèi)部函數(shù)的作用是合并公共和自定義,但是相關(guān)代碼已經(jīng)省略,另一個就是執(zhí)行第二波包裝在中,目的是進行緩存 寫文章不容易,點個贊唄兄弟 專注 Vue 源碼分享,文章分為白話版和 源碼版,白話版助于理解工作原理,源碼版助于了解內(nèi)部詳情,讓我們一起學(xué)習(xí)吧研究基于 ...
摘要:筆者系貢獻者之一官方說明簡單來說就是將文件變成,然后放入瀏覽器運行。部分首先分析部分從做右到左,也就是被先后被和處理過了。源碼解析之二源碼解析之三寫作中源碼解析之四寫作中作者博客作者微博 筆者系 vue-loader 貢獻者(#16)之一 官方說明 vue-loader is a loader for Webpack that can transform Vue components ...
摘要:假如你通過閱讀源碼,掌握了對的實現(xiàn)原理,對生態(tài)系統(tǒng)有了充分的認識,那你會在面試環(huán)節(jié)游刃有余,達到晉級阿里的技術(shù)功底,從而提高個人競爭力,面試加分更容易拿。 前言 一年一度緊張刺激的高考開始了,與此同時,我也沒閑著,奔走在各大公司的前端面試環(huán)節(jié),不斷積累著經(jīng)驗,一路升級打怪。 最近兩年,太原作為一個準(zhǔn)二線城市,各大互聯(lián)網(wǎng)公司的技術(shù)棧也在升級換代,假如你在太原面試前端崗位,而你的技術(shù)庫里若...
閱讀 547·2023-03-27 18:33
閱讀 732·2023-03-26 17:27
閱讀 630·2023-03-26 17:14
閱讀 591·2023-03-17 21:13
閱讀 521·2023-03-17 08:28
閱讀 1801·2023-02-27 22:32
閱讀 1292·2023-02-27 22:27
閱讀 2178·2023-01-20 08:28