news 2026/6/10 16:55:10

VonaJS是如何做到文件级别精确HMR(热更新)的?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
VonaJS是如何做到文件级别精确HMR(热更新)的?

NestJS:项目级别HMR

如果使用过NestJS,就会知道NestJS是基于整个项目实现HMR(热更新)的。大致流程如下:当一个源码文件变更时,系统会自动将文件重新编译输出到dist目录,然后重启App。当项目非常大时,这样的HMR机制就会非常慢。

VonaJS:文件级别HMR

而VonaJS就实现了基于单文件的精确HMR(热更新)。大致流程如下:当源码文件变更时,系统会自动重新导入该文件,并替换IOC容器中注册的实例。既没有重新编译的环节,也不需要重启App。如果你要开发大型项目,没有比这个更爽的HMR机制了。

下面先简要看看VonaJS HMR的效果,再介绍是如何实现的:

文件级别HMR效果展示

1. 修改Service文件

当我们修改某个Service文件并保存之后,控制台显示如下:

2. 修改Controller文件

当我们修改某个Controller文件并保存之后,控制台显示如下:

3. 修改Middleware文件

当我们修改某个Middleware文件并保存之后,控制台显示如下:

文件级别HMR原理分析

1. 分布式场景中如何实现文件Watch

VonaJS原生支持分布式架构,因此在执行npm run dev时也是默认启动两个Workers,便于尽早排查分布式场景下可能遇到的问题。那么,在分布式场景中,我们需要挑选出一个Worker,用于监听文件的变更事件。

VonaJS提供了Election机制,代码如下:

exportclassMonkey{asyncappStarted(){constscope=this.app.scope(__ThisModule__);scope.election.obtain('hmr',async()=>{awaitscope.service.watch.start();},async()=>{awaitscope.service.watch.stop();});}}
  1. 响应系统启动事件,通过scope.election.obtain竞争所有权
  2. 当取得所有权时,执行scope.service.watch.start,实现文件监听
  3. 当释放所有权时,执行scope.service.watch.stop,停止文件监听

2. ESM文件重新加载

当监听到源码文件变更之后,需要重新加载。我们知道一个文件import之后,系统会自动缓存,如果再次import,系统会直接使用缓存,不会重新加载。那么,我们是否可以强制清理系统缓存呢?在CJS中是可以的,但在ESM中不行。

NestJS开发时间比较早,到目前为止仍然使用的是CJS模块。在NestJS中,源码采用的是ESM语法,但是实际运行时,需要先编译成CJS模块,然后再通过require加载模块。

而VonaJS是全新设计的框架,全部使用了ESM模块。虽然不能删除系统缓存,但是可以通过变更文件名的方式来实现重新加载,代码如下:

constfile='/path/to/service.ts';constfileUrl=`${file}?${Date.now()}`;constfileModule=awaitimport(fileUrl);

3. 清理运行状态值

当文件重新加载之后,就可以替换IOC容器中注册的实例。除此之外还有可能需要清理一些运行状态值。这就需要具体问题具体分析。比如,Server文件不需清理运行状态值。但是,Middleware就需要清理运行状态,从而让新的Middleware生效

下面以系统中间件为例,演示基本流程:

  1. 当系统启动时,需要注入系统中间件
this.app.use((ctx,next)=>{return_composeMiddlewareSystems(this.app)(ctx,next);});
function_composeMiddlewareSystems(app:VonaApplication){// composeif(!app.meta[SymbolCacheComposeMiddlewareSystems]){constmiddlewares=app.bean.onion.middlewareSystem.getOnionsEnabledWrapped(item=>{return_wrapOnion(app,item);});app.meta[SymbolCacheComposeMiddlewareSystems]=compose(middlewares);}returnapp.meta[SymbolCacheComposeMiddlewareSystems];}

_composeMiddlewareSystems方法将收集所有系统中间件,并compose成一个函数,然后缓存到app.meta[SymbolCacheComposeMiddlewareSystems]

  1. 清理运行状态
@Hmr()exportclassHmrMiddlewareSystemextendsBeanBaseimplementsIHmrReload{asyncreload(_beanOptions:IDecoratorBeanOptionsBase){deletethis.app.meta[SymbolCacheComposeMiddlewareSystems];}}

当某个系统中间件重新加载后,就会自动执行该Class的reload方法,删除缓存app.meta[SymbolCacheComposeMiddlewareSystems]。从而让_composeMiddlewareSystems方法重新收集所有系统中间件,compose出一个新的函数

4. 支持更多场景

如上所述,不同场景的文件,需要根据不同的运行机制,提供不同的清理逻辑,确保文件级别的HMR可以正常运行

VonaJS支持大量的场景开发,清单如下:

  1. Vona Aspect

  2. Vona Bean

  3. Vona Create

  4. Vona Init

  5. Vona Meta

  6. Vona Tools

资源

  • Github:https://github.com/vonajs/vona
  • 文档:https://vona.js.org
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 0:05:07

containerd stats_collect_period 参数学习

文章目录1、参数含义2、配置位置3、使用场景4、 调整建议5、验证配置stats_collect_period 是 containerd 配置中的一个参数,用于设置CRI(容器运行时接口)插件收集容器统计信息的频率。该参数的值以持续时间格式(如 “10s”&#…

作者头像 李华
网站建设 2026/6/10 11:40:07

Docker与本地PaddleOCR环境配置指南

Docker与本地PaddleOCR环境配置指南 在工业检测、金融票据识别和文档数字化等实际场景中,中文OCR的准确率与稳定性直接决定系统可用性。传统OCR工具面对模糊文本、复杂背景或倾斜排版时常力不从心,而基于深度学习的解决方案则展现出更强的适应能力。 百…

作者头像 李华
网站建设 2026/6/10 14:41:15

【计算机毕业设计案例】基于SpringBoot + Vue的二手交易平台的设计与实现基于javaEE的二手手机交易平台的设计与实现(程序+文档+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/6/10 0:44:31

【完整源码+数据集+部署教程】人脸防伪检测系统源码分享[一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]

一、背景意义 随着信息技术的迅猛发展,尤其是在人工智能和计算机视觉领域的不断进步,人脸识别技术已广泛应用于安防、金融、社交媒体等多个领域。然而,伴随而来的却是各种人脸欺诈行为的增多,如照片、视频或面具等伪造手段&#x…

作者头像 李华
网站建设 2026/6/10 16:24:18

Qwen3-14B模型部署常见问题与解决方案

Qwen3-14B模型部署常见问题与解决方案 在企业迈向智能化的征途中,越来越多团队开始将大语言模型(LLM)作为核心引擎,嵌入客服系统、内容平台、数据分析工具等关键业务流程。而当“私有化部署”成为刚需,Qwen3-14B 正逐渐…

作者头像 李华
网站建设 2026/6/10 7:52:39

Java毕设项目推荐-基于java的天气预报查询系统基于springboot天气预报查询系统基于SpringBoot的在线天气查询系统【附源码+文档,调试定制服务】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华