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

Vue編譯器解析compile源碼解析

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

引言

在上篇文章 Vue編譯器源碼分析compileToFunctions作用中我們介紹到了,在 compileToFunctions 方法中:

// compile
var compiled = compile(template, options);

而真正的編譯工作是依托于 compile 函數(shù),接下來我們詳細解析 compile 。

解析 compile

上述代碼在調用 compile ,其中模板字符串 template ,選項參數(shù) options 第二個參數(shù)傳遞給 compile 函數(shù),在章節(jié)三種我們知道,這里傳遞過去的options如下:

{
	shouldDecodeNewlines,
	shouldDecodeNewlinesForHref,
	delimiters,
	comments,
	warn 
}

compile 源碼

接下來我們看下 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) 的對象,且屬性的值都是函數(shù)。
  • 第四個屬性:isPreTag 它是一個函數(shù),其作用是通過給定的標簽名字檢查標簽是否是 'pre' 標簽。
  • 第五個屬性:isUnaryTag 是一個通過makeMap生成的函數(shù),該函數(shù)的作用是檢測給定的標簽是否是一元標簽。
  • 第六個屬性:mustUseProp 它是一個函數(shù),其作用是用來檢測一個屬性在標簽中是否要使用props進行綁定。
  • 第七個屬性:canBeLeftOpenTag 一個使用makeMap生成的函數(shù),它的作用是檢測非一元標簽,但卻可以自己補全并閉合的標簽。比如 div 標簽是一個雙標簽,你需要這樣使用<div> text </div>,但是你依然可以省略閉合標簽,直接這樣寫:<div> text ,且瀏覽器會自動補全。但是有些標簽你不可以這樣用,它們是嚴格的雙標簽。
  • 第八個屬性:isReservedTag 它是一個函數(shù),其作用是檢查給定的標簽是否是保留的標簽。
  • 第九個屬性:getTagNamespace 它也是一個函數(shù),其作用是獲取元素(標簽)的命名空間。
  • 第十個屬性:staticKeys 它的值是通過以 modules 為參數(shù)調用 genStaticKeys 函數(shù)的返回值得到的。 其作用是根據(jù)編譯器選項的 modules 選項生成一個靜態(tài)鍵字符串。

現(xiàn)在我們粗略的介紹了下baseOptions 中各個屬性的作用,當我們用到時候再來詳細講解他們的源碼。

繼續(xù)往下看:

var errors = [];
var tips = [];
finalOptions.warn = function(msg, tip) {
	(tip ? tips : errors).push(msg);
};

很簡單

finalOptions添加warn 方法

在 finalOptions上添加了 warn 方法,該方法接收兩個參數(shù):

  • msg 錯誤或提示的信息
  • tip 用來標示 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ù),或者可以簡單理解為調用 compileToFunctions 函數(shù)時傳遞的選項參數(shù)。

而baseOptions理解為編譯器的默認選項或者基本選項,options 是用來提供定制能力的擴展選項。而上面這段代碼的作用,就是將 options 對象混合到 finalOptions 中。

兩個特殊的屬性處理

  • modules: 如果 options.modules 存在,就在 finalOptions 對象上添加 modules 屬性,其值為 baseOptions.modules 和 options.modules 這兩個數(shù)組合并后的新數(shù)組。
  • directives: 對于directives 采用原型鏈的原理實現(xiàn)擴展屬性對基本屬性的覆蓋。

繼續(xù):

var compiled = baseCompile(template, finalOptions); {
	errors.push.apply(errors, detectErrors(compiled.ast));
}
compiled.errors = errors;
compiled.tips = tips;

上面的代碼調用了 baseCompile 函數(shù),并分別將字符串模板(template),以及最終的編譯器選項(finalOptions)傳遞了過去。

compiled 是 baseCompile 對模板的編譯結果所以上面這段代碼的作用是用來通過抽象語法樹來檢查模板中是否存在錯誤表達式的,通過 detectErrors 函數(shù)實現(xiàn),將compiled.ast 作為參數(shù)傳遞給 detectErrors 函數(shù),該函數(shù)最終返回一個數(shù)組,該數(shù)組中包含了所有錯誤的收集,最終通過這句代碼將錯誤添加到errors。

將收集到的錯誤(errors)和提示(tips)添加到compiled上并返回。

baseCompile 函數(shù)是在 createCompilerCreator 函數(shù)調用時傳遞的實參。

// `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編譯器源碼分析(一) 到 Vue編譯器源碼分析(四) 我們已經(jīng)把編譯器整體代碼組織的結構講分析了。

從下章節(jié)開始,就正式的進入到Vue編譯器詞法分析階段,去看下模板對應的AST(抽象語法樹)是怎么形成的。

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

以上就是Vue編譯器解析compile源碼解析的詳細內(nèi)容,更多關于Vue編譯器compile解析的資料請關注腳本之家其它相關文章!

相關文章

  • vue富文本框(插入文本、圖片、視頻)的使用及問題小結

    vue富文本框(插入文本、圖片、視頻)的使用及問題小結

    這篇文章主要介紹了vue富文本框(插入文本、圖片、視頻)的使用及問題小結,需要的朋友可以參考下
    2018-08-08
  • Vue中的事件處理詳情

    Vue中的事件處理詳情

    這篇文章主要介紹了Vue中的事件處理詳情,文章通過給按鈕綁定一個?click?事件展開詳細內(nèi)容介紹,需要的小伙伴可以參考一下
    2022-05-05
  • vue中使用elementUI自定義校驗及點擊提交不生效問題解決辦法

    vue中使用elementUI自定義校驗及點擊提交不生效問題解決辦法

    我們在項目中經(jīng)常會用到ElementUI的表單驗證,下面這篇文章主要給大家介紹了關于vue中使用elementUI自定義校驗及點擊提交不生效問題解決的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-12-12
  • 詳解vue-cli腳手架中webpack配置方法

    詳解vue-cli腳手架中webpack配置方法

    這篇文章主要介紹了詳解vue-cli腳手架中webpack配置方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • 3分鐘迅速學會Vue中methods方法使用技巧

    3分鐘迅速學會Vue中methods方法使用技巧

    最近在學習Vue,感覺methods還是有必有總結一下的,下面這篇文章主要給大家介紹了關于3分鐘迅速學會Vue中methods方法使用技巧的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • preload對比prefetch的功能區(qū)別詳解

    preload對比prefetch的功能區(qū)別詳解

    這篇文章主要為大家介紹了preload對比prefetch的使用區(qū)別詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • vue使用vite配置跨域以及環(huán)境配置詳解

    vue使用vite配置跨域以及環(huán)境配置詳解

    跨域是指當一個資源去訪問另一個不同域名或者同域名不同端口的資源時,就會發(fā)出跨域請求,下面這篇文章主要給大家介紹了關于vue使用vite配置跨域以及環(huán)境配置的相關資料,需要的朋友可以參考下
    2022-07-07
  • vue全局引入公共的scss和@mixin與@include的使用方式

    vue全局引入公共的scss和@mixin與@include的使用方式

    這篇文章主要介紹了vue全局引入公共的scss和@mixin與@include的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Vue3?中?watch?與?watchEffect?區(qū)別及用法小結

    Vue3?中?watch?與?watchEffect?區(qū)別及用法小結

    這篇文章主要介紹了Vue3?中?watch?與?watchEffect?有什么區(qū)別?watch中需要指明監(jiān)視的屬性,也需要指明監(jiān)視的回調,而watchEffect中不需要指明監(jiān)視的屬性,只需要指明監(jiān)視的回調,回調函數(shù)中用到哪個屬性,就監(jiān)視哪個屬性,本文給大家詳細介紹,需要的朋友參考下
    2022-06-06
  • echarts 使用formatter 修改鼠標懸浮事件信息操作

    echarts 使用formatter 修改鼠標懸浮事件信息操作

    這篇文章主要介紹了echarts 使用formatter 修改鼠標懸浮事件信息操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07

最新評論

类乌齐县| 中西区| 仲巴县| 西华县| 榆社县| 德兴市| 泸定县| 大宁县| 通山县| 康定县| 汉阴县| 乌拉特后旗| 柏乡县| 萝北县| 光山县| 萨嘎县| 定边县| 周至县| 黑水县| 资中县| 三亚市| 盈江县| 叶城县| 石嘴山市| 宕昌县| 日土县| 曲周县| 胶州市| 滨州市| 桦甸市| 马公市| 大邑县| 厦门市| 赤城县| 鱼台县| 孙吴县| 黄龙县| 泰安市| 永寿县| 大名县| 宁海县|