浅理解vue2中的模板编译

  1. vue组件实例在初始化完成各种状态数据后,会触发vm.$mount()方法来进行模板编译阶段,有两种触发方式
// 方法一:主动触发 new Vue({ el: '#app' })
if (vm.$options.el) {vm.$mount(vm.$options.el);
}// 方法二:手动调用 new Vue().$mount("#app")
  1. 生成render渲染函数:执行$mount(el)方法,获取dom元素,判断vm.options中是否有render函数,没有的话需要先获取template的HTML片段,再执行compileToFunctions方法生成render函数。拿到render函数后接着触发mountComponent函数的执行
Vue.prototype.$mount = function (el) {// 获取domel = el && query(el);let options = this.$options;// 没有render函数,则需要解析 模板/el 并生成render函数if (!options.render) {// 获取模板字符串let template = options.template;if (template) {if (typeof template === "string") {// 模板第一个字符串为# 则判断该字符串为dom的idif (template.charAt(0) === "#") {template = document.querySelector(template).innerHTML;}} else if (template.nodeType) {// template是dom元素template = template.innerHTML;}} else if (el) {// outerHTML:dom元素的序列化HTML片段template = el.outerHTML;}if (template) {let _a = compileToFunctions(template, { outputSourceRange: true }, this);options.render = _a.render;options.staticRenderFns = _a.staticRenderFns;}}return mountComponent(this, el, false);
};// 获取dom元素
function query(el) {if (typeof el === "string") {var selected = document.querySelector(el);if (!selected) {return document.createElement("div");}return selected;} else {return el;}
}
  1. compileToFunctions方法中,生成render函数的步骤:①.parseHTML方法生成ast语法树,主要是利用正则与字符串方法循环处理HTML片段;②.generate(ast,options)方法生成render函数,主要是将ast语法树转换成render渲染函数,源码看不动了没贴
let cache = Object.create(null);
function compileToFunctions(template, options, vm) {if (cache[template]) {return cache[template];}let compiled = compile(template, options);let res = {};let fnGenErrors = [];res.render = createFunction(compiled.render, fnGenErrors);res.staticRenderFns = compiled.staticRenderFns.map(function (code) {return createFunction(code, fnGenErrors);});return (cache[key] = res);
}let baseOptions = {expectHTML: true,modules: modules,directives: directives,isPreTag: isPreTag,isUnaryTag: isUnaryTag,mustUseProp: mustUseProp,canBeLeftOpenTag: canBeLeftOpenTag,isReservedTag: isReservedTag,getTagNamespace: getTagNamespace,staticKeys: genStaticKeys$1(modules)
};function compile(template, options) {let finalOptions = Object.create(baseOptions);if (options) {for (let key in options) {if (key !== 'modules' && key !== 'directives') {finalOptions[key] = options[key];}}}let compiled = baseCompile(template.trim(), finalOptions);return compiled;
}// ......
  1. 执行mountComponent方法,首先是生成$el,接着执行beforeMount生命周期中的函数,接着生成渲染watcher实例,主动触发watcher实例的getter方法,getter方法就是updateComponent。
    在vm._render方法中生成了虚拟dom(vnode),在生成虚拟dom的过程中触发了render函数,在读取模板中的响应式数据时进而实现了响应式数据的依赖收集。
    在vm._update方法中将虚拟dom转成真实dom节点,实现了DOM的挂载,并赋值给vm.$el,核心方法是patch()方法
function mountComponent(vm, el, hydrating) {vm.$el = el;callHook$1(vm, 'beforeMount');let updateComponent = function () {vm._update(vm._render(), hydrating);};new Watcher(vm, updateComponent, noop, watcherOptions, true);
}function _update(vnode) {if (!prevVnode) {// initial rendervm.$el = patch(vm.$el, vnode, hydrating, false /* removeOnly */);}else {// updatesvm.$el = patch(prevVnode, vnode);}
}
  1. 接着执行callHook$1(vm, ‘mounted’)方法,触发mounted生命周期中的函数执行
function mountComponent(vm, el, hydrating) {// ...new Watcher(vm, updateComponent, noop, watcherOptions, true);callHook$1(vm, 'mounted');
}

模板编译

  1. 获取template HTML片段,根据HTML片段生成ast语法树;
  2. 根据ast语法树生成rende渲染函数;
  3. 执行render函数生成虚拟dom(vnode);
  4. 将虚拟dom转成真实dom节点并挂载在页面上;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/436.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

遗传算法 定义+特性+原理+公式+Python示例代码(带详细注释)

文章目录 引言定义特性基本原理和公式推导基本原理公式推导 实现步骤和代码实现实现步骤Python代码实现(带详细注释) 应用案例优化和挑战结论 引言 遗传算法(Genetic Algorithm, GA)是进化计算技术的一种,广泛应用于解…

Yarn的安装和配置

第一部分:安装与配置Yarn 在开始之前,我们需要先安装Yarn。下面是一些简单的步骤: 步骤1:下载并安装Node.js Yarn是基于Node.js的,因此我们首先需要安装Node.js。请前往Node.js官网(https://nodejs.org/&a…

绘制音频时长核密度分布图

import pandas as pd import seaborn as sns import matplotlib.pyplot as plt# 读取文件到DataFrame # 可以读百万行文件 df pd.read_csv(wav_dur_million.info, sep , header0, names[音频名, 音频时长])# 绘制核密度图 sns.kdeplot(df[音频时长], fillTrue) plt.xlabel(dur…

Elasticsearch:(二)1.安装Elasticsearch

1.环境安装介绍: 安装java环境安装Elasticsearch安装kibana安装Elasticsearch-head插件 本节文章主要讲解Elasticsearch的安装。 2.版本选择 jdk兼容性:支持一览表 | Elastic 操作系统兼容性:支持一览表 | Elastic 自身产品兼容性: 支持一览表 | Elastic jdk版本选择:…

道可云元宇宙每日资讯|北京:推进数字+场景落地

道可云元宇宙每日简报(2024年4月15日)讯,今日元宇宙新鲜事有: 上海市闵行区医学会元宇宙医学专业委员会举行成立大会 4月10日,上海市闵行区医学会元宇宙医学专业委员会举行成立大会。会上,全球领先的元宇…

安装Miniconda@FreeBSD13

近几年在学习和使用AI框架的时候,时时刻刻在想着如何在FreeBSD下进行训练和推理部署,可惜一直没有如愿。 近几天在调试大模型的一些项目时,尝试将飞桨、torch和tensorflow装了个遍,可惜都没有成功。机缘巧合下,看到fre…

【智能算法】饥饿游戏搜索算法(HGS)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2021年,Yang等人受到自然界饥饿驱动的活动和动物的行为选择启发,提出了饥饿游戏搜索算法(Hunger Games Search, HGS)。 2.算法原理 2.1算法思想 HGS…

酒店管理系统

文章目录 酒店管理系统一、项目演示二、项目介绍三、15000字论文参考四、部分功能截图五、部分代码展示六、底部获取项目源码和万字论文参考(9.9¥带走) 酒店管理系统 一、项目演示 酒店管理系统 二、项目介绍 基于springbootvue前后端分离的…

通过实例学C#之FileStream类

简介 可以通过此类进行文件读取。 首先在项目所在文件夹的Bin文件中新建一个test.txt文件,里面输入内容“hello world!”。 构造函数 FileStream (string path, FileMode mode,FileAccess access) 通过路径文件path,打开文件模式mode以及读写…

springboot注解学习记录(持续更新)

RestController 放在controller最前面,代表这个java文件是一个controller CrossOrigin 放在controller最前面,用于解决跨域情况下的请求。 RequestMapping(“/prefix”) 放在controller前,对当前controller所有的请求都要加上这个前缀 …

买婴儿洗衣机怎么选择?四大绝佳好用婴儿洗衣机分享

幼龄时期的宝宝的衣物,是比较需要注意的时候。可能一不注意宝宝穿在身上就会有不适宜症状发生。所以宝妈们真的要随时观察,然后在宝宝洗衣服的这上面多下点功夫,不要让宝宝受到这种无谓的伤害。小婴儿的抵抗力比我们差很多。有些细菌、病毒可…

今天给大家推荐36套404页面模板

404页面是网站必备的一个页面,它承载着用户体验与SEO优化的重任。当用户访问不存在的页面时,服务器会返回404错误代码,并显示404页面。一个好的404页面可以帮助用户快速找到所需信息,并提升网站的用户体验。 以下是一些演示下载资…

前端预处理器-stylus入门使用方法

Stylus是一款支持多样性的CSS预处理器,它的语法和普通的CSS有些不同,但更为简洁和灵活。以下是Stylus的入门使用方法: 安装Stylus:首先,你需要安装Node.js,这是运行Stylus的基础。然后,使用npm&…

速卖通爆款商品打造全攻略:从选品到补单,步步为赢

跨境电商行业的竞争也越来越大,速卖通卖家自然也要为店内的爆款而努力,同时也要清楚地意识到爆款也是有时限的,那么一款爆款商品该如何打造呢? 1.选品。 开店时,面对世界各地的消费者群体,远比国内复杂得…

JavaWeb--前端工程化

目录 1. 前端工程化 1.1. 概述 1.2. 前端工程化实现技术栈 2. ECMA6Script 2.1. es6的介绍 2.2. es6 变量 / 模版字符串 2.2.1. let 与 var 的差别 2.2.2. const 与 var 的差异 2.2.3. 模板字符串 2.3. 解构表达式 / 赋值 2.3.1. 数组解构赋值 2.3.2. 对象解构赋值 …

开发语言漫谈-kotlin

程序的运行环境包括移动设备、服务端、浏览器,服务器又分为window、linux等,不同的环境使用不同的开发语言。为了解决这个问题,开发IDE大拿JetBrains开发了kotlin。 Kotlin是一个岛屿的名字,全称是Kotlin Island。这个小岛位于俄罗…

xhs图片获取并且转换成PDF,实现了我考研期间一直想实现的想法

对于一些xhs图文,很多人其实想把它的图片保存到本地,尤其是下图所示的考研英语从文章中背单词,不说别人,我就是这样的。 我在考研期间就想实现把图片批量爬取下来,转成PDF,方便一篇一片阅读进行观看&#…

Ubuntu22.04.4 - 安装后使用笔记目录-VMware

安装的话就傻瓜式盲点,根据自己需求进行处理,我是在ssh的地方勾选了一下选项,其他都是默认项,官网上有文档,就不赘述了 一、登录用户管理 二、系统命令 三、vim 四、网络配置 五、apt 六、SSH 七、MySQL8

【React】表单

受控组件 本质上其实就是将表单中的控件和视图模型(状态)进行绑定,之后都是针对状态进行操作。 一个基本的受控组件 文本框,用户输入的内容会在状态中进行管理: import React, { useState } from react;const ControlledComponent () &g…

Linux学习(二)

Bootloader 引导加载程序(Bootloader)是计算机系统中的一个重要组件,负责在计算机启动时加载操作系统。它通常存储在计算机的固件中,比如BIOS或UEFI,或者存储在硬盘或固态硬盘的引导分区中。引导加载程序的主要作用是引…