当前位置: 首页 > news >正文

vue将组件中template转为js

在 Vue 中,组件的 template 需要被转换为 JavaScript 渲染函数(Render Function)才能在浏览器中运行。Vue 2 和 Vue 3 的转换机制有所不同,主要体现在编译时机、编译工具和输出结果上。

1. Vue 2 的 Template 转换

转换方式

Vue 2 使用 vue-template-compiler 在构建时(通常是 Webpack 的 vue-loader)将 .vue 文件中的 <template> 编译为渲染函数。

步骤
  1. 开发阶段

    • 通过 vue-loader 处理 .vue 文件,提取 <template> 部分。

    • 使用 vue-template-compiler 将模板编译为 render() 函数。

    • 最终生成的代码类似:

render(h) {
  return h('div', { attrs: { id: 'app' } }, 'Hello World');
}

2.运行时

  1. 如果未预编译(如直接使用 template: '<div>Hello</div>' 选项),Vue 2 会在浏览器中动态编译(需要包含完整版 Vue,体积较大)。
关键点
  • 依赖vue-template-compiler(必须与 Vue 2 版本严格匹配)。

  • 输出:渲染函数使用 h(即 createElement)生成虚拟 DOM。

  • 动态编译:完整版 Vue(含编译器)支持运行时编译,但推荐预编译以优化性能。

2. Vue 3 的 Template 转换

转换方式

Vue 3 使用 @vue/compiler-sfc(单文件组件编译器)和 @vue/compiler-dom(模板编译器),编译过程更高效且支持更多优化。

步骤
  1. 开发阶段

    • @vue/compiler-sfc 解析 .vue 文件,分离 <template><script><style>

    • @vue/compiler-dom 将模板编译为 优化后的渲染函数

    • 生成的代码使用 import { createVNode } from 'vue',例如:

import { createVNode as _createVNode } from 'vue';
export function render(_ctx, _cache) {
  return _createVNode('div', { id: 'app' }, 'Hello World');
}

2.运行时

  1. Vue 3 不再支持浏览器内的动态模板编译(即使使用完整版),所有模板必须预编译。
  2. 渲染函数直接使用 createVNode(替代 Vue 2 的 h)。
关键点
  • 依赖@vue/compiler-sfc(Vite 或 Vue CLI 内部集成,无需手动配置)。

  • 输出:渲染函数更高效,支持静态节点提升(Static Hoisting)、补丁标志(Patch Flags)等优化。

  • 体积更小:由于移除了运行时编译器,生产包更精简。

3. Vue 2 和 Vue 3 的主要区别

特性Vue 2Vue 3
编译器工具vue-template-compiler@vue/compiler-sfc
运行时编译支持(需完整版 Vue)不再支持(必须预编译)
渲染函数生成h(createElement)createVNode
优化策略基础虚拟 DOM 优化静态提升、补丁标志等高级优化
体积影响完整版含编译器,体积较大更精简(无运行时编译器)

 

总结

  • Vue 2

    • 依赖 vue-template-compiler,支持运行时编译(但推荐预编译)。

    • 渲染函数使用 h,优化较少。

  • Vue 3

    • 依赖 @vue/compiler-sfc,强制预编译,渲染函数使用 createVNode

    • 编译时优化更多,性能更好,包体积更小。

最佳实践:无论 Vue 2 还是 Vue 3,都应通过构建工具(Webpack/Vite)预编译模板,避免运行时开销。

 

http://www.dtcms.com/a/108287.html

相关文章:

  • codeforces C. Creating Keys for StORages Has Become My Main Skill
  • systemd服务开机启动(code=exited, status=203/EXEC)错误,由于SELinux 开启安全模式
  • AI知识补全(十五):AI可解释性与透明度是什么?
  • 详细说明一下C++中的static关键字
  • 火山引擎coze用户市场
  • 使用PyTorch实现GoogleNet(Inception)并训练Fashion-MNIST
  • 【华为OD技术面试真题 - 技术面】- Java面试题(17)
  • 移动端六大语言速记:第1部分 - 基础语法与控制结构
  • 网络安全协议知识点总结
  • 网络空间安全(49)Python基础语法
  • 三.微服务架构中的精妙设计:服务注册/服务发现-Eureka
  • JavaScript reduce 方法详解
  • 视图函数的应用
  • 数据仓库项目启动与管理
  • App与Page构造器
  • vim的操作
  • Java面试31-MySQL如何解决幻读问题?
  • 【HTB】Linux-Shocker靶机渗透
  • 人工智能基础知识笔记七:随机变量的几种分布
  • Font Awesome 音/视频图标
  • 程序代码篇---Arm汇编语言
  • Laravel 中使用 JWT 作用户登录,身份认证
  • vue开始时间小于等于结束时间,且开始时间小于等于系统时间,时间格式:年月日时分
  • Python每日一题(13)
  • 【算法进阶详解】线段树应用
  • 洛谷题单2-P2433 【深基1-2】小学数学 N 合一-python-流程图重构
  • 脑影像分析软件推荐 | CONN
  • Django接入 免费的 AI 大模型——讯飞星火(2025年4月最新!!!)
  • 安装完 miniconda3 ,cmd无法执行 conda 命令
  • 接口测试(2)