news 2026/4/23 9:48:01

43-mini-vue 实现代码生成 string 类型

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
43-mini-vue 实现代码生成 string 类型

实现代码生成 string 类型

  1. 整体转换流程,本节考虑的是 generate 将 ast 转换为 function render 函数

  2. 展示生成 render 函数的样子

https://template-explorer.vuejs.org/#eyJzcmMiOiI8ZGl2PkhlbGxvIFdvcmxkPC9kaXY+Iiwib3B0aW9ucyI6e319
  1. 单测
// compiler-core/src/tests/codegen.spec.tsimport{generate}from'../src/codegen'import{baseParse}from'../src/parse'describe("codegen",()=>{it("string",()=>{constast=baseParse('hi')const{code}=generate(ast)// 快照测试 把我们的代码拍了张照片// 1. 抓 bug// 2. 更新快照expect(code).toMatchSnapshot()})})
  1. 先简单跑通
// compiler-core/src/codegen.tsexportfunctiongenerate(ast){return{code:`return function render(_ctx, _cache, $props, $setup, $data, $options) { return "hi" }`}}
  1. 我们稍作修改对快照功能进行熟悉
// codegen.spec.tsexportfunctiongenerate(ast){return{code:`return function render(_ctx, _cache, $props, $setup, $data, $options) { return "hi 1" // ✅ 这里多了1 }`}}
  • 可以看到,修改完毕以后,这里会报错
1snapshot failed.Snapshot Summary ›1snapshot failed from1test suite.Inspect your code changes or press`u`to update them.
  • 我们使用命令进行主动修改: pnpm test codegen.spec.ts -t ‘codegen string’ -u, 执行完毕以后,发现测试通过了,
    在生成的 __snapshots__里面的文件已经主动进行了修改
  1. tips: jest 是给 react 创建的一个测试的概念,为了让开发人员更容易得去写测试,等于我们这里不用手动更新 codegen.spec.ts , -u 替我们在快照层面进行了相关操作
  2. 后续实现思路,
  • render后续可能更改可以提出去,
  • 参数可以提出去,
  • 返回参数可以提出去
returnfunctionrender(_ctx,_cache,$props,$setup,$data,$options){return"hi 1"// ✅ 这里多了1}
  1. 简单的先实现一版
exportfunctiongenerate(ast){// ✅️letcode=""code+="return "constfunctionName="render"constargs=["_ctx","_cache"]constsignature=args.join(",")code+=`function${functionName}(${signature}){`code+="return hi 1"code+="}"return{code}}
  1. 将返回值使用模板字符串进行动态展示
exportfunctiongenerate(ast){letcode=""code+="return "constfunctionName="render"constargs=["_ctx","_cache"]constsignature=args.join(",")code+=`function${functionName}(${signature}){`// code += "return 'hi 1'"constnode=ast.children[0]// ✅️code+=`return '${node.content}'`// ✅️code+="}"return{code}}
  1. 我们检查代码, 发现这里的 node 的获取并不灵活,有一些场景没有考虑到
  • 我们现在取得是 children[0] ,但实际情况我们并不知道这个入口是在哪个下标,此时 children 有多个, 所以这块逻辑需要放在 transform.ts 文件里面
exportfunctiongenerate(ast){letcode=""code+="return "constfunctionName="render"constargs=["_ctx","_cache"]constsignature=args.join(",")code+=`function${functionName}(${signature}){`constnode=ast.children[0]// 💡code+=`return '${node.content}'`code+="}"return{code}}
  1. 标记入口进行优化
// transform.ts// 标识入口 nodeexportfunctiontransform(root,options={}){constcontext=createTransformContext(root,options)traverseNode(root,context)// 这里处理 返回参数逻辑createRootCodegen(root)// ✅️}functioncreateRootCodegen(root:any){// ✅️root.codegenNode=root.children[0]}
// transform.spec.ts// 调用transform 函数✅入口 node 进行标识describe("codegen",()=>{it("string",()=>{constast=baseParse('hi')transform(ast)// ✅const{code}=generate(ast)expect(code).toMatchSnapshot()})})
  1. 获取 node 代码抽离
exportfunctiongenerate(ast){letcode=""code+="return "constfunctionName="render"constargs=["_ctx","_cache"]constsignature=args.join(",")code+=`function${functionName}(${signature}){`code=getNode(ast,code)// ✅code+="}"return{code}}functiongetNode(ast:any,code:string){// ✅constnode=ast.codegenNode code+=`return '${node.content}'`returncode}
  1. 对上下文进行抽离封装
exportfunctiongenerate(ast){constcontext=createCodegenContext()// ✅const{push}=context// ✅constfunctionName="render"constargs=["_ctx","_cache"]constsignature=args.join(",")push("return ")// ✅push(`function${functionName}(${signature}){`)// ✅getNode(ast.codegenNode,context)// ✅push("}")// ✅return{code:context.code// ✅}}functioncreateCodegenContext(){// ✅constcontext={code:"",push(source){context.code+=source}}returncontext}functiongetNode(node:any,context){const{push}=contextpush(`return '${node.content}'`)}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 11:03:14

Chord视频时空理解工具Telnet调试:远程服务管理技巧

Chord视频时空理解工具Telnet调试:远程服务管理技巧 1. 为什么需要Telnet来管理Chord服务 在日常运维工作中,Chord视频时空理解工具通常部署在远程服务器上,作为后台服务持续运行。当需要快速检查服务状态、验证端口连通性或执行简单诊断时…

作者头像 李华
网站建设 2026/4/23 12:11:55

3步攻克前端文档预览难题:Vue-Office实现浏览器端PPT渲染方案

3步攻克前端文档预览难题:Vue-Office实现浏览器端PPT渲染方案 【免费下载链接】vue-office 项目地址: https://gitcode.com/gh_mirrors/vu/vue-office 前端文档预览一直是企业级应用开发中的常见需求,尤其在在线协作、教育平台和内容管理系统中更…

作者头像 李华
网站建设 2026/4/23 10:50:09

STM32 EXTI按键中断实战:从硬件连接到ISR编写

1. EXTI 按钮中断实验:从硬件连接到中断服务函数的完整工程实现 在嵌入式系统开发中,外部中断(External Interrupt, EXTI)是响应物理世界事件最基础、最高效的机制之一。它绕过轮询带来的 CPU 资源浪费与响应延迟,使 MCU 能在毫秒甚至微秒级时间内对按键、传感器触发、通…

作者头像 李华
网站建设 2026/4/23 12:10:30

STM32中断机制详解:从硬件触发到RTOS事件驱动

1. 中断的本质:嵌入式系统应对异步事件的核心机制 中断不是一种“高级技巧”,而是嵌入式系统得以在资源受限条件下可靠运行的底层基石。它解决的根本问题是: 如何让一个单线程、顺序执行的处理器,能够及时响应外部世界不可预测的、时间敏感的事件 。这与人类处理突发事件…

作者头像 李华
网站建设 2026/4/23 10:49:10

STM32 ADC结构深度解析:SAR原理、双序列机制与寄存器配置

1. ADC模块结构解析:从逐次逼近原理到寄存器级实现 在嵌入式系统开发中,模数转换器(ADC)是连接模拟世界与数字世界的桥梁。STM32系列MCU集成的ADC模块并非简单的“黑箱”,其内部结构设计深刻反映了采样-保持、时序控制与多任务调度等核心工程思想。理解其结构框图,是编写…

作者头像 李华