vue.3.0 dom赋值_Vue3.0 解读

本文介绍了Vue 3.0的源码结构,强调了其对TypeScript的广泛使用,98%以上代码为TypeScript编写,且未使用class关键字。Vue 3处于Pre-Alpha阶段,预计2020年一季度发布正式版。文章详细解析了@vue/runtime-core、@vue/runtime-dom等模块,推荐开发者阅读源码并了解其模块化设计。
摘要由CSDN通过智能技术生成

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

兼容性

目前打包后的代码是 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 目录: 平台无关的编译器. 它既包含可扩展的基础功能,也包含所有平台无关的插件。

  • compiler-dom 目录: 针对浏览器而写的编译器。

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

  • vue 目录: 用于构建「完整构建」版本,引用了上面提到的 runtime 和 compiler。

可以看出,新的 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 & typesexport * from '@vue/runtime-core'export interface ComponentPublicInstance {  $el: Element}

@vue/runtime-test 模块

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

export { render, createApp }// convenience for one-off render validationsexport 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 的源码通看一遍,因为目前的代码结构清晰,而且代码量相对较少。

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

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

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

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

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

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

---END---

选择”Vue社区 “星标?,内容一触即达。点击原文更多惊喜!

开发者技术前线 汇集技术前线快讯和关注行业趋势,大厂干货,是开发者经历和成长的优秀指南。

历史推荐

Vue3.0源码终于正式开放!

提前使用Vue 3.0新特性,vue-function-api尝鲜

JavaScript 之实现一个简单的 Vue

6537520e1a2a8a0afe075a30a7b4565f.png

听说有人不敢点这里 ?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值