JavaScript/TypeScript模块级定义的serviceBroker对象生命周期是怎样的
serviceBroker 实例相关问题解答
核心规则前提
你观察到的实例行为由 Node.js/浏览器环境下的模块缓存机制决定,和 TypeScript 语法本身无关,ES 模块、CommonJS 模块都遵循该规则。
问题逐一解答
生命周期与创建时机
serviceBroker是模块顶层声明的常量,它的初始化逻辑(new MyBroker())会在myService.ts第一次被其他模块导入时执行,实例会在本次模块加载过程中创建完成。销毁时机
无手动操作的前提下,该实例会持续持有内存引用,直到整个进程退出时随进程资源一同被系统回收。如果需要提前销毁实例,需要手动解除所有对它的引用:包括将模块层面的关联引用置空,同时确认所有业务代码中没有单独留存该实例的引用,之后实例会在下次垃圾回收执行时被清理。单进程实例数量
标准开发场景下,单个进程内该实例全局唯一,只会存在1个。只有两种特殊场景会出现多实例:- 手动清空模块缓存后重新导入:比如 CommonJS 环境下执行
delete require.cache[require.resolve('./myService.ts')]后再次导入该模块,会重新执行模块顶层代码生成新实例 - 导入路径异常:导入时的路径大小写不一致、通过软链接等不同路径映射到同一个物理文件,导致模块加载器判定为不同模块,也会触发重复加载生成新实例,这类问题多出现于大小写不敏感的操作系统(如 Windows)中。
- 手动清空模块缓存后重新导入:比如 CommonJS 环境下执行
内容的提问来源于stack exchange,提问作者friartuck
相关产品推荐
相关产品推荐

