Vue 2.6 源码剖析-响应式原理学习 - 1.起手

学习目标

  1. Vue.js 的静态成员和实例成员初始化过程
    1. 静态成员如:Vue.use、Vue.set、Vue.nextTick
    2. 实例成员如:vm. e l 、 v m . el、vm. elvm.set、vm.$mount
  2. 首次渲染的过程
  3. 数据响应式原理

准备工作

获取源码

  • 项目地址:https://github.com/vuejs/vue
  • Fork 一份到自己的仓库,克隆到本地,可以自己写注释提交到 github
    • 注意提交的时候要按照规范写提交日志,否则提交失败
      • 例如:docs: 乱写一通
  • 版本选择:Vue 2.6
    • 目前为止 (2020-07) Vue 3.0 还没有发布正式版
    • 新版本是兼容2.6的,发布后,现有项目不会升级到 3.0,2.x 还有很长一段过渡期
    • 3.0 项目地址:https://github.com/vuejs/vue-next

目录结构

  • dist - 打包的结果
    • Vue 打包后会生成很多不同的版本,这些版本在 dist/README.md 中都有相应的介绍
  • examples - 示例
    • 快速体验Vue的基本使用方式
  • src - 源码。根据不同的功能,拆分到不同的文件夹
    • compiler - 编译器,把模板(template)转换成render函数,render函数创建虚拟DOM
    • core - Vue 的核心
      • components 定义了 keep-alive 组件
      • global-api 定义了Vue的静态方法
      • instance 创建Vue实例,定义了Vue的构造函数、初始化、生命周期等相应函数
      • observer 实现响应式机制
      • util 公共成员
      • vdom 虚拟DOM
        • 重写了 Snabbdom,增加了组件的机制
    • platforms - 和平台相关的代码
      • web - web 平台下相关代码
        • entry-*.js 打包时候的入口
      • weex - 基于Vue的移动端开发框架 weex 平台下的相关代码
    • server - 服务端渲染的相关代码(Vue2.0后支持服务端渲染)
    • sfc - 单文件组件 Single Function Component
      • sfc中的代码会将单文件组件转化成JS对象
    • shared - 公共的代码

了解 Flow

Vue 2.x 是使用 Flow 开发的。

Vue 3.0 已经使用 TypeScript 开发,所以没有必要深入学习Flow。

  • Flow 和 TypeScript 都是 静态类型检查器。TypeScript更强大。
  • 它们都是基于 JavaScript 的,是JS的超集。
  • 最终都会编译成 JavaScript。
  • JavaScript 本身是动态类型检查,代码在执行过程中检查代码是否正确。
  • 静态类型检查:代码在编译(执行前)的时候检查代码是否正确。
  • 一般在大型项目中,使用静态类型检查,来确保代码的可维护性和可读性。

Flow 使用:

  • Flow 的 静态类型检查错误 是通过 静态类型推断 实现的。
  • 文件开头 通过 // @flow 或者 /* @flow */ 声明该文件需要 Flow 进行静态类型检查
  • 代码写完后,需要结合Flow官方提供的命令行工具,或vscode的插件,来检查类型是否错误。

在方法中的 形参 后通过冒号指明 参数 所使用的类型,在括号后使用冒号指明 方法返回值 的类型:

/* @flow */
function square(n: number): number {
     
  return n * n;
}
square("2"); // Error

调试

了解如何对Vue的源码进行打包和调试。

看源码的过程中,可以通过调试,来验证自己的一些想法。

打包

打包工具

Vue 源码中使用的打包工具是 Rollup。

  • Rollup 和 Webpack 都是打包工具,Rollup 比 Webpack 更轻量
  • Webpack 把所有文件当作模块,Rollup 只处理 js 文件,更适合在 Vue.js 这样的库中使用。
  • Rollup 打包不会生成冗余的代码。
    • Webpack 会生成一些支持浏览器端的代码。
  • 开发库的时候适合使用Rollup,开发项目适合使用 Webpack。

打包过程

  • 安装依赖 npm i
  • 设置 SourceMap
    • package.json 文件中的 dev 脚本中添加参数 --sourcemap
    • "dev": "rollup -w -c scripts/config.js --sourcemap --environment TARGET:web-full-dev",
  • 执行 dev npm run dev,打包使用的是Rollup
    • -w 监听文件变化,文件变化自动重载,更新结果
    • -c 指定配置文件
    • --environment 设置环境变量
      • 通过设置环境变量TARGET不同的值,来打包生成不同版本的 Vue

注意:

  • dev 脚本会生成单个版本的打包文件到dist目录。
  • build 脚本会生成所有版本的打包文件到dist目录。

为了便于区分,可以将dist清空,或拷贝后置空,来查看dev打包后的结果。

dev 和 build 都不会清空 dist 目录,也不会生成 README.md 文件(可以提前备份)。

开始调试

选择 examples 中的一个示例,如 grid。

将引入的 vue.min.js 改为 vue.js(dev生成的打包文件)。

浏览器打开示例的 index.html

F12 打开开发人员工具,在source面板中找到grid.js代码中创建vue实例的位置,添加断点,刷新页面。

页面到断点停止,F11 跳转到 src 下具体的文件,接下来就可以调试了。

Vue 的不同构建版本

  • npm run build 重新打包生成所有版本的Vue。
  • 官方文档 - 对不同构建版本的解释

源码(dist/README.md)中的解释:

打包文件说明

UMD CommonJS ES Module
开发版本(未压缩版本) Full(完整版) vue.js vue.common.js vue.esm.js
开发版本(未压缩版本) Runtime-only(运行时版) vue.runtime.js vue.runtime.common.js vue.runtime.esm.js
生产版本(压缩版本) Full (production) vue.min.js
生产版本(压缩版本) Runtime-only (production) vue.runtime.min.js

术语

  • Full(完整版): 同时包含 编译器运行时 的版本。
  • Compiler(编译器): 用于将模板字符串(template)编译成 JavaScript 渲染函数(render函数)的代码,体积大(3000行代码),效率低。
  • Runtime(运行时): 用于创建 Vue 实例、渲染并处理虚拟 DOM 等的代码,基本上就是除去编译器的代码。体积小(相对少了3000行代码)、效率高。
  • UMD: UMD版本的通用模块化版本
    • UMD规范
      • 支持多种模块化方式,CommonJS、CMD、AMD 以及 挂载到window对象上使用
      • 可以通过

你可能感兴趣的:(#,Vue2.6,源码剖析)