玩转 Vue 3 全家桶
大圣
前百度前端架构师
38321 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 44 讲
玩转 Vue 3 全家桶
15
15
1.0x
00:00/00:00
登录|注册

32|编译原理(上):手写一个迷你Vue 3 Compiler的入门原理

生成render函数代码
标记动态节点
语义分析和优化
构建AST
生成token数组
词法分析
generate模块
静态标记
语义分析
transform模块
生成抽象语法树(AST)
runtime
reactivity
实战中编译优化的应用
Vue的compiler核心逻辑
Vue项目开发中的应用
编译优化思想
hoisted变量的作用
运行时状态控制
编译期间标记
静态标记
generate函数
transform函数
parse函数
tokenizer
代码生成
优化
解析
迷你版本实现
核心模块依赖关系图
将template转换为render函数
实现代码转换和优化
计算机学科的重要分支
下一步学习
实战应用
思考题
优化方法
实现步骤
编译流程
Vue 3 Compiler
编译原理
Vue 3 Compiler 原理

该思维导图由 AI 生成,仅供参考

你好,我是大圣。
前面我们用了四讲,学习了 Vue 在浏览器中是如何执行的,你可以参考上一讲结尾的 Vue 执行全景图来回顾一下。在 Vue 中,组件都是以虚拟 DOM 的形式存在,加载完毕之后注册 effect 函数。这样组件内部的数据变化之后,用 Vue 的响应式机制做到了通知组件更新,内部则使用 patch 函数实现了虚拟 DOM 的更新,中间我们也学习了位运算、最长递增子序列等算法。
这时候你肯定还有一个疑问,那就是虚拟 DOM 是从哪来的?我们明明写的是 template 和 JSX,这也是吃透 Vue 源码最后一个难点:Vue 中的 Compiler。
下图就是 Vue 核心模块依赖关系图,reactivity 和 runtime 我们已经剖析完毕,迷你版本的代码你可以在GitHub中看到。今天开始我将用三讲的内容,给你详细讲解一下 Vue 在编译的过程中做了什么。
编译原理也属于计算机中的一个重要学科,Vue 的 compiler 是在 Vue 场景下的实现,目的就是实现 template 到 render 函数的转变。
我们第一步需要先掌握编译原理的基本概念。Vue 官方提供了模板编译的在线演示。下图左侧代码是我们写的 template,右侧代码就是 compiler 模块解成的 render 函数,我们今天的任务就是能够实现一个迷你的 compiler。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了如何手写一个迷你Vue 3 Compiler的入门原理。文章首先介绍了Vue中组件以虚拟DOM形式存在,并注册effect函数,实现了响应式机制和虚拟DOM的更新。然后详细讲解了Vue中的Compiler的实现原理,包括编译原理的基本概念和整体流程。接着,文章展示了如何实现词法分析,将模板中的语法识别成token,并将token数组转换成抽象语法树AST。最后,文章给出了实现抽象语法树AST的代码示例。通过这些内容,读者可以了解到编译原理的基本概念,以及如何手写一个迷你的compiler,从而加深对Vue编译过程的理解。文章还提到了编译时的优化方法,通过在编译期间的标记方式,让虚拟DOM在运行时有更多的状态,从而能够精确地控制更新。这种编译时的优化也能够对项目开发有很多指引作用。整体来说,本文为读者提供了一个深入了解Vue编译原理的入门指南,同时也为读者展示了如何通过迷你版本的实现来熟悉整个Vue compiler工作的主体流程。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《玩转 Vue 3 全家桶》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(6)

  • 最新
  • 精选
  • 神瘦
    “tokenizer 的迷你实现”这个地方“把模板中的”这几个字后面一大段空白呢,你们那边能看到吗?检查下呢

    编辑回复: 收到,已经更新啦,谢谢反馈

    2022-01-30
  • openbilibili
    template中的p标签 不能有空格 不然解析不了

    作者回复: 我们这个毕竟是迷你的版本,考虑的情况比较少,基本只考虑了最核心的解析路径,边缘case不断完善的时候,框架也会越来越清晰,这里可以参考vue-compiler-core的实现

    2022-01-06
  • 斜月浮云
    hoisted开头的变量用于静态节点提升,说白了就是在整个生命周期中只需要进行一次创建,有效节省不必要的性能开销。 话说最后的generate代码明显不对啊,createVnode的后括号阔歪了哦~🙂

    作者回复: cool 我检查一下

    2022-01-03
    2
  • 陈坚泓
    const [key, val] = token.val.replace('=','~').split('~') 是不是可以写成 const [key, val] = token.val.split('=') 备注里 // trnsformText 估计是拼错了
    2022-05-20
  • Blueberry
    template语法需要经过这么一系列的编译,那h函数呢,是经过什么变成了最后的render语法?
    2022-04-12
  • 名字好长的大林
    PatchFlags 这个变量没有给??
    2022-02-04
    1
收起评论
显示
设置
留言
6
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部