Vue 源码分析 -- 我该从哪里入手?

Vue 源码分析 -- 我该从哪里入手?

我想要读读源码,想要通过读一遍源码更好的理解 Vue 的特性,想要通过读一遍源码领略一下框架的风采。这个想法要求我必须完整的,全面的读一遍 Vue 的源码。

但是当我拿到 Vue 源码时忽然发现不知道该从哪里入手了。那么多文件夹,哪个才是 Vue 实例部分?又都有什么作用?那么多文件,哪个文件才是入口文件?哪里才是核心部分?哪里是骨架?哪里是分支模块?

从哪里开始,到哪里去?

通过官网,我了解到 Vue 按照不同的打包方式,按照不同的模块需求有多重编译方式,也对应多个编译文件。从基础功能上划分,就分为运行时版本和完整版本。由此可见其核心在运行时模块。

image.png

接下来就是去找运行时模块的入口了。为了适配当前主流的模块化方案,Vue 的打包方案又分为 UMD,CommomJS,ES Module(基于构建工具使用)、ES Module(基于浏览器) 。

image.png

根据自己想要了解的侧重点,选择从哪种方式入手都可以,不同的打包方式和功能模块会影响到 Vue实例构建过程中的功能注入。我选择从 ES Module(基于构建工具) 开始,以运行时代码为目标。顺便了解更多这条线上的相关知识。

那么我接下来的目标是通过 ES Module 的构建命令,找到总的入口文件,然后再找运行时模块的入口文件,然后开始盘她。

找到目标(路径)

思路有了,那么接下来可是行动。打开 package.json 文件。找到 scripts 部分,这里是打包命令,虽然命令很多,不过 build 命令才是主角,三个build 命令,第一个是普通的打包,第二是 ssr 服务端渲染打包方案(暂时不考虑),第三个是 weex 的打包方案(暂时不考虑),最终都指向 "scripts/build.js" 文件。(其他命令大多最终也都指向 build 命令)

image.png

script 文件夹目录如下,这里包含了各种方案的配置:

image.png

script/build.js 文件是 build 的入口文件,这里包含了输入文件,输出文件,文件路经等打包配置。 代码中这一行代码告诉我 script/config.js 包含了全部的配置方案。

let builds = require('./config').getAllBuilds()

打开 script/config.js 文件,确实有好多配置,这里只贴出我需要的,由此可见下一步就是 'web/entry-runtime.js' 文件了。

const builds = {
    // Runtime only ES modules build (for bundlers)
  'web-runtime-esm': {
    entry: resolve('web/entry-runtime.js'),
    dest: resolve('dist/vue.runtime.esm.js'),
    format: 'es',
    banner
  },
  ...
}

alias 文件中配置了web文件夹是指向 "src/platforms/web" 的:

module.exports = {
  vue: resolve('src/platforms/web/entry-runtime-with-compiler'),
  compiler: resolve('src/compiler'),
  core: resolve('src/core'),
  shared: resolve('src/shared'),
  web: resolve('src/platforms/web'),
  weex: resolve('src/platforms/weex'),
  server: resolve('src/server'),
  sfc: resolve('src/sfc')
}

找到 "src/platforms/web/entry-runtime.js" 文件,这里只有两行代码:

import Vue from './runtime/index'

export default Vue  

打开 './runtime/index' 文件,这里已经是 Vue 实例的构建部分了。找到正文!虽然这里依然不是 Vue 实例的初始化部分,但是这里已经是最外层的 Vue 实例构建了。继续在往下追两层可以发现,Vue 的构建方案是按照功能、平台、打包方式等需求逐层构建,各个功能模块根据需求可插拔的。而非一次性构建完成。由此可以看出 Vue 循序渐进的构建过程,正如作者所言,这是一个有着平滑学习曲线的框架。

既然是一层一层构建,那么我们应该从最里层开始,还是从最外层开始呢?

从常规角度看,应该是先小后大,从核心模块开始,然后一层一层的给 Vue 穿衣服。但是在我之前尝试直接读核心模块代码的时候,发现核心部分会用到很多外层的接口,结果就是一脸懵逼。所以有时候读一行代码,可能要往外找n个文件,甚至找到了打包构建模块,此时又觉得是先构建环境然后才写的 Vue 核心部分代码。结果进度会很慢,而且有些地方会很难理解。

这次从最外层开始阅读,验证下是否是先理解构建环境然后再理解核心部分。

至此,我找到了我应该分析这个庞大体系中的哪一部分功能代码以实现我想要理解 Vue 特性的目的 —— 运行时模块,找到了改从哪个文件开始 —— "src/platforms/web/runtime/index",找到了理解 Vue 源码的顺序 —— 像洋葱一样一层一层剥开,然后吃掉!

那么接下来。开始吃洋葱!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容