layer0预览Nuxt3站点报Failed to load module script错误
复现步骤
- 执行命令
npx nuxi init test - 执行命令
cd test - 执行命令
yarn install - 执行命令
NITRO_PRESET=layer0 yarn build完成项目构建 - 执行命令
cd .output进入构建产物目录 - 执行命令
npm run preview启动预览服务 - 浏览器访问 localhost:3000
- 打开浏览器控制台查看报错
问题现象
控制台完整报错信息为:
error: Failed to load module script: Expected a JavaScript module script but the server responded with a MIME type of "text/html". Strict MIME type checking is enforced for module scripts per HTML spec.
排查发现服务端返回的mjs文件实际内容为HTML格式,初步判断为layer0搭配nitro server运行时错误返回非目标文件,导致模块脚本加载失败。
问题原因
layer0是Nitro为旧版Layer0(现已更名Edgio)平台提供的专属部署预设,所有路由规则、静态资源映射逻辑都是适配平台线上运行环境设计的。直接调用Nitro内置的preview命令启动服务时,不会加载预设内的平台专属静态资源匹配规则,.mjs等静态资源请求匹配不到对应文件时,会触发路由兜底逻辑返回入口index.html,最终触发MIME类型校验报错。- Nitro 2.0及以上版本已经停止维护旧的
layer0预设,兼容逻辑缺失本身就会导致构建产物路径映射异常,无论本地预览还是线上部署都可能触发资源加载错误。
修复方案
对应不同场景直接按以下方式处理:
- 仅本地验证构建可用性:构建时去掉
NITRO_PRESET=layer0参数,直接执行yarn build完成构建后,进入.output目录执行npm run preview即可。默认的node-server预设适配本地preview服务,不会出现路由兜底错误。 - 本地验证Layer0/Edgio部署效果:不要手动进入
.output目录启动服务,在项目根目录安装Edgio CLI后,执行平台提供的本地模拟命令启动服务,会自动加载预设内的路由、MIME类型配置:
# 全局安装CLI npm i -g @edgio/cli # 初始化Edgio项目配置 0 init # 启动本地平台模拟环境 0 dev
- 线上部署仍出现该报错:在项目根目录的Edgio路由配置文件(通常为
routes.js或routes.ts)中,补充静态资源精确匹配规则,避免静态资源请求被兜底到SSR服务入口:
import { Router } from '@edgio/core/router' export default new Router() // 精准匹配Nuxt构建后的静态资源路径,直接返回对应文件 .match('/_nuxt/:path*', ({ serveStatic }) => { serveStatic('.output/public/_nuxt/:path*') }) // 其余所有请求交由Nitro服务处理 .fallback(({ renderWithApp }) => renderWithApp())
同时将构建命令中的NITRO_PRESET=layer0替换为NITRO_PRESET=edgio,使用官方持续维护的最新预设,规避旧预设的兼容问题。
内容的提问来源于stack exchange,提问作者NoahGav
相关产品推荐
相关产品推荐

