news 2026/4/18 3:44:38

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/17 11:48:42

XUnity.AutoTranslator:Unity游戏实时翻译工具完全配置指南

XUnity.AutoTranslator:Unity游戏实时翻译工具完全配置指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 你是否曾在游玩国外独立游戏时,因语言障碍错过了精彩剧情?是…

作者头像 李华
网站建设 2026/4/18 3:43:22

STM32高级定时器PWM参数硬件测量原理

1. PWM参数测量的技术本质与工程需求 在嵌入式系统中,PWM(Pulse Width Modulation)信号的周期与占空比是两个基础但关键的时序参数。周期决定了信号的频率特性,而占空比直接映射为模拟电压值或功率输出比例。传统上,工程师常采用输入捕获(Input Capture)配合软件计算的…

作者头像 李华
网站建设 2026/4/17 1:47:29

轻松获取百度网盘资源:智能提取码工具使用指南

轻松获取百度网盘资源:智能提取码工具使用指南 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾遇到过这样的情况:找到一个急需的学习资料或工作文件,却被百度网盘的提取码挡在门外&…

作者头像 李华
网站建设 2026/4/18 0:12:24

STM32定时器触发ADC实现高精度等间隔采样

1. 定时器触发ADC的工程原理与实现逻辑 在嵌入式数据采集系统中,如何实现高精度、等间隔、低CPU开销的模拟量采样,是工程师必须面对的核心问题。软件轮询启动ADC虽简单,但存在采样间隔不可控、CPU资源占用高、易受中断干扰等固有缺陷;而中断方式虽能降低CPU负载,却难以保…

作者头像 李华
网站建设 2026/4/13 21:34:25

演唱会门票抢票神器:DamaiHelper让你告别抢票焦虑

演唱会门票抢票神器:DamaiHelper让你告别抢票焦虑 【免费下载链接】DamaiHelper 大麦网演唱会演出抢票脚本。 项目地址: https://gitcode.com/gh_mirrors/dama/DamaiHelper 还在为演唱会门票秒空而抓狂?手动抢票总是慢人一步?DamaiHel…

作者头像 李华
网站建设 2026/4/3 5:10:42

Windows任务栏透明化完全指南:从基础设置到高级视觉增强

Windows任务栏透明化完全指南:从基础设置到高级视觉增强 【免费下载链接】TranslucentTB 项目地址: https://gitcode.com/gh_mirrors/tra/TranslucentTB 任务栏透明化是Windows系统个性化设置中提升桌面视觉体验的关键环节。通过TranslucentTB工具实现的任务…

作者头像 李华