当前位置: 首页 > article >正文

vue源码分析(四)——vue 挂载($mount)的详细过程

文章目录

  • 前言
  • 一、使用Runtime+Compiler解析$mount的原因
  • 二、$mount 解析的详细过程
    • 1.解析挂载的#app执行了vm.$mount
    • 2. 通过$mount方法执行以下文件的mount方法
    • 3. 执行util工具文件夹中的query方法
    • 4. 执行query方法后返回$mount方法判断el是否是body
    • 5. 判断!options.render
      • (1)options.render是否为真
      • (2)判断是否使用了template
      • (3)判断是否是el
      • (4)返回的 mount 的方法
    • 6. 解析mountComponent方法
  • 总结


前言

Runtime Only 和 Runtime+Compiler的区别
通常我们利用 vue-cli 去初始化我们的 Vue.js 项目的时候会询问我们用Runtime Only 版本的还是 Runtime+Compiler 版本。
Runtime Only:我们在使用 Runtime Only 版本的 Vue.js 的时候,通常需要借助如 webpack的 vue-loader 工具把 .vue 文件编译成 JavaScript,因为是在编译阶段做的,所以它只包含运行时的 Vue.js 代码,因此代码体积也会更轻量。
Runtime+Compiler:我们如果没有对代码做预编译,但又使用了 Vue 的 template 属性并传入一个字符串,则需要在客户端编译模板。如下所示:

// 需要编译器的版本
new Vue({
template: '<div>{{ hi }}</div>'
})
// 这种情况不需要
new Vue({
 render (h) {
 return h('div', this.hi)
}

因为在 Vue.js 2.0 中,最终渲染都是通过 render 函数,如果写 template 属性,则需要编译成 render 函数,那么这个编译过程会发生运行时,所以需要带有编译器的版本。
很显然,这个编译过程对性能会有一定损耗,所以通常我们更推荐使用Runtime-Only 的 Vue.js。


一、使用Runtime+Compiler解析$mount的原因

Vue中我们通过 $mount 方法去挂载vm,而 $mount 方法在多个文件中都有定义。如源码 src\platforms\web\runtime\index.ts src\platforms\web\runtime-with-compiler.ts 等文件。由于使用纯前端的方式分析源码,所以我这里分析 Compiler 版本的 $mount,有利于对原理深入的理解。

src\platforms\web\runtime\index.ts的方法较为简单,如下图
在这里插入图片描述

二、$mount 解析的详细过程

1.解析挂载的#app执行了vm.$mount

在这里插入图片描述

2. 通过$mount方法执行以下文件的mount方法

路径:src\platforms\web\runtime-with-compiler.ts
在这里插入图片描述

3. 执行util工具文件夹中的query方法

路径:src\platforms\web\util\index.ts
也就是main.js 中el: ‘#app’ 传入的话,就会执行1.1获取对应的元素
在这里插入图片描述

4. 执行query方法后返回$mount方法判断el是否是body

在这里插入图片描述

5. 判断!options.render

在这里插入图片描述

(1)options.render是否为真

下一章节会详细讲解

(2)判断是否使用了template

也就是使用Runtime Only 需要编译的写法,这个在前言中详细说明了,可以返回顶部详细看看。

// 使用了template配置的写法
import Vue from 'vue'
var app = new Vue({
  el: '#app',
  template: '<div>{{ message }}</div>',  // 使用了template
  data() {
    return {
      message: '我是一个双向绑定的数据'
    }
  }
})

(3)判断是否是el

如果是el,就执行getOutHtml方法,获取main.js中el的id名的div元素
在这里插入图片描述

(4)返回的 mount 的方法

在这里插入图片描述
路径:src\platforms\web\runtime\index.ts
在这里插入图片描述

6. 解析mountComponent方法

路径 src\core\instance\lifecycle.ts
执行updateComponent方法,通过Watcher根据数据更新执行。感兴趣可以查看Watcher里面的配置即可。

在这里插入图片描述


总结

这就是$mount 挂载的过程


http://www.kler.cn/news/107977.html

相关文章:

  • 【计算机视觉】3D视觉
  • 机器学习(五)如何理解机器学习三要素
  • shell脚本实战案例---数据库的备份
  • 【C++】STL容器——探究不同 [ 迭代器 ] 种类&在STL中的使用方式(15)
  • html5怎么实现语音搜索
  • Android系统的特性
  • RPC远程调用加密方法获取返回值
  • 线扫相机DALSA--常见问题一:软件安装顺序
  • 【JavaEE】HTTP协议
  • Vue3.0插槽
  • Windows相关知识
  • 磁盘的结构(磁道,扇区,盘面,柱面,物理地址)
  • TypeScript - 字符串的字面类型
  • Android---StartActivity启动过程
  • react高阶成分(HOC)例子效果
  • 如何在vscode中添加less插件
  • 【菜菜研科研小BUG记录】【Latex写作方面1】不定期更新
  • 【开源】基于SpringBoot的计算机机房作业管理系统的设计和实现
  • 2011-2021年“第四期”数字普惠金融与上市公司匹配(根据城市匹配)/上市公司数字普惠金融指数匹配数据
  • Flutter笔记:完全基于Flutter绘图技术绘制一个精美的Dash图标(下)
  • [微信小程序踩坑]微信小程序editor富文本组件渲染字符串时,内部图片超出大小导致无法正常渲染或回显(数据传输长度为 3458 KB,存在有性能问题!)
  • 处理大数据的基础架构,OLTP和OLAP的区别,数据库与Hadoop、Spark、Hive和Flink大数据技术
  • 策略路由和路由策略
  • Oracle (7)Online Redo Log Files
  • centos7 install postgres-15
  • Navicat for MySQL 视图创建使用方法
  • 毅速丨金属3D打印能替代传统制造吗?
  • C++ 学习系列 -- 标准库常用得 algorithm function
  • 【LeetCode力扣】189 53 轮转数组 | 最大子数组和
  • 【深度学习】吴恩达课程笔记(一)——深度学习概论、神经网络基础