首页
/ Puerts项目中QuickJS后端模块实现的重构与优化

Puerts项目中QuickJS后端模块实现的重构与优化

2025-06-07 20:31:59作者:宣利权Counsellor

背景介绍

Puerts是一个将TypeScript/JavaScript与Unity/C++等原生环境桥接的技术框架,它支持多种JavaScript引擎后端。其中QuickJS作为一个轻量级的JavaScript引擎,在Puerts中有着重要应用。近期,Puerts项目团队对QuickJS后端的模块实现进行了重要重构,解决了原有实现中的一些关键问题。

原有实现的问题

在重构前的实现中,QuickJS后端的模块系统存在几个显著问题:

  1. API混用问题:代码中同时混用了模拟V8 API和原生QuickJS API,这种混合使用方式不仅增加了代码复杂度,也使得维护变得困难。更严重的是,部分QuickJS API的使用方式存在理解偏差,可能导致潜在问题。

  2. 异常处理缺陷:直接调用QuickJS API产生的异常无法满足backend_quickjs的模拟需求。开发者不得不通过一些特殊逻辑来强行耦合backend_quickjs的异常实现,这种临时解决方案虽然能让单元测试通过,但却带来了严重的耦合问题——当backend_quickjs发生变动时,这部分代码就会失效。

重构方案

针对上述问题,开发团队提出了清晰的重构思路:

  1. 分离API实现:将原生的ExecuteModule实现完全分离,不再混用V8 API和QuickJS API。而是按照各自的回调形式分别实现两个版本,并注册到全局变量中。

  2. 统一调用接口:GetModuleExecutor从全局变量获取执行器,无论ExecuteModule是用哪种API实现,对其调用都相当于调用一个JavaScript函数,实现了接口的统一。

  3. 纯QuickJS实现:QuickJS后端的ExecuteModule完全采用QuickJS原生API的写法,消除了API混用带来的问题。

技术细节优化

在重构过程中,团队还纠正了对QuickJS API的一些误解,并进行了重要优化:

  1. 模块加载器初始化:明确了JS_SetModuleLoaderFunc只需要调用一次即可,避免了不必要的重复初始化。

  2. 模块规范化处理:认识到module_normalize参数不允许抛出JS异常这一重要限制。这意味着在module_normalize中产生的错误信息无法直接传递到module_loader。

  3. 异常处理改进:通过在LoadModule中使用JS_GetException判断是否在module_normalize中抛出了异常,实现了异常的重抛机制,从而在module_normalize中支持了异常处理。

重构效果

这次重构带来了多方面的改进:

  1. 代码清晰度提升:消除了API混用现象,代码结构更加清晰,维护成本显著降低。

  2. 稳定性增强:正确处理了QuickJS的异常机制,避免了之前因异常处理不当导致的潜在问题。

  3. 兼容性改善:解除了与backend_quickjs的强耦合,使得后端变动时模块系统仍能正常工作。

  4. 性能优化:通过正确的API使用方式和避免重复初始化,提升了模块加载的效率。

总结

Puerts项目对QuickJS后端模块系统的重构是一个典型的工程优化案例,它展示了如何通过深入理解底层API的特性和限制,来解决复杂的工程问题。这次重构不仅解决了眼前的技术债务,也为未来的功能扩展和维护奠定了更好的基础。对于使用Puerts框架的开发者来说,这意味着更稳定、更高效的模块系统体验。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
leetcodeleetcode
🔥LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer(第 2 版)》、《程序员面试金典(第 6 版)》题解
Java
51
15
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
117
202
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
504
399
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
62
144
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
296
1.01 K
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
97
251
cherry-studiocherry-studio
🍒 Cherry Studio 是一款支持多个 LLM 提供商的桌面客户端
TypeScript
384
37
MateChatMateChat
前端智能化场景解决方案UI库,轻松构建你的AI应用,我们将持续完善更新,欢迎你的使用与建议。 官网地址:https://matechat.gitcode.com
693
91
RuoYi-Cloud-Vue3RuoYi-Cloud-Vue3
🎉 基于Spring Boot、Spring Cloud & Alibaba、Vue3 & Vite、Element Plus的分布式前后端分离微服务架构权限管理系统
Vue
97
74
HarmonyOS-ExamplesHarmonyOS-Examples
本仓将收集和展示仓颉鸿蒙应用示例代码,欢迎大家投稿,在仓颉鸿蒙社区展现你的妙趣设计!
Cangjie
357
341