Autodesk Viewer V7离线工作流加载缓存模型报错求助
解决Viewer V7离线加载模型时请求云端Manifest的问题
问题根源
Viewer V7的文档加载流程与V6不同,即便模型资源已被service-worker缓存,调用Autodesk.Viewing.Document.load或currentApp.loadDocument时,仍会默认向云端请求模型的manifest文件,导致离线状态下触发ERR_INTERNET_DISCONNECTED错误。
解决方案
1. 确保Service-Worker缓存全量资源
确认service-worker已缓存模型的manifest文件、SVF/SVF2几何文件、纹理/材质文件等所有衍生品资源。缓存路径需与Viewer在线加载时的请求路径完全匹配(可通过浏览器DevTools的Network面板查看路径规则)。
2. 绕过云端Document加载,直接加载本地缓存资源
放弃使用官方的Document加载方法,改为直接加载本地缓存的SVF/SVF2文件,示例代码如下:
export function loadModel_cache(urn) { let viewerError = document.getElementById("viewer-error"); if (viewerError) { viewerError.parentNode.removeChild(viewerError); } function onLoadFailure() { viewerError = document.createElement("div"); viewerError.id = "viewer-error"; viewerError.innerHTML = "<span>无法加载文档,请检查是否处于离线状态?</span>"; document.getElementById("preview").appendChild(viewerError); updateOverlay(); console.error("加载模型失败:" + urn); } currentUrn = null; const status = document.querySelector(`#overlay > ul > li[data-urn="${urn}"] > .model-status`); status.style.setProperty("display", "inline"); status.innerHTML = "(加载中...)"; // 替换为service-worker缓存的SVF文件本地路径 const localSvfPath = `/cached-models/${urn}/model.svf`; currentApp.loadModel(localSvfPath, { disableWorkerFetching: true, // 禁止Worker从云端拉取资源 useConsolidation: false }).then(() => { currentUrn = urn; updateOverlay(); }).catch(onLoadFailure); }
3. 初始化Viewer时配置离线参数
启动Viewer时添加离线专属配置,强制优先使用本地缓存:
const viewer = new Autodesk.Viewing.GuiViewer3D(document.getElementById('preview'), { env: 'Local', // 标记为本地离线环境 disableWebWorkerFetching: true, isAEC: false // 非AEC模型设为false,AEC模型需调整为true });
4. 替代方案:构造离线Document对象
如果需要保留Document加载逻辑,可手动构造离线Document对象,避免云端请求:
function createOfflineDocument(urn, svfPath) { const doc = new Autodesk.Viewing.Document(); doc.urn = `urn:${urn}`; doc.root = { search: () => [{ data: { urn: svfPath, type: 'geometry' }, getViewablePath: () => svfPath }] }; return doc; } // 在loadModel_cache中使用 const offlineDoc = createOfflineDocument(urn, localSvfPath); currentApp.loadDocumentNode(offlineDoc, offlineDoc.root.search({ type: 'geometry' })[0]) .then(() => { currentUrn = urn; updateOverlay(); }) .catch(onLoadFailure);
关键注意事项
- 缓存路径必须与Viewer请求路径完全一致,否则service-worker无法拦截请求。
- 若使用SVF2格式模型,需额外缓存
.svf2、.bubble.json、.bin等关联文件。 - 测试离线功能前,需先在线加载模型,确保service-worker完成所有资源的缓存。
内容的提问来源于stack exchange,提问作者Tim Huang
相关产品推荐
相关产品推荐

