loadFrozenModel加载本地文件失败及async/await使用求助
解决tfjs-converter模型加载的几个问题
我来逐个拆解你遇到的问题,给出具体的解决思路:
1. "await是保留字" 与 Promise 被标记为void的问题
你的async函数写法本身是合规的,但出现这两个提示大概率是两个核心原因:
- 路径拼写错误导致模型加载失败:你代码里的
WEIGHTS_URL写成了.model/weights_manifest.json,这里少了一个开头的斜杠,正确路径应该是./model/weights_manifest.json(和MODEL_URL的格式保持一致)。路径错误会直接导致模型加载Promise被拒绝,而你没有处理这个错误,所以ESLint会提示你这个Promise的结果被忽略(标记为void)。 - 未对Promise错误做捕获处理:async函数返回的Promise如果出错,必须被捕获,否则会触发未处理的Promise拒绝警告。你需要给加载逻辑添加错误捕获:
async function loadMod(){ const MODEL_URL = './model/web_model.pb'; const WEIGHTS_URL = './model/weights_manifest.json'; // 修正路径 try { const model = await loadFrozenModel(MODEL_URL, WEIGHTS_URL); // 加载成功后可以把模型挂载到全局,方便后续调用预测 window.model = model; console.log('模型加载成功!'); } catch (err) { console.error('模型加载失败:', err); } } // 调用时也可以额外做一层错误兜底 loadMod().catch(err => console.error('加载流程出错:', err));
另外检查你的Babel配置:确保@babel/preset-env的目标环境包含你要支持的浏览器,或者配合@babel/plugin-transform-runtime使用,确保async/await语法被正确转译。ESLint方面,可以在配置中调整no-void规则,或者确保你始终处理Promise的结果。
2. 本地模型是否可以用相对路径?
当然可以!完全不需要必须从云端托管,但要注意打包工具的静态资源处理逻辑:
- Parcel:默认会自动识别静态资源路径,只要你的
model文件夹和入口文件在同一目录下,Parcel会把模型文件自动复制到打包后的dist目录中,相对路径保持不变。 - Webpack:需要手动配置
copy-webpack-plugin来把模型文件夹复制到输出目录,否则Webpack不会处理这些非JS/CSS文件。示例配置:
const CopyWebpackPlugin = require('copy-webpack-plugin'); module.exports = { // ...其他Webpack配置 plugins: [ new CopyWebpackPlugin({ patterns: [ { from: './model', to: './model' } // 把源码中的model文件夹复制到dist/model ] }) ] };
额外注意:不要直接用file://协议打开本地HTML文件,浏览器的CORS限制会阻止加载本地模型文件。建议用本地服务器运行,比如Parcel默认的dev server、Webpack Dev Server,或者用npx serve启动简易服务器。
调试小技巧
打开浏览器开发者工具的Network面板,查看模型文件的请求状态:如果返回404,说明路径还是有问题;如果返回其他错误,能快速定位是模型文件损坏还是加载逻辑有问题。同时要确保Python转换后的web_model.pb和weights_manifest.json文件完整,没有遗漏。
内容的提问来源于stack exchange,提问作者RadEdje
相关产品推荐
相关产品推荐

