使用后如何移除Worklet?未使用的Worklet是否会由GC自动回收?
Worklet内存回收问题解答
目前Web标准没有提供手动注销、移除已经加载到Worklet中的模块的公开接口,内存回收全部依赖浏览器的垃圾回收机制实现,具体规则如下:
- 当Worklet实例本身没有被任何JS对象引用、也没有被浏览器平台逻辑持有时(例如Paint Worklet没有被任何CSS规则引用、Audio Worklet没有被AudioContext挂载、Layout Worklet没有绑定到任何DOM节点),整个Worklet实例以及其加载的所有模块资源都会被GC自动回收。
- 如果Worklet实例仍被持有,但其中某个加载的模块没有被任何逻辑调用、模块导出的类/方法也没有被平台侧持有,主流Chrome、Firefox、Safari浏览器均支持自动回收这部分闲置模块占用的内存,无需手动操作。
最佳实践建议
- 优先复用同一个Worklet实例,通过参数区分不同的运行逻辑,避免频繁调用
addModule加载新模块,降低内存开销。 - 如果必须使用大量临时Worklet,使用完毕后务必解除所有对Worklet实例的引用,同时移除所有关联的CSS规则、DOM绑定、音频节点挂载等逻辑,让GC可以尽快回收对应资源。
Worklet.addModule() 接口说明(翻译)
addModule()是Worklet接口的内置方法,用于加载指定的JavaScript模块,并将其加入当前Worklet实例可执行的模块列表中。
方法语法:addModule(moduleURL) addModule(moduleURL, options)参数说明:
moduleURL:要加载的JS模块的地址,支持运行时生成的Blob URL、Data URL等格式。options:可选配置对象,目前仅支持credentials属性,用于指定模块加载时的凭证策略,可选值为omit、same-origin、include,默认值与普通fetch请求的凭证策略一致。
方法返回Promise对象,模块加载、解析完成后Promise状态变为兑现,加载或解析出错时状态变为拒绝。
内容的提问来源于stack exchange,提问作者dogefromage
相关产品推荐
相关产品推荐

