Vue源码学习(一)——追根究底Vue

打算开始学习vue的源码开始,我开始 serach 关键词:vue 源码,但是发现不少都不是我想要看到的东西,因此打算记录下来,学习的记录和往后分享。我在想这个文章的名字时,手把手系列?十分钟系列?小白到大佬系列?都不是,只是单纯的学习笔记

文件结构

当我从 githubclone Vue 源码后,我看到不少熟悉的文件夹命名,以及配置文件,但对于我个小菜鸡,我仍是想总体了解一下每一个文件夹的内容,而后再去深挖~
有些我本身如今还不是很懂的后续再补上~vue

├─benchmarks
├─dist   打包后文件目录
├─examples 部分示例
├─flow  声明静态类型
├─packages  vue可被分红的其余npm包
│  ├─vue-server-renderer
│  ├─vue-template-compiler
│  ├─weex-template-compiler
│  └─weex-vue-framework
├─scripts 
├─src   主要源码
│  ├─compiler
│  ├─core   核心代码
│  ├─platforms  平台相关内容
│  ├─server 服务端渲染相关
│  ├─sfc
│  └─shared
├─test  测试用例
└─types 类型定义
    └─test

从入口文件开始

首先,咱们拿到一个文件后,咱们应该养成习惯去查看项目根目录下的package.json文件。文件的基本构成:项目名称、版本、描述、执行命令、项目依赖等。
其中执行命令 script是咱们当前所关注的,对于项目的文件结构,咱们须要去找到项目的启动的入口文件,接下来咱们去一步一步的找到vuegit

分析命令

"scripts": {
  "dev": "rollup -w -c scripts/config.js --environment TARGET:web-full-dev"
}

rollup是一个 JavaScript 模块打包器。感兴趣的话能够去具体的研究,这里咱们不作具体的探究。那咱们知道这里它存在的做用就是对js进行打包处理。 github

咱们来具体看一下这个命令的含义:web

  • -w watch 监听源文件是否有改动,有改动从新打包
  • -c config 使用配置文件 scripts/config.js
  • --environment 传递给配置文件的环境变量,这里传递的是目标文件 TARGET

根据以上,咱们能够得知,该命令为使用 scripts/config.js中的配置文件去打包 TARGET:web-full-dev,咱们想知道这个targt 具体指的是什么,咱们须要去看一下config配置文件npm

层层递进

1.scripts\config.js 中咱们能够找到,最下方为该文件的js执行部分,其中先去判断了咱们所传入的Target,而后调用了genConfigjson

//  判断传入的环境变量
if (process.env.TARGET) {
  module.exports = genConfig(process.env.TARGET)
}

2.咱们继续往上看,genconfig根据函数名咱们能够得知,为获取config这样的一个功能,Target为传入的name,文件的上方定义了 builds,一个属性对应一个Target*,这样咱们能够找到咱们专一的web-full-devsegmentfault

// builds 对象,属性名对应Target
const builds = {
  // ...

  // Runtime+compiler development build (Browser)
  '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
  }

  // ...
}

// ...

// 这里传入的name 就是Target
function genConfig (name) {
  const opts = builds[name]
  // ... other config
}

从上能够看出,咱们须要的是入口文件即entry中对应的web/entry-runtime-with-compiler.jsweex

3.打开entry-runtime-with-compiler.js, 在文件上方,咱们能够看到这个文件中import Vue,咱们所须要的是去追根到Vue的起始,因此就找到了上一层runtime/indexide

// 引入了Vue的实例
import Vue from './runtime/index'

4.打开上一步咱们找到的src/platforms/web/runtime/index.js 文件,第一行就引入了import Vue from 'core/index'
不要紧咱们继续,酒香不怕巷子深
5.src\core\index.js函数

// 又一次是引入了Vue的实例
import Vue from './instance/index'

6.src/core/instance\index.js,惊喜~ ,在这里咱们找到了Vue的构造函数,构造函数中仅调用了init方法,_init方法哪里来的呢,固然是文件下方在Vue原型上绑定的方法,接下来咱们会以一个的去

// Vue的构造函数
function Vue (options) {
  //... 验证环境
  this._init(options)
}

// 在Vue原型上绑定实例方法
initMixin(Vue)  // init
stateMixin(Vue)  // $set $delete $watch
eventsMixin(Vue)  // $on $once $off $emit
lifecycleMixin(Vue)  // _update $forceUpdate $destroy
renderMixin(Vue)  // $nextTick _render

总结

综上,小结一下追根过程

package.json
--> scripts/config.js
--> web/entry-runtime-with-compiler.js
--> src/platforms/web/runtime/index.js
--> src/core/index.js
--> src/core/instance/index.js

下一篇 :Vue源码学习(二)——从宏观看Vue

相关文章
相关标签/搜索