Vue2.0原理-模板解析
下面这段代码,vue内部做了什么操作?我去源码里面找找看
new Vue({
el: '#app'
})
入口
vue 的入口文件在 src/core/instance/index.js
, 里面一进来就执行了很多初始化的操作。
import { initMixin } from './init'
import { stateMixin } from './state'
import { renderMixin } from './render'
import { eventsMixin } from './events'
import { lifecycleMixin } from './lifecycle'
import { warn } from '../util/index'
function Vue (options) {
if (process.env.NODE_ENV !== 'production' &&
!(this instanceof Vue)
) {
warn('Vue is a constructor and should be called with the `new` keyword')
}
this._init(options)
}
initMixin(Vue)
stateMixin(Vue)
eventsMixin(Vue)
lifecycleMixin(Vue)
renderMixin(Vue)
export default Vue
进入 initMixin
方法看看,这个方法内部只做了一件事,定义 Vue.prototype._init
, 这个 _init
方法又做了什么呢?
...
// 各种初始化开始
initProxy(vm)
initLifecycle(vm)
initEvents(vm)
initRender(vm)
callHook(vm, 'beforeCreate')
initInjections(vm) // resolve injections before data/props
initState(vm)
initProvide(vm) // resolve provide after data/props
callHook(vm, 'created')
// 各种初始化完毕
...
// 解析模板
if (vm.$options.el) {
vm.$mount(vm.$options.el)
}
解析
进入 src/platforms/web/entry-runtime-with-compiler.js
文件,看看 $mount
方法是怎么处理模板的。
- 判断
el
是否为body或者html根节点,是的话,提示错误。
if (el === document.body || el === document.documentElement) {
process.env.NODE_ENV !== 'production' && warn(
`Do not mount Vue to <html> or <body> - mount to normal elements instead.`
)
return this
}
- 如果没有render函数,则开始解析模板
// 模板也分为多种
1,当使用 template 属性时,支持:
1.1, 字符串模板
1.2,一个script模板的id
1.3,一个dom对象
2,当使用 el 属性时,获取对应dom的outerHTML 作为template
- 调用
src/compiler/index.js
对模板进行AST解析和静态优化,并重建render方法
对于模板解析,这篇文章分析的很详细 Vue 模板编译原理
- 在解析完模板之后,调用的是
runtime/index.js
中的$mount
方法。
而$mount
方法调用 src/core/instance/lifecycle.js
中的 mountComponent
方法
mountComponent() {
// 1,经过上面的一系列初始化动作,render肯定已经有了,如果没有,返回一个节点并警告。
callHook(vm, 'beforeMount')
// 2,通过vm._render()方法把模板转化成vNode
// 3,通过vm._update()更新dom节点
callHook(vm, 'mounted')
}
和VUE1的区别
在vue1.0种,模板的解析是通过 createDocumentFragment
对dom进行代理实现的,到了2.0时代,考虑到服务端渲染,采用了jquery作者开发的 html-parse
库进行字符串模板解析。
Vue2.0原理-模板解析的更多相关文章
- 基于vue2.0原理-自己实现MVVM框架之computed计算属性
基于上一篇data的双向绑定,这一篇来聊聊computed的实现原理及自己实现计算属性. 一.先聊下Computed的用法 写一个最简单的小demo,展示用户的名字和年龄,代码如下: <body ...
- Vue2.0原理-指令
指令是 模板解析 的续章,本文会尝试从源码的角度来理解 指令 是如何被提取和应用的. 指令的提取 指令的提取过程是在parse阶段进行的,在 parseHTML 方法中,会解析字符串模板为如下的单个a ...
- vue1.0 与 Vue2.0的一些区别 及用法
1.Vue2.0的模板标记外必须使用元素包起来: eg:Vue1.0的写法 <!DOCTYPE html> <html> <head> <meta chars ...
- vue2.0 双向绑定原理分析及简单实现
Vue用了有一段时间了,每当有人问到Vue双向绑定是怎么回事的时候,总是不能给大家解释的很清楚,正好最近有时间把它梳理一下,让自己理解的更清楚,下次有人问我的时候,可以侃侃而谈. 一.首先介绍Obje ...
- PHP--关于模板的原理和解析
此内容用作笔记,以备日后查看,此内容为学习李炎恢课程而来,并非自己所创,如有问题请私信~ 将PHP代码和静态HTML代码进行分离,使代码的可读性和维护性得到显著提高. 使用模板引擎: 我们所说的模板是 ...
- Vue2.0的变化 ,组件模板,生命周期,循环,自定义键盘指令,过滤器
组件模板: 之前: <template> <h3>我是组件</h3><strong>我是加粗标签</strong> </templat ...
- Android进阶:七、Retrofit2.0原理解析之最简流程【下】
紧接上文Android进阶:七.Retrofit2.0原理解析之最简流程[上] 一.请求参数整理 我们定义的接口已经被实现,但是我们还是不知道我们注解的请求方式,参数类型等是如何发起网络请求的呢? 这 ...
- PHP--关于模板的原理和解析(php模板原理)
此内容用作笔记,以备日后查看,此内容为学习李炎恢课程而来,并非自己所创,如有问题请私信~ 将PHP代码和静态HTML代码进行分离,使代码的可读性和维护性得到显著提高. 使用模板引擎: 我们所说的模板是 ...
- 【Vuejs】351- 带你解析vue2.0的diff算法
前言 vue2.0加入了virtual dom,有向react靠拢的意思.vue的diff位于patch.js文件中,该算法来源于snabbdom,复杂度为O(n).了解diff过程可以让我们更高效的 ...
随机推荐
- python multiprocessing 使用
如何在Pool中使用Queue,Stack Overflow的回答,戳这里 其实吧官方文档看一遍应该就大部分都懂了. 需要注意的是:在使用多进程的时候,我们的进程函数的传入参数必须是pickle-ab ...
- 20165318 2017-2018-2 《Java程序设计》第九周学习总结
20165318 2017-2018-2 <Java程序设计>第九周学习总结 目录 学习过程遇到的问题及总结 教材学习内容总结 第13章 Java网络编程 代码托管 代码统计 学习过程遇到 ...
- 10分钟安装OpenStack
1 OpenStack初学者的苦恼 2 OpenStack最低配置要求 3 配置UOS环境 3.1 设置网络 3.1.1 创建路由器 3.1.2 创建网络 3.1.3 创建两个子网 3.2 创建UOS ...
- R执行报错:Error in `[<-.ts`(`*tmp*`,...only replacement of elements is allowed
原因: pred$mean是Time-Series类型,rbind函数不支持.通过as.double将其转换成double类型即可. 修改前代码: all_predata_time <- dat ...
- c++中内存拷贝函数(C++ memcpy)详解
原型:void*memcpy(void*dest, const void*src,unsigned int count); 功能:由src所指内存区域复制count个字节到dest所指内存区域. 说明 ...
- kaggle _Titanic: Machine Learning from Disaster
A Data Science Framework: To Achieve 99% Accuracy https://www.kaggle.com/ldfreeman3/a-data-science-f ...
- nRF5282 资料链接帖子
官方硬件设计参考
- SpringMVC的应用与工作流程解析
一:SpringMVC是什么 SpringMVC只是Spring的一个子框架,作用学过Struts2的应该很好理解,他们都是MVC的框架.学他就是用来代替Struts2的,那么为什么不用Struts2 ...
- 【OC底层】Category、+load方法、+initialize方法原理
Category原理 - Category编译之后的底层结构是 struct categroy_t,里面存储着分类对象方法.属性.协议信息- 当程序运行时,通过runtime动态的将分类的方法.属性. ...
- Delphi 实现不规则窗体
最近为了要兼容XP系统(守旧的市场),又需要做出产品的特效,不得不从头学习一下这门 “聪明的语言” . 开发环境: win10 Delphi 10.2 Version 25.0.26309.314 产 ...