资讯专栏INFORMATION COLUMN

每天读一点源码---vue的初始化

luffyZh / 1805人阅读

摘要:今天开始打算用个月的时间读一些源码,先从的开始吧。进入这个文件,它引用了来进行实例化。也就是初始化的核心代码了。

今天开始打算用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

相关文章

  • 【自己读源】Netty4.X系列(二) 启动类成员Channel

    摘要:下面无耻的贴点源码。启动类我们也学,把启动类抽象成两层,方便以后写客户端。别着急,我们慢慢来,下一篇我们会了解以及他的成员,然后,完善我们的程序,增加其接收数据的能力。文章的源码我会同步更新到我的上,欢迎大家,哈哈。 废话两句 这次更新拖了很长时间,第一是自己生病了,第二是因为最开始这篇想写的很大,然后构思了很久,发现不太合适把很多东西写在一起,所以做了点拆分,准备国庆前完成这篇博客。...

    waterc 评论0 收藏0
  • underscore 该如何阅读?

    摘要:所以它与其他系列的文章并不冲突,完全可以在阅读完这个系列后,再跟着其他系列的文章接着学习。如何阅读我在写系列的时候,被问的最多的问题就是该怎么阅读源码我想简单聊一下自己的思路。感谢大家的阅读和支持,我是冴羽,下个系列再见啦 前言 别名:《underscore 系列 8 篇正式完结!》 介绍 underscore 系列是我写的第三个系列,前两个系列分别是 JavaScript 深入系列、...

    weknow619 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<