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

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}'`)}
http://www.jsqmd.com/news/351815/

相关文章:

  • FreeRTOS智能小车功能验证全流程与工程实践
  • ccmusic-database镜像免配置实战:NVIDIA Container Toolkit加速推理部署
  • 3大场景解锁RePKG:Wallpaper Engine资源处理利器全攻略
  • FreeRTOS heap_4内存管理机制深度解析
  • 嵌入式MCU视频播放器:AVI+MJPEG+PCM在STM32上的实现
  • OV2640图像采集:BMP无损与JPEG有损压缩原理及STM32实现
  • 重构硬件控制逻辑:轻量化工具如何重新定义笔记本使用体验
  • CANN Runtime动态设备热插拔技术内核剖析
  • 笔记本电脑显示异常修复技术指南:从诊断到优化的完整解决方案
  • 突破NCM格式限制:3种高效转换方案让音乐自由流转
  • RMBG-2.0与VSCode开发:高效Python编程环境搭建
  • Qwen3-VL-4B Pro效果对比:4B vs 2B模型在图文问答精度与细节理解差异
  • 解锁显卡隐藏性能:NVIDIA Profile Inspector图形优化完全指南
  • STM32F4硬件FPU原理、配置与RTOS实战指南
  • Qwen3-ASR-0.6B与Vue3前端集成:实时语音交互界面开发
  • RK1126 SDK编译实战:从环境配置到模块化编译指南
  • 还在忍受龟速下载?3个技术方案让你带宽跑满:文件下载加速工具全解析
  • 突破NCM格式限制:让音乐自由掌控的无损转换全指南
  • STM32F407+WM8978嵌入式WAV播放器设计与实现
  • XUnity.AutoTranslator:Unity游戏实时翻译工具完全配置指南
  • 3分钟搞定GitHub界面本地化:这款浏览器插件让操作效率提升50%
  • 插图指南
  • R低代码配置效能跃迁(2024最新实践白皮书):实测配置效率提升63%,仅限前500名开发者获取
  • AnimateDiff文生视频效果评测:与SVD对比——无底图生成的流畅度与画质优势
  • 跨平台Android控制工具完全指南:3步提升设备管理效率
  • STM32F407+WM8978 I2S录音系统设计与WAV实时生成
  • 3个秘诀彻底解决百度网盘限速难题:让你下载速度提升10倍的终极指南
  • ARM Cortex-M系列深度剖析:中断系统与NVIC机制
  • ST MCSDK FOC串口通信协议深度解析
  • 2026年网络推广方案厂家推荐:企业信息推广/企业做推广/企业做推广代运营/企业推广平台/企业推广方法/企业网络推广/选择指南 - 优质品牌商家