您好,登錄后才能下訂單哦!
這篇文章主要介紹“Vue編譯器分析compile源碼”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Vue編譯器分析compile源碼”文章能幫助大家解決問題。
在 compileToFunctions 方法中:
// compile var compiled = compile(template, options);
而真正的編譯工作是依托于 compile 函數,接下來我們詳細解析 compile 。
上述代碼在調用 compile ,其中模板字符串 template ,選項參數 options 第二個參數傳遞給 compile 函數,在章節三種我們知道,這里傳遞過去的options
如下:
{ shouldDecodeNewlines, shouldDecodeNewlinesForHref, delimiters, comments, warn }
接下來我們看下 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 被設置為 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) 的對象,且屬性的值都是函數。
第四個屬性:isPreTag 它是一個函數,其作用是通過給定的標簽名字檢查標簽是否是 'pre' 標簽。
第五個屬性:isUnaryTag 是一個通過makeMap
生成的函數,該函數的作用是檢測給定的標簽是否是一元標簽。
第六個屬性:mustUseProp 它是一個函數,其作用是用來檢測一個屬性在標簽中是否要使用props
進行綁定。
第七個屬性:canBeLeftOpenTag 一個使用makeMap生成的函數,它的作用是檢測非一元標簽,但卻可以自己補全并閉合的標簽。比如 div 標簽是一個雙標簽,你需要這樣使用<div> text </div>,但是你依然可以省略閉合標簽,直接這樣寫:<div> text ,且瀏覽器會自動補全。但是有些標簽你不可以這樣用,它們是嚴格的雙標簽。
第八個屬性:isReservedTag 它是一個函數,其作用是檢查給定的標簽是否是保留的標簽。
第九個屬性:getTagNamespace 它也是一個函數,其作用是獲取元素(標簽)的命名空間。
第十個屬性:staticKeys 它的值是通過以 modules 為參數調用 genStaticKeys 函數的返回值得到的。 其作用是根據編譯器選項的 modules 選項生成一個靜態鍵字符串。
現在我們粗略的介紹了下baseOptions 中各個屬性的作用,當我們用到時候再來詳細講解他們的源碼。
繼續往下看:
var errors = []; var tips = []; finalOptions.warn = function(msg, tip) { (tip ? tips : errors).push(msg); };
很簡單
在 finalOptions上添加了 warn 方法,該方法接收兩個參數:
msg 錯誤或提示的信息
tip 用來標示 msg 是錯誤還是提示。
warn選項主要用在編譯過程中的錯誤和提示收集,如果收集的信息是錯誤信息就將錯誤信息添加到前面定義的errors數組里,如果是提示信息就將其添加到 tips 數組里。
繼續:
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 就是使用編譯器編譯模板時傳遞的選項參數,或者可以簡單理解為調用 compileToFunctions 函數時傳遞的選項參數。
而baseOptions理解為編譯器的默認選項或者基本選項,options 是用來提供定制能力的擴展選項。而上面這段代碼的作用,就是將 options 對象混合到 finalOptions 中。
modules: 如果 options.modules 存在,就在 finalOptions 對象上添加 modules 屬性,其值為 baseOptions.modules 和 options.modules 這兩個數組合并后的新數組。
directives: 對于directives 采用原型鏈的原理實現擴展屬性對基本屬性的覆蓋。
繼續:
var compiled = baseCompile(template, finalOptions); { errors.push.apply(errors, detectErrors(compiled.ast)); } compiled.errors = errors; compiled.tips = tips;
上面的代碼調用了 baseCompile 函數,并分別將字符串模板(template),以及最終的編譯器選項(finalOptions)傳遞了過去。
compiled 是 baseCompile 對模板的編譯結果所以上面這段代碼的作用是用來通過抽象語法樹來檢查模板中是否存在錯誤表達式的,通過 detectErrors 函數實現,將compiled.ast 作為參數傳遞給 detectErrors 函數,該函數最終返回一個數組,該數組中包含了所有錯誤的收集,最終通過這句代碼將錯誤添加到errors。
將收集到的錯誤(errors)和提示(tips)添加到compiled
上并返回。
baseCompile 函數是在 createCompilerCreator 函數調用時傳遞的實參。
// `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 } });
關于“Vue編譯器分析compile源碼”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。