
TypeError: this.app.$destroy is not a function in gradio.js
快速结论:该报错发生在以嵌入式方式将 Gradio 应用加载到 HTML 页面(例如 Web Component)中时,由 gradio.js 脚本调用已废弃的 Svelte $destroy() 方法所致。优先排查是否是通过 CDN 引入 gradio.js 进行嵌入集成。
问题场景
用户在 HTML 页面中通过 <script> 标签引入 gradio.js(例如从 https://gradio.s3-us-west-2.amazonaws.com/6.0.2/gradio.js)来嵌入 Gradio 应用,并在浏览器控制台中观察到该报错。注意:虽然抛出该错误,但应用本身似乎仍能正常运行,不一定会影响功能。
报错原文
Uncaught (in promise) TypeError: this.app.$destroy is not a function
原因分析
该错误的根本原因是 gradio.js 中的 spa/src/main.ts(第 92 行)调用了 Svelte 旧版组件销毁方法 $destroy(),但在 Gradio 进行 Svelte 5 迁移后,该 API 已不再被定义或支持。Svelte 5 使用新的 unmount API 来销毁组件(参考 Svelte 官方文档:Imperative Component API – unmount),而代码未同步更新,导致 this.app 上不存在 $destroy 方法。
环境排查
- Gradio 版本:6.0.2(通过 CDN 引入的版本)
- 集成方式:通过
gradio.js脚本将 Gradio 应用嵌入 HTML 页面(非 Python 直接启动 Flask/FastAPI 服务器的模式) - 浏览器控制台错误观察:与其他功能报错区分
解决步骤
- 可优先尝试:在 Gradio 官方修复此问题之前,确认你的嵌入应用是否功能正常。如 Issue 中所述,尽管该报错出现,应用仍可能正常工作,可忽略此错误。
- 如果希望消除控制台错误,可参考
@freddyaboulton提出的临时修补方案:在调用this.app.$destroy()之前添加存在性检查,避免直接调用不存在的函数。但这需要修改 Gradio 的源码后自行构建gradio.js:if (this.app && this.app.$destroy) { this.app.$destroy(); } - 等待 Gradio 官方进行 Svelte 5 兼容性修复,将
$destroy替换为新的unmountAPI(由维护者@pngwn或@dawoodkhan82处理)。
验证方法
重新加载包含 Gradio 嵌入的页面,打开浏览器开发者工具(F12),查看控制台是否不再出现 Uncaught (in promise) TypeError: this.app.$destroy is not a function 错误。同时确认 Gradio 应用的交互功能(如组件挂载、输出显示)正常运行。



