Vue源码探究-源码文件组织

源码探究基于最新开发分支,当前发布版本为v2.5.17-beta.0

Vue 2.0版本的大整改不仅在于使用功能上的优化和调整,整个代码库也发生了天翻地覆的重组。可见随着使用者的增加与声名传播,Vue自身的格局发生了很大的突破,特别体现在对Weex框架做了内部支持。不管在未来是使用Weex或者与NativeScript结合做跨平台应用开发,都还是能与React、Angular保持三足鼎立的势头。

Vue的github仓库根目录

先来大致了解一下整个项目的结构(摘译自官方说明文档):

  • scripts:包含构建相关的脚本和配置文件。作者声明一般开发不需要关注此目录
  • dist:构建出的不同分发版本,只有发布新版本时才会跟新,开发分支的新特性不会反映在此
  • flow:包含使用Flow(静态类型检查工具)声明的类型,供全局使用
  • packages:包含服务端渲染和模板编译器两种不同的NPM包,是提供给不同使用场景使用的
  • test:包含所有测试代码
  • src:Vue的源码,使用ES6和Flow类型注释编写的
  • types:使用TypeScript定义的类型声明,并且包含了测试文件,不太明白为什么要同时使用两种静态类型检查语言

以下是官方文档未列出说明的文件夹,好奇宝宝抱着刨根问底的决心一并在此列出:

  • .github:项目相关的说明文档,上面的说明文档就在此文件夹
  • examples:一些示例
  • .circleci:包含CircleCI部署工具的配置文件
  • benchmark: Benchmark性能测试相关文件

根目录下的其他配置文件相信大家都心知肚明有什么作用,不在此赘述了。

基于以上的大致了解,发现除 flowsrc 目录外,其他的文件夹主要都是用来服务于Vue项目组织和构建的,在源码探究的旅途中可以将他们剔除。由于 flow 文件夹里包含了一些预先定义好的静态类型,是与源码编写相关的,还是需要浏览一下。接下来,继续详细的探索一下 src 源码文件夹的组织结构。

Vue的src源码目录

Vue最新版本的源码文件夹下分为6个目录compilercoreserverplatformssfcshared。作者在CONTRIBUTING.md也说明了它们的内容,但在其文档中types文件夹已经被移出到根目录下了,这里没有修改。

Compiler 编译器

包含模板到渲染函数编译器的代码。

拆分原因:1.0版本中就把编译器的功能存放在独立文件夹中,2.0之后的版本进行了调整和优化,可以更好地组织编译器相关功能的代码。

编译器由解析器、优化器、代码生成器组成,另外还有生成编译器、指令相关等一些代码。

编译器的主要构成部分:

  • parser:解析器的作用是将模板转换成元素AST对象。
  • optimizer:优化器负责检测静态抽象树的渲染进行优化。
  • codegen:代码生成器直接从AST对象生成代码字符串。

编译器具体的实现功能在另一篇文章模板编译的实现中进行探讨。

Core 核心

组织与平台无关的通用运行时代码,即与平台解耦,在任何支持Javascript运行的环境下都可以运行。

拆分原因:随着2.0版本区别出了web和weex跨平台两端的开发支持,在不同平台下的编译和运行时都有区别,所以将核心通用的代码提取到独立文件夹中组织,并且不包含那些将要根据不同平台调整的相关代码,如编译器。

核心代码包括2.0版本中最基础的代码部分:

  • Observer:观察者系统,实现监测数据变化的功能。
  • Vdom:Vue虚拟节点树,实现虚拟节点的创建和刷新功能。
  • instance:Vue类,包含构造函数和原型方法的创建。
  • Global-API:全局API。
  • Components:通用抽象组件。
  • util:辅助函数。

Platforms 平台

平台专有代码存放在这个目录中,以不同的平台组成子目录。

拆分原因:2.0版本后在内部支持与Weex框架的融合,与web端的应用开发相区分。

目前分离了出了两个部分:web端开发和weex框架所涉及跨平台开发,分别包含了一些编译器和运行时的不同代码。

Server 服务器渲染

包含服务端渲染的相关代码。

拆分原因:2.0版本后开发了支持服务端渲染的新功能

Sfc 单文件组件文件编译

这一文件夹目前只包含了一个叫parser.js的文件,用来将单文件组件解析为SFC描述对象,输出给编译器继而执行模板编译。

拆分原因:单独抽离解析vue单文件组件的逻辑

Shared 共享常量和函数

Shared是2.0版本之后增加的用来组织共享变量和辅助函数的文件夹,主要从之前的辅助函数文件里抽取出来,在后来的开发中也继续添加了其他函数和常量,从其中包含的constants.js和util.js两个文件的名称中也能显而易见此文件夹的作用。

拆分原因:更好的组织代码


关于为何要花心思来分析一个项目的文件组织方式和目录结构,并不是因为我有着一套成熟的学习项目源代码的方式,而是因为我觉得可能会有一些人与我一样,无法任由那些不懂的东西残留在视线范围内,所以到此为止,带着各种问题探索完了Vue仓库的文件组织,感觉自己对于整个Vue项目的组织有了更深入的了解,为继续解读具体功能的实现排除了无关影响因素,扫清了路障。如有问题欢迎大家指正。

来源:https://segmentfault.com/a/1190000016426470

Vue源码探究-源码文件组织的更多相关文章

  1. Vue源码探究-状态初始化

    Vue源码探究-状态初始化 Vue源码探究-源码文件组织 Vue源码探究-虚拟DOM的渲染 本篇代码位于vue/src/core/instance/state.js 继续随着核心类的初始化展开探索其他 ...

  2. Vue源码探究-全局API

    Vue源码探究-全局API 本篇代码位于vue/src/core/global-api/ Vue暴露了一些全局API来强化功能开发,API的使用示例官网上都有说明,无需多言.这里主要来看一下全局API ...

  3. Vue源码探究-事件系统

    Vue源码探究-事件系统 本篇代码位于vue/src/core/instance/events.js 紧跟着生命周期之后的就是继续初始化事件相关的属性和方法.整个事件系统的代码相对其他模块来说非常简短 ...

  4. Vue源码探究-数据绑定的实现

    Vue源码探究-数据绑定的实现 本篇代码位于vue/src/core/observer/ 在总结完数据绑定实现的逻辑架构一篇后,已经对Vue的数据观察系统的角色和各自的功能有了比较透彻的了解,这一篇继 ...

  5. Vue源码探究-虚拟DOM的渲染

    Vue源码探究-虚拟DOM的渲染 在虚拟节点的实现一篇中,除了知道了 VNode 类的实现之外,还简要地整理了一下DOM渲染的路径.在这一篇中,主要来分析一下两条路径的具体实现代码. 按照创建 Vue ...

  6. spring-cloud-sleuth+zipkin源码探究

    1. spring-cloud-sleuth+zipkin源码探究 1.1. 前言   粗略看了下spring cloud sleuth core源码,发现内容真的有点多,它支持了很多类型的链路追踪, ...

  7. spring-boot-2.0.3之quartz集成,数据源问题,源码探究

    前言 开心一刻 着火了,他报警说:119吗,我家发生火灾了. 119问:在哪里? 他说:在我家. 119问:具体点. 他说:在我家的厨房里. 119问:我说你现在的位置. 他说:我趴在桌子底下. 11 ...

  8. Vue.js 2.0源码解析之前端渲染篇

    一.前言 Vue.js框架是目前比较火的MVVM框架之一,简单易上手的学习曲线,友好的官方文档,配套的构建工具,让Vue.js在2016大放异彩,大有赶超React之势.前不久Vue.js 2.0正式 ...

  9. SpringBoot读取配置文件源码探究

    1. SpringBoot读取配置文件源码探究 1.1. 概览 springboot的源码是再原来的Spring源码上又包了一层,看过spring源码都知道,当我们从入口debug进去的时候,原来的S ...

随机推荐

  1. form:form的一点体会

    留个日程吧,明个写,下班了>>

  2. 学习linux之 rwx对于目录和档案的意义(节选自鸟哥)

    權限對檔案的重要性 檔案是實際含有資料的地方,包括一般文字檔.資料庫內容檔.二進位可執行檔(binary program)等等. 因此,權限對於檔案來說,他的意義是這樣的: r (read):可讀取此 ...

  3. Mybatis resultMap空值映射问题

    参考博客:https://www.oschina.net/question/1032714_224673 http://stackoverflow.com/questions/22852383/how ...

  4. Linux 系统的常用命令之 rm ,rm -rf , rm -f 以及rm 命令的其他参数命令

    1.rm -rf * 删除当前目录下的所有文件,这个命令很危险,应避免使用. 所删除的文件,一般都不能恢复! 2.rm -f 其中的,f参数 (f --force ) 忽略不存在的文件,不显示任何信息 ...

  5. 王垠:谈 Linux,Windows 和 Mac ( 2013)

    这段时间受到很多人的来信.他们看了我很早以前写的推崇 Linux 的文章,想知道如何“抛弃 Windows,学习 Linux”.天知道他们在哪里找到那么老的文章,真是好事不出门…… 我觉得我有责任消除 ...

  6. MySql的架构和历史

    1.1.mysql的逻辑架构 架构为如下: 存储引擎:负责数据的储存和提取,供了几十个API供服务层进行调用.各个存储引擎之间不会进行交互,只是供服务层进行调用.事务控制和锁的管理也是在存储引擎里面进 ...

  7. SpringCloud-Eureka注册中心

    什么是微服务,分布式? 分布式:不同的模块部署在不同的服务器上,可以更好的解决网站高并发. 微服务:架构设计概念,各服务间隔离(分布式也是隔离),自治(分布式依赖整体组合)其它特性(单一职责,边界,异 ...

  8. 使用Swagger生成Spring Boot REST客户端(支持Feign)(待实践)

    如果项目上使用了Swagger做RESTful的文档,那么也可以通过Swagger提供的代码生成器生成客户端代码,同时支持Feign客户端. 但是经过测试,生成Feign代码和REST客户端有些臃肿. ...

  9. SpringMVC拦截器详解[附带源码分析](转)

    本文转自http://www.cnblogs.com/fangjian0423/p/springMVC-interceptor.html 感谢作者 目录 前言 重要接口及类介绍 源码分析 拦截器的配置 ...

  10. SpringCloud中Redis的使用

    1.引入redis相关jar包 <dependency> <groupId>org.springframework.boot</groupId> <artif ...