.11-Vue源码之patch(1)】的更多相关文章

前言 上一篇文章 Vue 源码解读(10)-- 编译器 之 生成渲染函数 最后讲到组件更新时,需要先执行编译器生成的渲染函数得到组件的 vnode. 渲染函数之所以能生成 vnode 是通过其中的 _c._l.._v._s 等方法实现的.比如: 普通的节点被编译成了可执行 _c 函数 v-for 节点被编译成了可执行的 _l 函数 ... 但是到目前为止我们都不清楚这些方法的原理,它们是如何生成 vnode 的?只知道它们是 Vue 实例方法,今天我们就从源码中找答案. 目标 在 Vue 编译器…
前言 前面我们说到,当组件更新时,实例化渲染 watcher 时传递的 updateComponent 方法会被执行: const updateComponent = () => { // 执行 vm._render() 函数,得到 虚拟 VNode,并将 VNode 传递给 vm._update 方法,接下来就该到 patch 阶段了 vm._update(vm._render(), hydrating) } 首先会先执行 vm._render() 函数,得到组件的 VNode,并将 VNod…
vue源码业余时间差不多看了一年,以前在网上找帖子,发现很多帖子很零散,都是一部分一部分说,断章的很多,所以自己下定决定一行行看,经过自己坚持与努力,现在基本看完了,差ddf那部分,因为考虑到自己要换工作了,所以暂缓下来先,ddf那块后期我会补上去.这个vue源码逐行分析,我基本每一行都打上注释,加上整个框架的流程思维导图,基本上是小白也能看懂的vue源码了. 说的非常的详细,里面的源码注释,有些是参考网上帖子的,有些是自己多年开发vue经验而猜测的,有些是自己跑上下文程序知道的,本人水平可能有…
一.前言 最近一直在使用vue做项目,闲暇之余查阅了一些关于vue实现原理的资料,一方面对所了解到的知识做个总结,另外一方面希望能对看到此文章的同学有所帮助.本文如有不足之处,还请过往的大佬批评指正. 二.vue实现原理概述 vue作为一个前端渐进式的MVVM开发库,将广大的前端劳苦大众从DOM操作中解放出来:说到vue的实现原理,大体可分为三个要素: 1.数据的响应式,即vue可以监听到数据的变化 2.模板引擎,模板引擎大家都应该不陌生,同之前使用的handlebars.artTemplate…
目录 1.patch函数的脉络 2.类vnode的设计 3.createPatch函数中的辅助函数和patch函数 4.源码运行展示(DEMO) 一.patch函数的脉络 首先梳理一下patch函数的脉络. 第一,patch核心函数createPatchFunction, 然后,runtime/index.js中将patch方法挂载到vue的原型属性__patch__上. Vue.prototype.__patch__ = inBrowser ? patch : noop 最后patch的使用是…
其实吧,写这些后记我才真正了解到vue源码的精髓,之前的跑源码跟闹着玩一样. go! 之前将AST转换成了render函数,跳出来后,由于仍是字符串,所以调用了makeFunction将其转换成了真正的函数: function compileToFunctions(template, options, vm) { // code... // compile var compiled = compile(template, options); // code... // 转换render res.…
阅读目录 Vue 实例的生命周期 实例创建 响应的数据绑定 挂载到 DOM 节点 结论 研究 runtime 一边 Vue 一边源码 初看 Vue 是 Vue 源码是源码 再看 Vue 不是 Vue 源码不是源码 再再看 Vue 是调用栈 源码也是调用栈 -- By DOM哥 Vue 运行时这一块是非常有意思的,不像 Vue 编译器那么枯燥,这里面有大量的实用技巧和设计思想可以学习.使用过 Vue 的小伙伴应该对 Vue [响应的数据绑定](也叫双向绑定)的印象非常深刻,在修改了数据之后,视图就…
开发vue项目有段时间了, 之前用angularjs 后来用 reactjs 但是那时候一直没有时间把自己看源码的思考记录下来,现在我不想再浪费这 来之不易的思考, 我要坚持!! 看源码我个人感觉非常开心,每每看上一段,自己就充实许多,不知道你是否和我一样. vue 源码是众多module(模块)用 rollup 工具合并而成, 从package.json 中能够看到.现在让我们从github上下载vue项目,开始我们今天的"思考". 我下载的源码版本是: "version&…
Why? 网上现有的Vue源码解析文章一搜一大批,但是为什么我还要去做这样的事情呢?因为觉得纸上得来终觉浅,绝知此事要躬行. 然后平时的项目也主要是Vue,在使用Vue的过程中,也对其一些约定产生了一些疑问,可能官网上只会建议你这么做,但是核心实现我们可能并不知道.比如: v-for key 是如何达到"就地复用"策略 数组更新检测是如何完成的 set 为什么就能动态添加根级别的响应式属性 为什么Vue可以跨平台支持weex,以及后来出现的mpvue ... 其次,很久没有更新内容了,…
Why? 网上现有的Vue源码解析文章一搜一大批,但是为什么我还要去做这样的事情呢?因为觉得纸上得来终觉浅,绝知此事要躬行. 然后平时的项目也主要是Vue,在使用Vue的过程中,也对其一些约定产生了一些疑问,可能官网上只会建议你这么做,但是核心实现我们可能并不知道.比如: v-for key 是如何达到"就地复用"策略 数组更新检测是如何完成的 set 为什么就能动态添加根级别的响应式属性 为什么Vue可以跨平台支持weex,以及后来出现的mpvue ... 其次,很久没有更新内容了,…
前言 前面我们对微信小程序进行了研究:[微信小程序项目实践总结]30分钟从陌生到熟悉 在实际代码过程中我们发现,我们可能又要做H5站又要做小程序同时还要做个APP,这里会造成很大的资源浪费,如果设定一个规则,让我们可以先写H5代码,然后将小程序以及APP的业务差异代码做掉,岂不快哉?但小程序的web框架并不开源,不然也用不着我们在此费力了,经过研究,小程序web端框架是一套自研的MVVM框架,于是我们马上想到了借助第三方框架: 一套代码小程序&Web&Native运行的探索01 经过简单的…
在学习Vue源码之前,首先要做的一件事情,就是去GitHub上将Vue源码clone下来,目前我这里分析的Vue版本是V2.5.21,下面开始分析: 一.源码的目录结构: Vue的源码都在src目录下,分为6个不同功能的文件 src ├── compiler # 编译相关:包括把模板解析成 ast 语法树,ast 语法树优化,代码生成等功能. ├── core # 核心代码:包括内置组件.全局 API 封装,Vue 实例化.观察者.虚拟 DOM.工具函数等等 ├── platforms # 不同…
Vue 源码分析-逻辑层 预期的效果: 监听input的输入,input在输入的时候,会触发 watch与computed函数,并且会更新原始的input的数值.所以直接跟input相关的处理就有3处,但实际上会有连带性的触发,触发watch的input函数的时候,还会触发this.answer对应的依赖处理 看看内部是如何处理的: Vue在初始化data的时候,会通过Object.defineProperty重新定义input的set与get访问接口,同时会创建一个记录并且保持其数据对应的依赖…
Vue源码学习1--Vue构造函数 这是我第一次正式阅读大型框架源码,刚开始的时候完全不知道该如何入手.Vue源码clone下来之后这么多文件夹,Vue的这么多方法和概念都在哪,完全没有头绪.现在也只是很粗略的了解一下,个人认为这篇只是能做到大家阅读Vue的参考导航,可以较快的找到需要看的文件或方法.很多细节依然没有理解到位,但是可以慢慢来,先分享一波~ 源码文件目录结构 - benchmarks 暂时不知道是什么 - dist 存放打包后的文件夹 - examples 示例,这个地方可以自己写…
vue 源码自问自答-响应式原理 最近看了 Vue 源码和源码分析类的文章,感觉明白了很多,但是仔细想想却说不出个所以然. 所以打算把自己掌握的知识,试着组织成自己的语言表达出来 不打算平铺直叙的写清楚 vue 源码的前因后果和全部细节,而是以自问自答的形式,回答我自己之前的疑惑, 如果有错误的地方,欢迎指正哈~ Vue 的双向数据绑定原理 Vue 实现响应式的核心 API 是 ES5 的 Object.defineProperty(obj,key,descriptor),Vue 的「响应式」和…
原文链接:https://geniuspeng.github.io/2018/01/05/vue-reactivity/ Vue的官方说明里有深入响应式原理这一节.在此官方也提到过: 当你把一个普通的 JavaScript 对象传给 Vue 实例的 data 选项,Vue 将遍历此对象所有的属性,并使用 Object.defineProperty 把这些属性全部转为 getter/setter.Object.defineProperty 是 ES5 中一个无法 shim 的特性,这也就是为什么…
前言 我最近在写 Vue 进阶的内容.在这个过程中,有些人问我看 Vue 源码需要有哪些准备吗?所以也就有了这篇计划之外的文章. 当你想学习 Vue 源码的时候,需要有扎实的 JavaScript 基础,下面罗列的只是其中的一部分比较具有代表性的知识点.如果你还不具备 JavaScript 基础的话,建议不要急着看 Vue 源码,这样你会很容易放弃的. 我会从以下 7 点来展开: Flow 基本语法 发布/订阅模式 Object.defineProperty ES6+ 语法 原型链.闭包 函数柯…
1. 前言 博主作为一名前端开发,日常开发的技术栈是Vue,并且用Vue开发也有一年多了,对其用法也较为熟练了,但是对各种用法和各种api使用都是只知其然而不知其所以然,因此,有时候在排查bug的时候就会有点捉襟见肘.鉴于此,索性就从github上clone下来一份Vue源码来学习学习,本系列博文将用来记录博主对Vue源码的整个学习过程,以及自己对源码的一些理解.一方面开阔自己的知识视野,另一方面也希望这些文字能够带给他人些许帮助. 2. 学习规划 2.1 源码学习目录 本项目所分析的Vue.j…
Vue源码分析(二) : Vue实例挂载 author: @TiffanysBear 实例挂载主要是 $mount 方法的实现,在 src/platforms/web/entry-runtime-with-compiler.js & src/platforms/web/runtime/index.js 等文件中都有对Vue.prototype.$mount的定义: // vue/platforms/web/entry-runtime-with-compiler.js Vue.prototype.…
Vue 源码解析 Vue 的工作机制 在 new vue() 之后,Vue 会调用进行初始化,会初始化生命周期.事件.props.methods.data.computed和watch等.其中最重要的是通过Object.defineProperty设置setter和getter,用来实现响应式和依赖收集. 初始化之后,调用 $mount 挂载组件. 启动编译器compile(),对template进行扫描,parse.optimize.generate,在这个阶段会生成渲染函数或更新函数,ren…
Vue源码探究-虚拟DOM的渲染 在虚拟节点的实现一篇中,除了知道了 VNode 类的实现之外,还简要地整理了一下DOM渲染的路径.在这一篇中,主要来分析一下两条路径的具体实现代码. 按照创建 Vue 实例后的一般执行流程,首先来看看实例初始化时对渲染模块的初始处理.这也是开始 mount 路径的前一步.初始包括两部分,一是向 Vue 类原型对象上挂载渲染相关的方法,而是初始化渲染相关的属性. 渲染的初始化 下面代码位于vue/src/core/instance/render.js 相关属性初始…
我们之前提到过 Vue.js 构建过程,在 web 应用下,我们来分析 Runtime + Compiler 构建出来的 Vue.js,它的入口是 src/platforms/web/entry-runtime-with-compiler.js: /* @flow */ import config from 'core/config' import { warn, cached } from 'core/util/index' import { mark, measure } from 'cor…
上一篇是mount之前的添加一些方法,包括全局方法gloal-api,XXXMixin,initXXX,然后一切准备就绪,来到了mount阶段,这个阶段主要是 解析template 创建watcher并存入Dep 更新数据时更新视图 Vue源码里有两个mount 第一个 // src/platform/web/runtime/index.js Vue.prototype.$mount = function ( el?: string | Element, hydrating?: boolean…
概述 我在闲暇时间学习了一下 Vue 的源码,有一些心得,现在把它们分享给大家. 这个分享只是 Vue源码系列 的第一篇,主要讲述了如下内容: 寻找入口文件 在打包的过程中 Vue 发生了什么变化 在 Vue 实例化的时候,它的内部到底做了什么 寻找入口文件 首先我们寻找入口文件,我们查看package.json文件去找它的打包指令: "scripts": { // ... "build": "node scripts/build.js", //…
#1.大致流程 # 2.具体流程 数据驱动 New VUE Where:src/core/instance/index.js Do: 1.使用Function实现Vue类 2.调用_init 初始化Vue 3.混入各种Mixin(暂不清晰) Think: 各种框架无论多么如何追其本源还是由基础的JS生成的一个"类",而后在其原型上追加方法属性等. this._init Where:src/core/instance/init.js Do: 1.合并配置,(另行分析) 2.初始化⽣命周期…
大致流程 具体流程 组件化 (createComponent) 构造⼦类构造函数 const baseCtor = context.$options._base // plain options object: turn it into a constructor if (isObject(Ctor)) { Ctor = baseCtor.extend(Ctor) } 创立BaseCtor Vue.options._base =Vue Vue.extend的作⽤就是构造⼀个Vue的⼦类,它使⽤⼀…
其他章节请看: vue 快速入门 系列 侦测数据的变化 - [vue 源码分析] 本文将 vue 中与数据侦测相关的源码摘了出来,配合上文(侦测数据的变化 - [基本实现]) 一起来分析一下 vue 是如何实现数据侦测的. Tip: 以下代码出自 vue.esm.js,版本为 v2.5.20.无关代码有一些删减.中文注释都是笔者添加. /** * Define a property. * 定义属性的方法 */ function def (obj, key, val, enumerable) {…
7项重要储备 Flow 基本语法 发布/订阅模式 ES6+ 语法 原型链.闭包 函数柯里化 event loop 接上讲 聊到了ES6的几个重要语法,加下来到第四点继续开始. 4.原型链.闭包 原型链 继承于我们前端来说绝对是非常熟悉也必须熟悉的一个高频必懂知识点.熟悉到只要是面试一定会有关于继承的问题:而且源码中继承的使用也随处可见. 可依旧有很多前端对继承的实现和应用没有一个整体的把握.追其原因无非有二: ECMAScript 继承的实现方法区别于其他基于类的实现继承的面向对象(Object…
当学习成为了习惯,知识也就变成了常识. 感谢各位的 点赞.收藏和评论. 新视频和文章会第一时间在微信公众号发送,欢迎关注:李永宁lyn 文章已收录到 github 仓库 liyongning/blog,欢迎 Watch 和 Star. 简介 专栏的第一篇,主要介绍专栏的目的.规划.适用人群,以及准备工作和扫盲的基础知识. 前言 最近在准备一些 Vue 系列的文章和视频,之前 Vue 的源码也读过好几遍,但是一直没写相关的文章,所以最近就计划写一写. 目标 精通 Vue 技术栈的源码原理,这是这系…
前言 上一篇文章 Vue 源码解读(2)-- Vue 初始化过程 详细讲解了 Vue 的初始化过程,明白了 new Vue(options) 都做了什么,其中关于 数据响应式 的实现用一句话简单的带过,而这篇文章则会详细讲解 Vue 数据响应式的实现原理. 目标 深入理解 Vue 数据响应式原理. methods.computed 和 watch 有什么区别? 源码解读 经过上一篇文章的学习,相信关于 响应式原理 源码阅读的入口位置大家都已经知道了,就是初始化过程中处理数据响应式这一步,即调用…