离线运行下载的GBA模拟器WASM加载异常,选择文件按钮消失
核心问题是WASM模块未成功加载,导致wasmReady()函数从未触发,因此界面一直停留在加载状态,Choose File按钮无法显示。直接修改DOM的hidden属性无效,因为逻辑初始化流程根本没走到按钮显示的步骤。以下是具体排查和解决思路:
检查WASM文件是否存在且路径匹配
模拟器的核心逻辑在WASM文件中,Emscripten编译的JS脚本(即你本地的44gba.js)会自动加载对应的WASM文件。打开44gba.js搜索locateFile或.wasm关键词,找到它要加载的WASM文件名(比如44gba.wasm),确认你已将该文件下载到本地,且存放路径和脚本预期一致(比如脚本在/Scripts/目录,WASM文件也需放在同目录)。改用本地HTTP服务器运行,禁止直接用file://协议打开
浏览器对file://协议的本地文件有严格安全限制,WASM模块大概率无法正常加载。可以用以下方式启动本地服务器:- VS Code安装Live Server插件,右键HTML文件选择「Open with Live Server」
- Python环境:在项目根目录执行
python -m http.server 8000,访问http://localhost:8000 - Node.js环境:安装
http-server包后,执行http-server启动服务
查看浏览器控制台的错误日志
按F12打开开发者工具,切换到「Console」标签页,检查是否有WASM加载相关的错误(比如404文件未找到、编译失败、权限限制);再切换到「Network」标签页,筛选「WASM」类型,确认WASM文件的请求状态是否为200。这些日志能直接定位具体故障点。确认WASM初始化回调是否正确绑定
Emscripten编译的Module对象有onRuntimeInitialized回调,WASM加载完成后会自动触发它。检查代码是否存在Module.onRuntimeInitialized = wasmReady这类绑定逻辑:- 如果
44gba.js已内置该绑定,确保app.js的wasmReady函数在脚本加载时处于可用状态 - 如果没有绑定,手动在
app.js中添加这段代码(需确保Module对象已初始化后执行)
- 如果
确保脚本加载顺序和初始化时机正确
虽然你已将44gba.js放在app.js前加载,但可将app.js中WASM相关代码放到页面加载完成的回调里,避免Module对象未初始化就绑定函数:window.addEventListener('DOMContentLoaded', function() { Module.onRuntimeInitialized = wasmReady; });
内容的提问来源于stack exchange,提问作者George

