模板编译与虚拟 DOM

共 37 题
#

1. Vue 3 编译时优化(v-memo)在列表固定项的工程价值

A v-memo 依赖数组变化时跳过该子树更新
B v-memo 在依赖未变时仍会执行完整 diff
C v-memo 与 v-for 无法同时使用
D v-memo 的依赖数组必须包含子树中全部响应式依赖,否则可能漏更新 ✓ 正确答案
#

2. Vue 3 编译器对 v-on/v-bind 的事件修饰符与 prop 规范化

A .capture 修饰符会被编译进事件处理函数内部
B 所有事件处理器每次都重新创建,无法缓存
C 编译器按绑定类型区分 prop、attr 与事件,并标注 PatchFlag 供 diff 使用 ✓ 正确答案
D v-bind 无法绑定事件监听
#

3. v-once/v-memo 在性能敏感视图的工程取舍

A v-once 与 v-memo 的语义完全相同
B v-memo 在任何情况下都会跳过子树更新
C v-once 渲染后内容不再随数据更新,适合纯静态内容 ✓ 正确答案
D v-once 只能用于组件根节点
#

4. 模板编译缓存(Compiled Template Caching)

A 生产环境应通过构建时预编译模板,避免在浏览器中携带编译器 ✓ 正确答案
B 运行时编译缓存以渲染函数为 key 缓存模板字符串
C SFC 模板默认在浏览器中运行时编译
D 模板编译缓存会随每次渲染失效
#

5. Vapor 与 VDOM 的性能对比应基于目标场景和实测,不预设结论

A Vapor 在任何场景下性能都优于 VDOM
B 性能对比应基于目标场景设计基准并实测多维度指标,不预设结论 ✓ 正确答案
C VDOM 的 diff 成本与更新频率无关
D 只比较单次更新的耗时即可判定框架优劣
#

6. Vue 3 模板编译器在 SSR 阶段与客户端 hydration 的差异如何影响首屏渲染

A SSR 与客户端使用完全相同的编译产物
B hydration 复用服务端 HTML 并绑定事件与响应式,编译器为其提供水合友好产物 ✓ 正确答案
C SSR 阶段同样需要创建完整的虚拟 DOM 树
D 流式渲染只影响服务端,不影响首屏体验
#

7. Vue 3 编译优化的 Open/Close 块(<template v-if> 块的 block tree 收集)的边界

A v-if 的多个分支共享同一个 dynamicChildren 数组
B 每个块只收集直接子节点的动态变化,深层动态节点不在收集范围
C 更新时 Vue 直接遍历块的 dynamicChildren,无需递归整棵虚拟树 ✓ 正确答案
D 块机制只在开发模式下生效
#

8. Vue 3 的 defineModel 与 defineProps/defineEmits 编译产物中静态属性的现代取舍

A defineModel 与 defineProps 无法在同一组件中混用
B 静态属性也会进入 diff 的 props 更新路径
C defineModel 编译为 modelValue prop 与 update:modelValue emit,与显式声明合并 ✓ 正确答案
D 命名模型不产生任何编译产物
#

9. Vue 3 虚拟 DOM 的 shapeFlag 与位运算在高效更新的工程价值

A 位运算只能用于组件类型,无法用于元素
B shapeFlag 使用字符串描述节点类型
C PatchFlag 描述的是节点在 DOM 中的坐标
D shapeFlag 用位标志编码 VNode 类型,运行时以位与快速分派处理 ✓ 正确答案
#

10. Vue 3 模板编译输出,Block Tree、PatchFlag、静态节点提升与缓存的工程价值

A 事件缓存会让事件处理器无法响应最新状态
B 静态提升的节点每次渲染都会重新创建
C 静态提升复用 VNode、PatchFlag 精准 diff、Block Tree 扁平化收集动态节点,共同降低更新成本 ✓ 正确答案
D 这四类优化需要开发者手动开启
#

11. Vue 3 的 hydration 优化(编译器输出提示,避免 mismatch)

A 水合时客户端会完全重建服务端渲染的 DOM
B hydration 要求服务端输出与客户端首次渲染一致,随机值与浏览器差异是常见 mismatch 来源 ✓ 正确答案
C mismatch 警告只出现在生产环境
D v-html 内容不受水合一致性约束
#

12. Vue 模板编译(parse → optimize → generate)

A generate 阶段负责把模板字符串直接写入 DOM
B parse 生成 AST,optimize 做静态分析与优化,generate 输出渲染函数代码 ✓ 正确答案
C Vue 3 的优化都是硬编码在编译器中的,无法扩展
D parse 阶段直接生成可执行的渲染函数
#

13. Vapor 与 Svelte 5 Runes 的编译时响应式对比

A Svelte 5 用 runes 显式声明响应式,Vapor 保留 Vue 响应式 API 但免虚拟 DOM ✓ 正确答案
B Vapor 与 Svelte Runes 使用完全相同的响应式实现
C Svelte 5 仍然依赖虚拟 DOM 完成更新
D Vapor 要求开发者改用 runes 语法编写代码
#

14. Vue 的 cloneVNode 与 mergeProps 在组件复用的工程价值

A cloneVNode 会深度克隆整个 VNode 树
B mergeProps 会智能合并 class/style 并把同名事件合并为数组依次调用 ✓ 正确答案
C cloneVNode 无法配合 h() 渲染函数使用
D mergeProps 与对象展开的合并语义完全相同
#

15. 模板静态提升(Static Hoisting)与预字符串化(Pre-stringification)

A 静态节点也会进入 dynamicChildren 收集
B 静态提升的节点每次渲染都会重新创建
C 预字符串化把连续静态节点合并为单个静态字符串节点一次性渲染 ✓ 正确答案
D 预字符串化只在开发模式下生效
#

16. Vapor Mode(无虚拟 DOM 编译器,Vue 3.6 起 opt-in 可用、仍处实验/beta 阶段、不支持 Options API)

A Vapor 组件必须整应用启用,无法与普通组件混用
B Vapor Mode 已完全替代传统虚拟 DOM 模式
C Vapor Mode 免虚拟 DOM 直接生成细粒度更新指令,目前仍为实验性且不支持 Options API ✓ 正确答案
D Vapor 使用全新的模板语法
#

17. Shadow Root composedPath() 与 SSR/水合过程的边界

A composedPath() 可穿透 Shadow DOM 返回事件的完整传播路径,便于定位真实目标 ✓ 正确答案
B composedPath() 只能返回 Shadow DOM 内部的节点
C SSR 阶段服务端会生成 Shadow DOM 结构
D composed 标志为 false 的事件可以穿透 Shadow 边界
#

18. Vue 3.5+ 的响应式系统重构与基于 Proxy 的 ref/reactive 在模板自动解包的工程价值

A reactive 对象在模板中无法直接访问属性
B 模板中所有嵌套的 ref 都自动解包,无论层级
C 响应式重构后模板中必须显式调用 .value
D 模板中顶层 ref 自动解包,无需写 .value;重构让该机制更新更高效 ✓ 正确答案
#

19. Vue 模板中 @click 与 :click 的事件修饰符在编译后是否会产生闭包内存泄漏

A 内联事件处理器被 cacheHandlers 缓存复用,且监听随 DOM 移除而回收,本身不产生泄漏 ✓ 正确答案
B 模板事件绑定必然造成闭包内存泄漏
C 事件处理器每次渲染重建是泄漏的根本原因
D 卸载组件时浏览器会自动移除所有事件监听,无需手动清理
#

20. Vue 3 的 Functional Component 与 Inline Component 在编译器优化路径的差异

A 函数式组件无法接收 props
B 函数式组件拥有完整的生命周期钩子
C 内联组件的定义对象被编译器缓存,不会重建
D 函数式组件无实例、开销低;内联组件若每次渲染创建新对象会导致反复卸载重建 ✓ 正确答案
#

21. Vue 3 的 Suspense 与 Async Component 在模板中如何被编译成动态导入块的工程价值

A defineAsyncComponent 只能在路由配置中使用
B 异步组件加载期间必然白屏,无法显示加载态
C defineAsyncComponent 的 loader 会被构建工具拆分为独立 chunk,配合 Suspense 实现按需加载与统一加载态 ✓ 正确答案
D 动态 import 的组件不会生成独立 chunk
#

22. Vue 3 的 v-pre/v-once/v-memo 与 Nuxt SSR 静态分析的协作

A v-once 的内容在客户端会随数据持续更新
B v-pre 的内容也会被编译器优化与转换
C v-memo 在 SSR 阶段同样执行依赖比较与跳过
D v-pre 跳过编译原样输出,v-once 只渲染一次,v-memo 依赖不变时跳过更新 ✓ 正确答案
#

23. Vue 3 编译器如何处理 v-for 列表的 key 缺失以避免 DOM 复用错位

A 用数组 index 作为 key 是最高效且正确的做法
B key 只影响动画,不影响组件状态
C 列表缺 key 时按索引就地复用,顺序变化会导致状态错位,应使用唯一稳定字段作 key ✓ 正确答案
D 编译器会自动为 v-for 生成随机 key
#

24. Vue 3 的 Teleport 在模板编译阶段与虚拟 DOM 树挂载点的边界

A Teleport 在编译期直接内联目标 DOM 内容
B Teleport 会把子树的 provide/inject 也传送到目标容器
C Teleport 内容无法参与父组件的更新收集
D Teleport 子树的逻辑上下文保留在组件树,真实 DOM 渲染到目标容器,二者位置分离 ✓ 正确答案
#

25. Vue 3 与 Vue 2 的 VNode 数据结构差异(flag、shapeFlag、transition、dynamicChildren)

A dynamicChildren 是 Vue 2 的优化字段
B Vue 3 的 VNode 结构与 Vue 2 完全一致,仅换名
C Vue 3 的 VNode 携带 shapeFlag、patchFlag、dynamicChildren 等编译优化元数据,更新直达动态节点 ✓ 正确答案
D patchFlag 描述节点的 CSS 样式
#

26. Vue 3 模板编译器的 cacheHandlers 选项对内联事件处理器缓存与 v-once 的现代取舍

A v-once 与 cacheHandlers 的作用完全相同
B cacheHandlers 会导致事件处理器永远无法获取最新状态
C cacheHandlers 默认缓存内联事件处理器,v-once 则把整个子树静态化,二者粒度不同 ✓ 正确答案
D cacheHandlers 需要开发者手动配置才能生效
#

27. Vue 3 SFC 的 <script setup> 编译产物中 defineProps 解构的工程价值

A 解构 props 只能在模板中使用,脚本中无效
B 解构后的 props 变量可以被重新赋值以修改父组件状态
C <script setup> 中 defineProps 解构被编译为响应式引用,props 更新时同步变化 ✓ 正确答案
D 解构会破坏所有 props 的类型推导
#

28. Vue 3 的 v-bind="props" 一次性属性继承与 React <Component {...props}> 的编译差异

A React 的 {...props} 会自动合并 class 与事件处理器
B Vue 的 v-bind="props" 经编译与响应式追踪,class/事件自动合并;React 展开是创建时求值合并 ✓ 正确答案
C Vue 的 v-bind 对象不支持响应式属性更新
D 两者对 props 展开的处理机制完全相同
#

29. Vue 3 在 SSR 渲染中如何避免响应式对象泄漏到客户端 hydration 的 Vue 编译器机制

A 编译器无法区分 SSR 与客户端渲染路径
B 服务端的响应式代理会被直接序列化进 HTML
C 水合时客户端会复用服务端的组件实例
D SSR 与客户端使用不同的渲染路径,响应式实例不跨环境,仅序列化后的数据进入 payload ✓ 正确答案
#

30. Vue 3 的 v-show/v-if 在编译产物与运行时 DOM 操作的边界

A v-if 切换时创建/销毁节点与实例,v-show 仅切换 display 且保留 DOM 与状态 ✓ 正确答案
B v-show 与 v-if 的编译产物完全相同
C v-if 的内容即使不展示也渲染进 DOM
D v-show 频繁切换的成本高于 v-if
#

31. Vue 3 与 Lit 的模板对比——Lit 的 lit-html 标签模板与 Vue 编译模板的现代工程取舍

A lit-html 会构建完整的虚拟 DOM 树进行 diff
B lit-html 以标签模板按表达式槽位增量更新 DOM,Vue 以编译优化与自动响应式派发更新 ✓ 正确答案
C Vue 模板无法脱离编译器运行
D lit-html 与 Vue 的响应式模型完全相同
#

32. 要比较 Vue 3.6 Vapor Mode 与传统 VDOM 在十万行可编辑表格中的生产表现,你会如何设计包含首屏、局部更新、滚动和长时间驻留的基准,并采集 retained heap、GC 暂停、FPS、INP 与更新吞吐量

A retained heap 只在首屏阶段有意义
B 性能对比只需采集单次更新的耗时即可
C 基准应按首屏、局部更新、滚动、长期驻留分组,并分别采集吞吐量、INP、FPS、retained heap 等指标 ✓ 正确答案
D FPS 与 GC 暂停只影响开发环境
#

33. 一个 Vapor 父组件必须嵌入仍使用 Options API 的遗留组件时,编译边界应放在哪里

A 混合模式下遗留组件会自动升级为 Vapor 编译
B Vapor 父组件中完全无法渲染 Options API 组件
C 编译边界放在边界组件处,Vapor 与遗留组件通过 props/事件/插槽桥接并共存 ✓ 正确答案
D 边界组件处需要手动复制两份模板实现
#

34. Vapor 页面遇到 Transition、TransitionGroup 或依赖 VNode 钩子的动画能力尚未支持或行为不一致时,如何隔离为 VDOM 岛并避免切换过程中 DOM 身份、焦点和动画状态丢失

A 切换条件变化时岛内 DOM 必须重建以刷新动画
B VDOM 岛必须包含整个页面才能工作
C 把依赖 VNode 动画能力的区域封装为 VDOM 岛,并保证边界组件身份稳定避免重建 ✓ 正确答案
D VDOM 岛无法保留输入焦点
#

35. 第三方 Vue 组件库会检查 VNode、克隆 slot 节点并调用运行时渲染 API,而业务页面准备启用 Vapor;你会如何识别不兼容组件、设置适配层,并阻止不兼容依赖进入 Vapor 编译范围

A 启用 Vapor 后所有第三方组件自动兼容
B 通过依赖分析识别 VNode 依赖组件,用编译范围配置与 VDOM 岛隔离,并配合灰度与回滚 ✓ 正确答案
C 不兼容组件可以通过补丁直接改造为 Vapor 原生
D Vapor 编译范围无法按组件粒度控制
#

36. 如何设计 opt-in、灰度指标、产物双轨与一键回滚,而不要求一次性重写整个组件树

A 灰度只观测功能是否正常,无需性能指标
B 启用 Vapor 必须一次性重写全部组件
C 组件级 opt-in 渐进启用、双轨产物共存、灰度指标决策、配置开关一键回滚 ✓ 正确答案
D 回滚需要重新发布整个应用且影响用户数据
#

37. 混合 Vapor/VDOM 组件树在 KeepAlive、Teleport 和异步组件切换时,如何验证组件实例身份、响应式订阅清理及 DOM 所有权,避免重复挂载或 retained heap 持续增长

A retained heap 增长与应用生命周期无关
B KeepAlive 在混合树下会自动重建实例,无需验证
C Teleport 卸载后内容会留在目标容器以加速复用
D 通过实例引用与钩子日志验证身份复用,内存快照验证订阅清理与 DOM 归属,观察 retained heap 曲线 ✓ 正确答案