前言 双向绑定v-model不仅仅是对可编辑HTML元素(select, input, textarea和附带[contenteditable=true])同时附加v-bind和v-on,而且还能利用通过petite-vue附加给元素的_value._trueValue和_falseValue属性提供存储非字符串值的能力. 深入v-model工作原理 export const model: Directive< HTMLInputElement | HTMLSelectElement | HTM…
深入v-if的工作原理 <div v-scope="App"></div> <script type="module"> import { createApp } from 'https://unpkg.com/petite-vue?module' createApp({ App: { $template: ` <span v-if="status === 'offline'"> OFFLINE &…
关于指令(directive) 属性绑定.事件绑定和v-modal底层都是通过指令(directive)实现的,那么什么是指令呢?我们一起看看Directive的定义吧. //文件 ./src/directives/index.ts export interface Directive<T = Element> { (ctx: DirectiveContext<T>): (() => void) | void } 指令(directive)其实就是一个接受参数类型为Direc…
在书写petite-vue和Vue最舒服的莫过于通过@click绑定事件,而且在移除元素时框架会帮我们自动解除绑定.省去了过去通过jQuery的累赘.而事件绑定在petite-vue中就是一个指令(directive),和其他指令类似. 深入v-on的工作原理 walk方法在解析模板时会遍历元素的特性集合el.attributes,当属性名称name匹配v-on或@时,则将属性名称和属性值压入deferred队列的队尾,当当前元素所有属性绑定和v-modal处理后以及子元素所有属性绑定.v-mo…
Vue源码探究-虚拟DOM的渲染 在虚拟节点的实现一篇中,除了知道了 VNode 类的实现之外,还简要地整理了一下DOM渲染的路径.在这一篇中,主要来分析一下两条路径的具体实现代码. 按照创建 Vue 实例后的一般执行流程,首先来看看实例初始化时对渲染模块的初始处理.这也是开始 mount 路径的前一步.初始包括两部分,一是向 Vue 类原型对象上挂载渲染相关的方法,而是初始化渲染相关的属性. 渲染的初始化 下面代码位于vue/src/core/instance/render.js 相关属性初始…
前言 上一篇文章 Vue 源码解读(2)-- Vue 初始化过程 详细讲解了 Vue 的初始化过程,明白了 new Vue(options) 都做了什么,其中关于 数据响应式 的实现用一句话简单的带过,而这篇文章则会详细讲解 Vue 数据响应式的实现原理. 目标 深入理解 Vue 数据响应式原理. methods.computed 和 watch 有什么区别? 源码解读 经过上一篇文章的学习,相信关于 响应式原理 源码阅读的入口位置大家都已经知道了,就是初始化过程中处理数据响应式这一步,即调用…
本篇文章是在阅读<剖析 Vue.js 内部运行机制>小册子后总结所得,想要了解详细内容,请参考原文:https://juejin.im/book/5a36661851882538e2259c0f 阅读源码前想要先了解Vue的内部机制和运行原理,帮助更快更有针对性的阅读源码 所以就找到了上面的小册子,小册子里主要是简化版的源码 这篇文章更主要是对小册子消化后的个人笔记和总结,大部分内容是使用流程图等对Vue运行的整体流程和各个阶段做更加直观的展示 下面对上图所示的整体流程做简单介绍: 一.主要步…
一. 状态改变机制源码分析 在剖析Master核心的资源调度算法之前,让我们先来看看Master的状态改变机制. Driver状态改变  可以看出,一旦Driver状态发生改变,基本没有好事情,后果要么是删除Driver,要么是报异常!   removeDriver方法:   Executor状态改变  可以看出,如果Executor时非正常退出,会尝试重新调度(启动)该Executor,直到该Application达到了最大的重试次数10次.   removeApplication方法 二.…
接着上期内核源码(六)的最后,DAGSchedule会将每个Job划分一系列stage,然后为每个stage创建一批task(数量与partition数量相同),并计算其运行的最佳位置,最后针对这一批task创建一个TaskSet对象,调用submitTasks方法提交TaskSet到TaskSchedule.那么这篇文章我们来剖析TaskScheduler接收到TaskSet后会进行的一系列操作.    taskScheduler.submitTasks( new TaskSet(tasks.…
1 概述 1.1 引言 android完成非阻塞式的异步请求的时候都是通过启动子线程的方式来解决,子线程执行完任务的之后通过handler的方式来和主线程来完成通信.无限制的创建线程,会给系统带来大量的开销.如果在高并发的任务下,启用个线程池,可以不断的复用里面不再使用和有效的管理线程的调度和数量的管理.就可以节省系统的成本,有效的提高执行效率. 1.2 线程池ThreadPoolExecutor okhttp的线程池对象存在于Dispatcher类中.实例过程如下 public synchro…