vue源码分析(一)初探vue

本系列文章是作者在学习vue源码时的学习笔记,在学习的过程中会参考其他的文章,并在文末注明相关的引用。如有错误,欢迎指证。

vue源码版本: vue@2.5.17-beta.0

一. 类型校验

vue使用了flow进行语法校验,其中vue自定义了一些数据类型比如component或者Element 等.

flow是facebook出品的代码检查工具,功能类似于typeScript,能够帮助你在编译期间发现代码中数据类型的错误。

二.why function

打开源码目录下的src/platforms/web/entry-runtime-with-compiler.js.这里导出了vue.最终我们可以查找到src/core/instance/index.js. 可以看到以下代码

import { initMixin } from './init'
import { stateMixin } from './state'
import { renderMixin } from './render'
import { eventsMixin } from './events'
import { lifecycleMixin } from './lifecycle'
import { warn } from '../util/index'

function Vue (options) {
  if (process.env.NODE_ENV !== 'production' &&
    !(this instanceof Vue)
  ) {
    warn('Vue is a constructor and should be called with the `new` keyword')
  }
  this._init(options)
}

initMixin(Vue)  	//Vue.prototype._init 原型上挂在_init方法
stateMixin(Vue) 	// Vue.prototype添加$data $props $set $delete $watch方法
eventsMixin(Vue) 	// Vue.prototype添加$on $off $once $emit方法
lifecycleMixin(Vue) // Vue.prototype添加_update $forceUpdate $destroy 方法
renderMixin(Vue) 	//Vue.prototype添加$nextTick _render等方法

export default Vue

这里可以看到Vue是用function而不是class来声明的?为什么不用class来声明呢?
首先我们看到Vue构造函数声明特别简单,紧接着调用不同的mixin函数给Vue的原型对象上添加方法,使用function来声明可以有效的组织代码,将不同功能的mixin函数拆分成不同的文件,这样不用维护一个大的文件。如果我们使用class声明Vue,可能会这样

class Vue {
	constructor() {}
	_init() {}
	$data() {}
	$props() {}
	$set() {}
	$delete() {}
	$watch(){}
	_update(){}
	$forceUpdate(){} 
	$destroy() {}
	$nextTick() {}
	_render() {}
}

可以看到如果使用class声明是非常复杂的,需要在一个class里面维护太多的方法。
这里我们可以借鉴vue的开发思路,在开发框架时使用functionclass更利于代码的组织和维护

除了在原型上添加方法,还调用了initGlobalAPI注册全局API,源码目录下搜索initGlobalAPI

项目结构


├─ .circleci                   // 包含CircleCI持续集成/持续部署工具的配置文件
├─ .github                   // 项目相关的说明文档,上面的说明文档就在此文件夹
├─ benchmarks                 // 基准,性能测试文件,Vue的跑分demo,比如大数据量的table或者渲染大量SVG
├─ dist                       // 构建后输出的不同版本Vue文件(UMD、CommonJS、ES 生产和开发包)
├─ examples                   // 部分示例,用Vue写的一些小demo
├─ flow                       // flow 因为Vue使用了 [Flow](https://flow.org/) 来进行静态类型检查,静态类型检查类型声明文件
├─ packages                   // 包含服务端渲染和模板编译器两种不同的NPM包,是提供给不同使用场景使用的
├─ scripts                   // 存放npm脚本配置文件,结合webpack、rollup进行编译、测试、构建等操作(使用者不需要关心)
│   ├─ alias.js              // 模块导入所有源代码和测试中使用的别名
│   ├─ config.js             // 包含在'dist/`中找到的所有文件的生成配置
│   ├─ build.js               // 对 config.js 中所有的rollup配置进行构建
├─ src                        // 主要源码所在位置,核心内容
│   ├─ compiler               // 解析模版相关
│       ├─ codegen            // 把AST转换为Render函数
│       ├─ directives         // 通用生成Render函数之前需要处理的指令
│       ├─ parser              // 解析模版成AST
│   ├─ core                    // Vue核心代码,包括内置组件,全局API封装,Vue 实例化,观察者,虚拟DOM, 工具函数等等。
│       ├─ components          // 组件相关属性,主要是Keep-Alive
│       ├─ global-api          // Vue全局API,如Vue.use,Vue.extend,Vue.mixin等
│       ├─ instance            // 实例化相关内容,生命周期、事件等
│       ├─ observer            // 响应式核心目录,双向数据绑定相关文件
│       ├─ util                // 工具方法
│       └─ vdom                // 包含虚拟DOM 创建(creation)和打补丁(patching) 的代码
│   ├─ platforms               // 和平台相关的内容,Vue.js 是一个跨平台的MVVM 框架(web、native、weex)
│       ├─ web                 // web端
│           ├─ compiler        // web端编译相关代码,用来编译模版成render函数basic.js
│           ├─ runtime         // web端运行时相关代码,用于创建Vue实例等
│           ├─ server          // 服务端渲染
│           └─ util            // 相关工具类
│       └─ weex                // 基于通用跨平台的 Web 开发语言和开发经验,来构建 Android、iOS 和 Web 应用
│   ├─ server                  // 服务端渲染(ssr)
│   ├─ sfc                     // 转换单文件组件(*.vue)
│   └─ shared                  // 全局共享的方法和常量
├─ test                        // test 测试用例
├─ types                       // Vue新版本支持TypeScript,主要是TypeScript类型声明文件
├─ node_modules               // npm包存放目录
|-- .babelrc.js               // babel配置
|-- .editorconfig             // 文本编码样式配置文件
|-- .eslintignore             // eslint校验忽略文件
|-- .eslintrc.js              // eslint配置文件
|-- .flowconfig               // flow配置文件
|-- .gitignore               // Git提交忽略文件配置
|-- BACKERS.md               // 赞助者信息文件
|-- LICENSE                 // 项目开源协议
|-- package.json             // 依赖
|-- README.md               // 说明文件
|-- yarn.lock               // yarn版本锁定文件

目录结构来自于参考文章Vue源码之目录结构

四 小结

  • vue使用了flow作语法类型校验工具
  • vue 使用了rollup 来作打包工具
  • vue 使用了function来声明Vue,并调用不同功能的mixin函数来给Vue原型添加各种方法。其次还注册了全局的API
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值