Puerts项目中QuickJS后端模块实现的重构与优化
背景介绍
Puerts是一个将TypeScript/JavaScript与Unity/C++等原生环境桥接的技术框架,它支持多种JavaScript引擎后端。其中QuickJS作为一个轻量级的JavaScript引擎,在Puerts中有着重要应用。近期,Puerts项目团队对QuickJS后端的模块实现进行了重要重构,解决了原有实现中的一些关键问题。
原有实现的问题
在重构前的实现中,QuickJS后端的模块系统存在几个显著问题:
-
API混用问题:代码中同时混用了模拟V8 API和原生QuickJS API,这种混合使用方式不仅增加了代码复杂度,也使得维护变得困难。更严重的是,部分QuickJS API的使用方式存在理解偏差,可能导致潜在问题。
-
异常处理缺陷:直接调用QuickJS API产生的异常无法满足backend_quickjs的模拟需求。开发者不得不通过一些特殊逻辑来强行耦合backend_quickjs的异常实现,这种临时解决方案虽然能让单元测试通过,但却带来了严重的耦合问题——当backend_quickjs发生变动时,这部分代码就会失效。
重构方案
针对上述问题,开发团队提出了清晰的重构思路:
-
分离API实现:将原生的ExecuteModule实现完全分离,不再混用V8 API和QuickJS API。而是按照各自的回调形式分别实现两个版本,并注册到全局变量中。
-
统一调用接口:GetModuleExecutor从全局变量获取执行器,无论ExecuteModule是用哪种API实现,对其调用都相当于调用一个JavaScript函数,实现了接口的统一。
-
纯QuickJS实现:QuickJS后端的ExecuteModule完全采用QuickJS原生API的写法,消除了API混用带来的问题。
技术细节优化
在重构过程中,团队还纠正了对QuickJS API的一些误解,并进行了重要优化:
-
模块加载器初始化:明确了JS_SetModuleLoaderFunc只需要调用一次即可,避免了不必要的重复初始化。
-
模块规范化处理:认识到module_normalize参数不允许抛出JS异常这一重要限制。这意味着在module_normalize中产生的错误信息无法直接传递到module_loader。
-
异常处理改进:通过在LoadModule中使用JS_GetException判断是否在module_normalize中抛出了异常,实现了异常的重抛机制,从而在module_normalize中支持了异常处理。
重构效果
这次重构带来了多方面的改进:
-
代码清晰度提升:消除了API混用现象,代码结构更加清晰,维护成本显著降低。
-
稳定性增强:正确处理了QuickJS的异常机制,避免了之前因异常处理不当导致的潜在问题。
-
兼容性改善:解除了与backend_quickjs的强耦合,使得后端变动时模块系统仍能正常工作。
-
性能优化:通过正确的API使用方式和避免重复初始化,提升了模块加载的效率。
总结
Puerts项目对QuickJS后端模块系统的重构是一个典型的工程优化案例,它展示了如何通过深入理解底层API的特性和限制,来解决复杂的工程问题。这次重构不仅解决了眼前的技术债务,也为未来的功能扩展和维护奠定了更好的基础。对于使用Puerts框架的开发者来说,这意味着更稳定、更高效的模块系统体验。
HunyuanImage-3.0
HunyuanImage-3.0 统一多模态理解与生成,基于自回归框架,实现文本生成图像,性能媲美或超越领先闭源模型00- DDeepSeek-V3.2-ExpDeepSeek-V3.2-Exp是DeepSeek推出的实验性模型,基于V3.1-Terminus架构,创新引入DeepSeek Sparse Attention稀疏注意力机制,在保持模型输出质量的同时,大幅提升长文本场景下的训练与推理效率。该模型在MMLU-Pro、GPQA-Diamond等多领域公开基准测试中表现与V3.1-Terminus相当,支持HuggingFace、SGLang、vLLM等多种本地运行方式,开源内核设计便于研究,采用MIT许可证。【此简介由AI生成】Python00
GitCode-文心大模型-智源研究院AI应用开发大赛
GitCode&文心大模型&智源研究院强强联合,发起的AI应用开发大赛;总奖池8W,单人最高可得价值3W奖励。快来参加吧~0370Hunyuan3D-Part
腾讯混元3D-Part00ops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。C++098AI内容魔方
AI内容专区,汇集全球AI开源项目,集结模块、可组合的内容,致力于分享、交流。02Spark-Chemistry-X1-13B
科大讯飞星火化学-X1-13B (iFLYTEK Spark Chemistry-X1-13B) 是一款专为化学领域优化的大语言模型。它由星火-X1 (Spark-X1) 基础模型微调而来,在化学知识问答、分子性质预测、化学名称转换和科学推理方面展现出强大的能力,同时保持了强大的通用语言理解与生成能力。Python00GOT-OCR-2.0-hf
阶跃星辰StepFun推出的GOT-OCR-2.0-hf是一款强大的多语言OCR开源模型,支持从普通文档到复杂场景的文字识别。它能精准处理表格、图表、数学公式、几何图形甚至乐谱等特殊内容,输出结果可通过第三方工具渲染成多种格式。模型支持1024×1024高分辨率输入,具备多页批量处理、动态分块识别和交互式区域选择等创新功能,用户可通过坐标或颜色指定识别区域。基于Apache 2.0协议开源,提供Hugging Face演示和完整代码,适用于学术研究到工业应用的广泛场景,为OCR领域带来突破性解决方案。00- HHowToCook程序员在家做饭方法指南。Programmer's guide about how to cook at home (Chinese only).Dockerfile09
- PpathwayPathway is an open framework for high-throughput and low-latency real-time data processing.Python00
项目优选









