HTML引入外部game.mjs脚本不执行,内联可运行,请问哪里出错?
你注释了导入语句和socket初始化后脚本就能正常运行,说明问题就出在这三行代码涉及的两个环节:ES模块导入、socket实例初始化。你可以先打开浏览器开发者工具的「控制台」标签,查看具体报错信息,就能快速定位问题,常见的可排查点如下:
- 静态资源路径配置错误
如果你的后端服务将public目录设置为静态资源根目录,那么HTML中引入game.mjs的路径../public/game.mjs是无效的,服务端无法解析到该路径,会返回404错误。你需要将引入路径修改为/game.mjs,同时确认Player.mjs、Collectible.mjs和game.mjs存放在同一级的public目录下,保证game.mjs中的相对导入路径./Player.mjs可以正确命中目标文件。 - 全局io变量访问异常
ES模块具备独立的作用域,和普通脚本的全局作用域隔离。你在HTML头部引入的socket.io.js会将io挂载到window全局对象上,直接在模块中调用io()可能出现变量未定义的报错。你可以将对应代码修改为const socket = window.io(),明确从全局对象获取io实例。 - 服务端MIME类型配置错误
部分默认的服务端配置没有为.mjs后缀的文件设置正确的MIME类型,浏览器会因为MIME类型不匹配拒绝执行ES模块。你需要确认服务端返回的.mjs文件响应头中Content-Type值为text/javascript,如果不对则调整服务端配置。
内容的提问来源于stack exchange,提问作者Rocklanna
相关产品推荐
相关产品推荐

