深入 Vue - 源码目录及构建过程分析

栏目: 编程语言 · 发布时间: 5年前

内容简介:摘要:Vue 源码阅读第一步。本文主要梳理一下 vue 代码的目录,以及 vue 代码构建流程,旨在对 vue 源码整体有一个认知,有助于后续对源码的阅读。

摘要:Vue 源码阅读第一步。

Fundebug经授权转载,版权归原作者所有。

本文主要梳理一下 vue 代码的目录,以及 vue 代码构建流程,旨在对 vue 源码整体有一个认知,有助于后续对源码的阅读。

1. 目录结构

深入 Vue - 源码目录及构建过程分析

上图是对 vue 的代码的所有目录进行的梳理,其中源码位于 src 目录下,下面对 src 下的目录进行介绍。

compiler

该目录是编译相关的代码,即将 template 模板转化成 render 函数的代码。

vue 提供了 render 函数,render 函数作用是用来创建 VNode,但在平时开发中,绝大多数情况下使用 template 来创建 HTML,所以需要将 template 模板编译成 render 函数。

编译工作既可以在代码构建时做,也可以在客户端运行时做,但编译十分消耗性能,所以在项目中建议使用 runtime 版本。

core

这部分代码是 vue 的核心代码,可以说是 vue 的灵魂所在,也是我们要重点学习的源码。

core 目录又包含如下子目录。

  • components – 内置组件的代码,即 keep-alive 代码
  • global-api – 全局 API 代码,mixin,extend 等 api 在这里实现
  • instance – vue 实例化相关代码,包括初始化,事件,生命周期,渲染等部分的代码
  • observer – 响应式数据相关代码
  • util – 工具方法
  • vdom – 虚拟 dom 的代码。

platforms

platforms 下包含两个子目录,web 和 weex。

分别代表可以打包生成在 web 端使用的 vue 代码和在 native 端使用的 weex 代码。美团开源的开发微信小程序的 mpvue 框架也是在这个目录下进行拓展的。

通过不同平台的入口就可以打包出运行在不同平台的版本的 vue 文件,后面代码构建部分会介绍具体的构建过程。

server

该目录下是 SSR 相关的代码。

Vue.js 是构建客户端应用程序的框架。除了可以在浏览器中输出 Vue 组件,也可以将同一个组件渲染为服务器端的 HTML 字符串,将它们直接发送到浏览器,最后将这些静态标记”激活”为客户端上完全可交互的应用程序。

sfc

我们平时开发时,都是写 .vue 文件。sfc 的代码就是提供一个解析器,把.vue 文件代码解析成一个 javascript 对象。

shared

该目录下定义了一些公用的 工具 方法,提供给上面的几个目录内代码使用。

2. 源码编译

vue 的源码按照功能拆分的十分清晰,每个功能都有单独的目录,那么项目中引用的 vue 文件是怎么编译出来的呢?

首先,我们看一下编译输出的 dist 目录。

深入 Vue - 源码目录及构建过程分析

可以看到,dist 下有 10 几种不同版本的 vue 文件,他们是根据不同规范(包括 CommonJS 规范,ES Module,UMD)和 是否包含编译器 构建出的不同版本。

vue 源码选择了 rollup 进行构建,rollup 相比于 webpack,更加轻量,编译后的代码更加干净,更适合 javascript 库的构建,除了 vue 以外,像 React,Ember,D3,Three.js 以及其他很多开源库也选择了 Rollup 进行构建。

下面看一下 vue 具体构建过程,首先到 pakage.json 中看下 vue 编译执行的命令。

深入 Vue - 源码目录及构建过程分析

从命令可以看出,构建命令就是执行 scripts 目录下 build.js 文件。

下面是 scripts/build.js 核心代码 (\ *下文中汉字注释部分是为方便理解自己补充的)*

深入 Vue - 源码目录及构建过程分析

从代码可以看出,首先通过 script/config.js 文件的 getAllBuilds 方法获取配置,然后根据构建命令传入的参数对配置进行过滤,最后根据过滤后的配置执行 build 函数,编译出对应版本的 vue 文件。 (这里介绍代码构建的过程,主要说明 vue 是怎么构建出不同版本代码的,build 方法在此不做分析)

接下来我们在看一下配置文件 script/config.js 中的 getAllBuilds 是怎么获取具体配置的。

深入 Vue - 源码目录及构建过程分析

可以看出,getAllBuilds 方法首先通过 Object.keys 拿到 builds 对象所有 key 的组成的数组,并通过 map 遍历执行 genConfig 方法。下面我们先看一下 builds 对象。

深入 Vue - 源码目录及构建过程分析

可以看出,builds 对象是不同版本 vue 的编译配置。具体配置项的作用,已经用注释在代码中标出。接下来我们看下 genConfig 函数做了什么。

深入 Vue - 源码目录及构建过程分析

genConfig 通过 key 拿到 builds 中每个 key 对应的配置对象,然后根据这个对象重新定义一个 config 对象,这个 config 对象的结构才是 rollup 配置真正需要的结构。

看了 builds 对象和 genConfig 方法,我们就知道了 getAllBuilds 的目的,是通过映射把 builds 配置对象转化成 rollup 所需要的配置数据。

到这里,我们就清楚是如何构建出不同版本的 vue 代码了。

3. 心得

学习源码时,不建议按照源码的顺序一行一行的阅读。首先要抓住主干,先梳理清楚主要的代码逻辑,再去仔细阅读具体的每行代码。另外按照源码顺序阅读可能很枯燥,很难坚持下来,可以先选择自己感兴趣的部分进行学习,最后再串联起来。

如果喜欢本文请关注公众号 前端小苑 ,下一篇 vue 源码文章,将为大家介绍 render 函数和 Virtual DOM 。

深入 Vue - 源码目录及构建过程分析

关于Fundebug

Fundebug专注于JavaScript、微信小程序、微信小游戏、支付宝小程序、React Native、Node.js和 Java 线上应用实时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了10亿+错误事件,付费客户有Google、360、金山软件、百姓网等众多品牌企业。欢迎大家免费试用!

深入 Vue - 源码目录及构建过程分析


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

JAVA核心技术(卷1)

JAVA核心技术(卷1)

Cay S. Horstmann、Gary Cornell / 杜永萍、邝劲筠、叶乃文 / 机械工业出版社 / 2008-6 / 98.00元

《JAVA核心技术(卷1):基础知识(原书第8版)》是《Java核心技术》的最新版,《Java核心技术》出版以来一直畅销不衰,深受读者青睐,每个新版本都尽可能快地跟上Java开发工具箱发展的步伐,而且每一版都重新改写了的部分内容,以便适应Java的最新特性。本版也不例外,它反遇了Java SE6的新特性。全书共14章,包括Java基本的程序结构、对象与类、继承、接口与内部类、图形程序设计、事件处理......一起来看看 《JAVA核心技术(卷1)》 这本书的介绍吧!

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具