下面这段代码,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原理-模板解析的更多相关文章

  1. 基于vue2.0原理-自己实现MVVM框架之computed计算属性

    基于上一篇data的双向绑定,这一篇来聊聊computed的实现原理及自己实现计算属性. 一.先聊下Computed的用法 写一个最简单的小demo,展示用户的名字和年龄,代码如下: <body ...

  2. Vue2.0原理-指令

    指令是 模板解析 的续章,本文会尝试从源码的角度来理解 指令 是如何被提取和应用的. 指令的提取 指令的提取过程是在parse阶段进行的,在 parseHTML 方法中,会解析字符串模板为如下的单个a ...

  3. vue1.0 与 Vue2.0的一些区别 及用法

    1.Vue2.0的模板标记外必须使用元素包起来: eg:Vue1.0的写法 <!DOCTYPE html> <html> <head> <meta chars ...

  4. vue2.0 双向绑定原理分析及简单实现

    Vue用了有一段时间了,每当有人问到Vue双向绑定是怎么回事的时候,总是不能给大家解释的很清楚,正好最近有时间把它梳理一下,让自己理解的更清楚,下次有人问我的时候,可以侃侃而谈. 一.首先介绍Obje ...

  5. PHP--关于模板的原理和解析

    此内容用作笔记,以备日后查看,此内容为学习李炎恢课程而来,并非自己所创,如有问题请私信~ 将PHP代码和静态HTML代码进行分离,使代码的可读性和维护性得到显著提高. 使用模板引擎: 我们所说的模板是 ...

  6. Vue2.0的变化 ,组件模板,生命周期,循环,自定义键盘指令,过滤器

    组件模板: 之前: <template> <h3>我是组件</h3><strong>我是加粗标签</strong> </templat ...

  7. Android进阶:七、Retrofit2.0原理解析之最简流程【下】

    紧接上文Android进阶:七.Retrofit2.0原理解析之最简流程[上] 一.请求参数整理 我们定义的接口已经被实现,但是我们还是不知道我们注解的请求方式,参数类型等是如何发起网络请求的呢? 这 ...

  8. PHP--关于模板的原理和解析(php模板原理)

    此内容用作笔记,以备日后查看,此内容为学习李炎恢课程而来,并非自己所创,如有问题请私信~ 将PHP代码和静态HTML代码进行分离,使代码的可读性和维护性得到显著提高. 使用模板引擎: 我们所说的模板是 ...

  9. 【Vuejs】351- 带你解析vue2.0的diff算法

    前言 vue2.0加入了virtual dom,有向react靠拢的意思.vue的diff位于patch.js文件中,该算法来源于snabbdom,复杂度为O(n).了解diff过程可以让我们更高效的 ...

随机推荐

  1. Log4net 使用之 日期字段格式化

    Log4net 是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介. 之前Log4net的日期字段Data一直采 ...

  2. Ubuntu 64 + IntelliJ IDEA + Genymotion 搭建Android开发环境

    环境搭建所需可至 http://pan.baidu.com/s/1gd1Kf4Z 下载 注:     此处假定 Ubuntu 用户名为 chenfei     开发相关全部存放在 /home/chen ...

  3. 【原创】python web应用性能测试出现的问题以及使用的工具

    uwsgi参数设置问题 问题汇总 listen 参数设置过小导致并发上不去 解决办法 更改listen参数, 请先确认linux系统的上限(tcp_max_syn_backlog,somaxconn) ...

  4. linux 几个常用的Debian更新源

    deb http://ftp.debian.org/debian/ lenny main contrib non-free deb-src http://ftp.debian.org/debian/ ...

  5. 在windows下的虚拟环境中使用tk,要留神了

    事情是这样的:有朋友在学习用matplotlib作图,遇到一些问题问我,我也没用过,就想先装一个试试.然后呢,我就随手创建了个虚拟环境.结果,涉及到matplotlib的第一行就报错了: Traceb ...

  6. 【AT987】高橋君

    题目 成爷爷一眼秒,\(tql!!!\) 多组询问,求 \[\sum_{i=0}^kC_{n}^i \] 发现\(k<=n\)啊,于是我们可以把一组询问抽象成一个区间\([k,n]\) 左指针的 ...

  7. 《网络安全编程基础》之Socket编程

    <网络安全编程基础>之Socket编程 我的代码 server.c // server.cpp : Defines the entry point for the console appl ...

  8. virtualbox+vagrant学习-4-Vagrantfile-2-Configuration Version

    Configuration Version 配置版本是vagrant 1.1+能够与vagrant 1.0保持向后兼容的机制.同时引入了引人注目的新特性和配置选项. 如果你运行了vagrant ini ...

  9. IIS提示出现RPC服务器不可用的解决方法

    如果你运行IIS时也遇到“RPC服务器不可用”的故障提示,不妨试试我们下面的办法 依次点击“管理工具→服务→Remote Procedure Call→属性”,其默认启动类别是“自动”,但选项是灰色的 ...

  10. iOS渐变导航栏封装

    由于最近开发的几个项目都有渐变导航栏,每次写的时候都要copy一堆关于导航渐变相关的代码,显得类很冗余,所以花了点时间封装了一个渐变类,直接继承就可以满足大部分需求啦,这里简单写一下心路历程: 渐变的 ...