vue源码学习与分析
前言
终于来开始对
vue源码
进行一个完整的剖析学习了!
根据整体的源码分析,整理了以下 👇 一个关于vue源码
的学习计划:
🌠 这里分为几个阶段来对vue源码
进行解读与学习!
- vue源码学习;
- vue-cli脚手架学习;
- vue全家桶
vuex
、vue-router
学习; - vue-loader学习
👽 这边将从本文章以及后续的其他文章中记录关于vue源码
的一个学习过程,从源码的角度来理解这样子设计的一个目的!
源码整体剖析
从比较大的角度来理解源码,并分析源码的一个运行执行过程,提炼其中的关键参与成员!
一切从new Vue({})
开始
😕 👇 一个最简单的程序的运行
1 |
|
🌠 上面这里展示了一个最简单的vue
实例的使用!本文以及后续的博文中的调试,都基于之前的vue源码调试文章来进行的源码调试!
👉 从宏观角度来分析,可以得出这个Vue函数对象
主要经过以下一系列动作的“加持”,使得其达到现在的效果:
添加实例属性
通过对于
vue
实例的属性加持,使得原本一个普通的Vue函数对象,成为一个具有生命周期,而且对相关的数据进行监听watch的函数对象!对应 👇 以下的相关代码:
1 | // src/core/instance/index.js |
🌠 从这里可以看出依次执行的*Mixin
方法,来对Vue实例
进行混入相关的属性
initMixin(vm)
1 | export function initMixin(Vue){ |
🌠 由此可见当new一个Vue实例的时候,将自动调用_init
方法,并传递相关的options
对象属性!
👉 生命周期以及其建立过程
先来看一下官方的组件的生命周期图:
🌠 对应有以下的执行结果:
🌠 而对应的实现过程也比较简单:按照既定的顺序依次调用对应的勾子函数,如下代码所示:
1 | // initMixin(Vue)中的部分代码 |
😕 这里有一个 ❓ 疑问:如何将一个Vue实例“变成”普通的html,并展示在界面上???
👽 关于这个问题的解答,将在后续单独的文章:{} 具体解析一波!
stateMixin(vm)
主要是监听的系列API属性添加!
1 | export function stateMixin(Vue){ |
eventsMixin(vm)
这里主要是与事件(监听、取消监听、触发)相关的API设置
1 | export function eventsMixin(vm){ |
lifecycleMixin(vm)
这里主要是与组件生命周期相关的API设置
1 | export function lifecycleMixin(vm){ |
renderMixin(vm)
这里主要是与界面渲染相关的API设置
1 | export function renderMixin(vm){ |
👇 是对应的installRenderHelper方法
的内容!
原型(静态)属性以及方法的加持
关于实例与Vue对象上的属性加持的过程,从一个普通的Vue函数,逐渐成为一个具有生命周期、带数据双向绑定的函数对象,如下图所示:
运行环境的加持
☝ 🈶 一个方法的调用:
1 | if (vm.$options.el) { |
😕 这里的$mount
方法是在什么时候定义的呢?跟踪了一下代码,😖 还是没能发现其中被定义的地方,然后进行的源码的全局搜索,才能找到其初始定义是在src/platforms/web/runtime/index.js
中所定义到,但是程序根本没有运行到这个位置,🌠 再次从package.json
中的script
入手,发现 🈶 👇 一个程序执行语句
1 | { |
☝ 这里通过加载config.js
,并传递对应的参数TARGET=web-full-dev
,以此关键词,在对应的config.js
中查找到build节点中寻找到:
1 | // Runtime+compiler development build (Browser) |
👽 结合之前习得的webpack
打包的相关知识,可以得出:vue.js结果文件的打包,是以某个入口文件作为应用程序的入口(这里是web/entry-runtime-with-compiler.js
),来进行的结果文件的打包过程的!!!
👇 是对应整理的关于Vue
的依赖定义使用顺序图:
👇 而关于$mount
如何将一个Vue实例
给渲染成为对应的html,并展示到界面上,将在后续的博文:vm实例如何渲染 具体详细介绍
小结
通过初步地对
vue源码
进行初步的解读,了解了其中Vue
的基本组成元素,了解了其基本的工作过程,同时也学习到了关于vue
架构设计上的技巧,使得后续自己在设计自己的框架的时候,可以有了一定的参考价值:
- 采用一传统的Vue函数对象,作为整个框架的入口;
- 通过对Vue函数对象以及Vue函数的原型进行属性的追加,分别采用统一入口,针对接口编程,实现自己整体架构的功能的完善;
- 抽离公共的功能到Vue函数对象中,然后借助于打包工具,以不同的环境对应采用不同的文件作为应用程序的入口,实现打包出不同功能的target结果包。