点击上方“码农突围”,马上关注,每天早上8:50准时推送

真爱,请置顶或星标

作者:方应杭

https://juejin.im/post/5d977f47e51d4578453274b3

5号凌晨,尤雨溪公布了 Vue 3 源代码。

话不多说,我们趁热对 Vue 3 源码进行一些简要的分析。

如果你还没有阅读过 Composition API RFC,可能无法完全看懂下面的内容。

兼容性

目前打包后的代码是 ES2015+,不支持 IE 11。

对 TypeScript 的使用

目前的代码 98% 以上使用 TypeScript 编写。

如果你还没有学习 TypeScript,请尽快学习,否则可能看不懂源码。

另外有件事情说出来可能会让你非常惊讶,Vue 3 的源代码完全没有使用 class 关键字!(只在测试代码和示例代码里用到了 class 关键字)

什么时候发正式版

目前 Vue 3 处于 Pre-Alpha 版本。后面应该还会有 Alpha、Beta 等版本。

根据 Vue 官方时间表,至少要等到 2020 年第一季度才有可能发布 3.0 正式版。

代码结构

代码仓库中有个 packages 目录,里面是 Vue 3 的主要功能的实现,包括

  • reactivity 目录:数据响应式系统,这是一个单独的系统,可以与任何框架配合使用。

  • runtime-core 目录:与平台无关的运行时。其实现的功能有虚拟 DOM 渲染器、Vue 组件和 Vue 的各种API,我们可以利用这个 runtime 实现针对某个具体平台的高阶 runtime,比如自定义渲染器。

  • runtime-dom 目录: 针对浏览器的 runtime。其功能包括处理原生 DOM API、DOM 事件和 DOM 属性等。

  • runtime-test 目录: 一个专门为了测试而写的轻量级 runtime。由于这个 rumtime 「渲染」出的 DOM 树其实是一个 JS 对象,所以这个 runtime 可以用在所有 JS 环境里。你可以用它来测试渲染是否正确。它还可以用于序列化 DOM、触发 DOM 事件,以及记录某次更新中的 DOM 操作。

  • server-renderer 目录: 用于 SSR。尚未实现。

  • compiler-core 目录: 平台无关的编译器. 它既包含可扩展的基础功能,也包含所有平台无关的插件。

  • shared 目录: 没有暴露任何 API,主要包含了一些平台无关的内部帮助方法。

可以看出,新的 Vue 代码仓库是模块化的。接下来我们逐一来看看每个模块暴露的 API。

@vue/runtime-core 模块

大部分 Vue 开发者应该不会用到这个模块,因为它是专门用于自定义 renderer 的。

使用方法示例:

import { createRenderer, createAppAPI } from '@vue/runtime-core'const { render, createApp } = createRenderer({pathcProp,insert,remove,createElement,// ...
})
// `render` 是底层 API
// `createApp` 会产生一个 app 实例,该实例拥有全局的可配置上下文
export { render, createApp }export * from '@vue/runtime-core'

@vue/runtime-dom 模块

这个模块是基于上面模块而写的浏览器上的 runtime,主要功能是适配了浏览器环境下节点和节点属性的增删改查。它暴露了两个重要 API:render 和 createApp,并声明了一个 ComponentPublicInstance 接口。

export { render, createApp }
// re-export everything from core
// h, Component, reactivity API, nextTick, flags & types
export * from '@vue/runtime-core'export interface ComponentPublicInstance {$el: Element
}

@vue/runtime-test 模块

这个模块的主要功能是用对象来表示 DOM 树,方便测试。并且提供了很多有用的 API 方便测试:

export { render, createApp }
// convenience for one-off render validations
export function renderToString(vnode: VNode) {const root = nodeOps.createElement('div')render(vnode, root)return serializeInner(root)
}export * from './triggerEvent'
export * from './serialize'
export * from './nodeOps'
export * from './jestUtils'
export * from '@vue/runtime-core'

@vue/reactivity 模块

这是一个极其重要的模块,它是一个数据响应式系统。其暴露的主要 API 有 ref(数据容器)、reactive(基于 Proxy 实现的响应式数据)、computed(计算数据)、effect(副作用) 等几部分:

export { ref, isRef, toRefs, Ref, UnwrapRef } from './ref'
export {reactive,isReactive,readonly,isReadonly,toRaw,markReadonly,markNonReactive
} from './reactive'
export {computed,ComputedRef,WritableComputedRef,WritableComputedOptions
} from './computed'
export {effect,stop,pauseTracking,resumeTracking,ITERATE_KEY,ReactiveEffect,ReactiveEffectOptions,DebuggerEvent
} from './effect'
export { lock, unlock } from './lock'
export { OperationTypes } from './operations'

很明显,这个模块就是 Composition API 的核心了,其中的 ref 和 reactive 应该重点掌握。

@vue/compiler-core 模块

这个编译器的暴露了 AST 和 baseCompile 相关的 API,它能把一个字符串变成一棵 AST。

export function baseCompile(template: string | RootNode,options: CompilerOptions = {}
): CodegenResult {// 详情略 ...return generate(ast, options)
}export { parse, ParserOptions, TextModes } from './parse'
export { transform /* ... */ } from './transform'
export { generate, CodegenOptions, CodegenContext, CodegenResult} from './codegen'
export { ErrorCodes, CompilerError, createCompilerError } from './errors'
export * from './ast'

@vue/compiler-dom 模块

这个模块则基于上个模块,针对浏览器做了适配,如对 textarea 和 style 标签做了特殊处理。

@vue/server-renderer 模块

目前这个模块没有实现任何功能。

vue 模块

这个模块就是简单的引入了 runtime 和 compiler:

import { compile, CompilerOptions } from '@vue/compiler-dom'
import { registerRuntimeCompiler, RenderFunction } from '@vue/runtime-dom'function compileToFunction(template: string,options?: CompilerOptions
): RenderFunction {const { code } = compile(template, {hoistStatic: true,...options})return new Function(code)() as RenderFunction
}registerRuntimeCompiler(compileToFunction)export { compileToFunction as compile }
export * from '@vue/runtime-dom'

阅读建议

我兴奋地立刻把 Vue 3 源代码扫了一遍,发现其 TypeScript 代码结构清晰,非常好读,于是我写了一篇《Vue 3 源码导读》,点击下方的「阅读原文」即可查看全文。我没有直接把文章内容复制过来,是因为微信后台的编辑器实在太垃圾啦 :)

强烈推荐大家用国庆假期这段时间把 Vue 3 的源码通看一遍,因为目前的代码结构清晰,而且代码量相对较少。

下载代码后,使用 yarn dev 命令就可以对其进行调试。

关于阅读顺序,我的建议是

  1. 先读 reactivity,能最快了解 Vue 3 的新特性;

  2. 再读 rumtime,理解组件和生命周期的实现;

  3. 如果还有时间再读 compiler,理解编译优化过程。

另外如果你想省时间,可以直接看所有 __tests__ 目录里的测试用例来了解 Vue 3 的所有功能。目前有不到 700 个测试用例。

--------  END  ---------

Vue 3.0终于来了!官方凌晨开源代码,导读一波相关推荐

  1. 扶我起来,Vue 3.0终于来了!

    十一各大旅游景点热闹非凡,我们的IT界也同样迎来了爆炸热点.没错,雨溪大神来了,他带着Vue 3.0 源码来了.(ps: 源码地址: https://github.com/vuejs/vue-next ...

  2. 【论文学习】轻量级网络——MobileNetV3终于来了(含开源代码)

    论文名称:<Searching for MobileNetV3> 感谢github上大佬们开源,开源代码整理如下: (1)PyTorch实现1:https://github.com/xia ...

  3. vue 1.0和vue 2.0的变化和区别

    一.在每个组件模板,不在支持片段代码 vue 1.0是 <template><h3>我是组件</h3><strong>我是加粗标签</strong ...

  4. vue 生成发布包_Vue 3.0 终于正正正正正式发布了!

    Vue 团队于 2020 年 9 月 18 日晚 11 点半发布了 Vue 3.0 版本,我们连夜对 Release 进行了翻译.由于时间仓促,文中如有翻译不当的地方还望提出.如有侵权,请联系删帖.以 ...

  5. Element 官方宣布了:Element UI for Vue 3.0 来了!

    Element Plus for Vue 3.0 来了,这次真的来了! Element 开发团队宣布正式发布 Element Plus 的首个 beta 版本,Element Plus 是 Eleme ...

  6. 耗时近一个月,终于录完了VUE.JS2.0前端视频教程!

    这次课录制的比较辛苦,圣诞节时原本已经快录制完成了,偶然的一次,播放了一下,感觉不满意,好几篇推倒重来,所以今天才结束. vue.js2.0是Vue.JS的最新版本,视频教程还不多,如果你看到了,学到 ...

  7. vue 3.0 正式版_Vuejs 3 Release:One Piece. Vuejs 3.0 正式版发布!代号:海贼王

    Vuejs 3.0 在北京时间2020年9月19日凌晨,终于发布了 3.0 版本,代号:One Piece.此次vue3.0 为用户提供了全新的 composition-api 以及更小的包大小,和更 ...

  8. Vue 3.0 新特性及使用方法

    介绍 2020年9月19日凌晨,尤雨溪大大正式发布了 Vue.js 3.0 版本,代号:One Piece.此框架新的主要版本提供了更好的性能.更小的捆绑包体积.更好的 TypeScript 集成.用 ...

  9. Vue 3.0 公开后的撕逼大战……

    阅读本文需要 2.7分钟 前言 在2019年10月5日,尤大大终于公开了 Vue 3.0 的源代码. vue 3.0 源代码仓库 https://github.com/vuejs/vue-next 想 ...

最新文章

  1. BZOJ-3473 (广义后缀自动机:拓扑 or 启发式合并)
  2. [BUUCTF-pwn]——ciscn_2019_c_1
  3. 什么是跨域?跨域如何解决
  4. linux vlc 串流_linux下VLC的安装
  5. 自己定义字体之BMFont的使用
  6. deepin 安装cuda 编译 ffmpeg
  7. 职责链模式 Chain of Responsibility
  8. Altium Designer使用-----LOGO脚本的使用
  9. MarkDown的用法
  10. Solidity ERC777标准
  11. 详解交换机端口级联连接方式
  12. 【KEIL5报错问题】
  13. 【python】7-4 p019车牌限号
  14. 远程连接android手机(调试)
  15. 无线路由频繁掉线9大原因分析
  16. Appium用xpath定位掌阅APP导航页的跳过按钮(只有class和index)
  17. 将 EGL 代码与 DXGI 和 Direct3D 进行比较
  18. win cmd 打开D盘
  19. 实训期间的开发过程及心得体会
  20. pythonpdf教程_python基础教程pdf

热门文章

  1. vue中echarts纵轴添加点击事件
  2. 洛谷:P6560 [SBCOI2020] 时光的流逝(博弈、拓扑序列)
  3. 扫雷用递归实现拓展空白详解
  4. 攻防世界-MISC新手区
  5. Centos文件清理
  6. 2018南京大学夏令营机试第一题
  7. java俄罗斯方块英文书籍_Java版俄罗斯方块
  8. Pyecharts一文速学-绘制桑基图详解+Python代码
  9. 【转】什么是公网安备
  10. 数据分析从零到精通第三课 python自动化和BI数据可视化实战