摘要:今天开始打算用个月的时间读一些源码,先从的开始吧。进入这个文件,它引用了来进行实例化。也就是初始化的核心代码了。
今天开始打算用3个月的时间读一些源码,先从MVVM的vue开始吧。
vue是一个非常不错的前端框架,不仅体积小,性能高,而且学习曲线非常平缓,很容易上手。官方文档也很详解,配套的构建工具很完事。还有很多第三方的组件和组件库,可以让开发者更高效的工作。
源码是vue2.4.0版本。
项目结构在看源码之前先分析下项目结构,对项目有一个比较全面的了解。
vue-dev项目结构
├── build --------------------------------- 构建相关文件 ├── dist ---------------------------------- 生成文件的输出目录 ├── examples ------------------------------ 一些vue使用的例子 ├── flow ---------------------------------- flow(Flow is a static type checker for your JavaScript code.)类型声明 ├── package.json -------------------------- 依赖管理 ├── test ---------------------------------- 测试文件 ├── src ----------------------------------- 源码 │ ├── compiler -------------------------- 编译器代码,template-->render function │ │ ├── parser ------------------------ 模板字符串转-->抽象语法树 │ │ ├── codegen ----------------------- 抽象语法树(AST)-->render function │ │ ├── optimizer.js ------------------ 分析静态树,优化vdom渲染 │ ├── core ------------------------------ 核心代码 │ │ ├── observer ---------------------- 双向绑定,数据观察的代码 │ │ ├── vdom -------------------------- VNode对象&patch方法的代码 │ │ ├── instance ---------------------- Vue构造函数相关的代码 │ │ ├── global-api -------------------- Vue构造函数挂载全局方法(静态方法)或属性的代码 │ │ ├── components -------------------- 通用组件 │ ├── server ---------------------------- SSR(server-side rendering)的代码 │ ├── platforms ------------------------- 平台相关代码 │ ├── sfc ------------------------------- 对单文件组件进行解析 │ ├── shared ---------------------------- 通用代码(util之类)vue的初始化
了解了大体的目录结构之后,就从package.json开始看起了。在package.json文件里我们发现在执行npm run dev的时候,执行的下面这个脚本,也就是Target是web-full-dev
"scripts": { "dev": "rollup -w -c build/config.js --environment TARGET:web-full-dev", ... }
之后去build/config.js里去看看 web-full-dev是什么
"web-full-dev": { entry: resolve("web/entry-runtime-with-compiler.js"), dest: resolve("dist/vue.js"), format: "umd", env: "development", alias: { he: "./entity-decoder" }, banner }
我们看到这个的入口文件是entry-runtime-with-compiler.js。进入这个文件,它引用了/src/platform/runtime/index--->/src/core/index--->/src/core/instance/index来进行实例化vue。
instance/index.js也就是vue初始化的核心代码了。
//初始化入口 initMixin(Vue) //数据绑定,$watch方法 stateMixin(Vue) //事件方法,比如$on,$off,$emit eventsMixin(Vue) //生命周期方法 lifecycleMixin(Vue) //渲染方法,用来生成render function 和 VNode renderMixin(Vue)
initMixin方法
首选来具体看一下initMixin里做了什么
initLifecycle -- 定义$parent, $root, $children, $refs, _watch,
_inactive, _directInactive, _isMounted, _isDestroyed, _isBeingDestroyed给vue实例
initEvents -- 创建_events事件管理对象,$options._parentListeners监听父组件listener
initRender --创建_vnode,_staticTrees,$slots,$scopedSlots,$createElement给vue实例
callHook(vm, "beforeCreate")--执行beforeCreate的钩子方法
initState--
initProps--绑定props initMethods--绑定方法 initData-通过observe进行数据绑定, 给每一个data的属性加上getter,setter.
callHook(vm, "created")--执行created的钩子方法
vm.$mount(vm.$options.el) -- 通过el or template or render function 渲染dom
stateMixin方法
数据绑定 将$watch,$data,$props,$set,$delete加在Vue.prototype上
eventsMixin方法
初始化事件方法,定义$on,$off,$emit,$once到Vue.prototype上
lifecycleMixin方法
生命周期方法,定义_update,$forceUpdate,$destroy到Vue.prototype上
renderMixin方法
渲染方法,用来生成render function 和 VNode
有不足之处请指正,欢迎一起交流学习。
轮子工厂--一个分享优秀的vue,angular组件的网站
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/87198.html
摘要:下面无耻的贴点源码。启动类我们也学,把启动类抽象成两层,方便以后写客户端。别着急,我们慢慢来,下一篇我们会了解以及他的成员,然后,完善我们的程序,增加其接收数据的能力。文章的源码我会同步更新到我的上,欢迎大家,哈哈。 废话两句 这次更新拖了很长时间,第一是自己生病了,第二是因为最开始这篇想写的很大,然后构思了很久,发现不太合适把很多东西写在一起,所以做了点拆分,准备国庆前完成这篇博客。...
摘要:所以它与其他系列的文章并不冲突,完全可以在阅读完这个系列后,再跟着其他系列的文章接着学习。如何阅读我在写系列的时候,被问的最多的问题就是该怎么阅读源码我想简单聊一下自己的思路。感谢大家的阅读和支持,我是冴羽,下个系列再见啦 前言 别名:《underscore 系列 8 篇正式完结!》 介绍 underscore 系列是我写的第三个系列,前两个系列分别是 JavaScript 深入系列、...
阅读 3130·2021-11-24 09:39
阅读 2865·2021-11-23 09:51
阅读 846·2021-11-18 10:07
阅读 3525·2021-10-11 10:57
阅读 2707·2021-10-08 10:04
阅读 2980·2021-09-26 10:11
阅读 1009·2021-09-23 11:21
阅读 2719·2019-08-29 17:28