You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular Universal运行时bundle.js报Uncaught SyntaxError如何排查

问题根因

这个报错和JS代码语法错误无关:expected expression, got '<'的本质是浏览器请求bundle.js时,服务端返回的是HTML内容(一般是路由兜底返回的index.html),文件第一行<!DOCTYPE html>开头的<被JS引擎当成代码解析,直接抛出语法错误。
你提到生产构建npm run build后dist/browser下的bundle.js内容正常,完全可以排除业务代码、编译配置本身的问题,故障点100%出在dev:ssr开发模式的服务路由配置、内存资源映射逻辑上。

调试&修复步骤

按优先级从高到低排查:

  • 先坐实问题:打开浏览器开发者工具的Network面板,刷新页面找到bundle.js的请求,查看Response内容,你会看到返回的是<!DOCTYPE html>开头的HTML页面,不是JS代码,确认是资源请求错配问题,不用浪费时间排查业务代码语法。
  • 检查SSR服务路由顺序:如果你项目自定义了server.ts里的Express服务逻辑,确认静态资源处理中间件的挂载顺序在客户端路由兜底规则之前。Angular SSR默认的兜底规则是server.get('*', ...)返回index.html,如果静态资源(js/css/图片等)的处理规则写在这个兜底规则后面,所有JS请求都会直接命中兜底返回HTML,触发这个报错。
  • 核对路径配置一致性:检查三处路径配置是否完全匹配:
    1. angular.json里serve-ssr配置项对应的browserTarget开发配置下的deployUrl、baseHref值
    2. src/index.html里<base href="xxx">标签的href值
    3. 自定义Express服务里静态资源中间件、开发模式编译中间件(webpack-dev-middleware / Angular esbuild开发中间件)的publicPath值
      任意一处前缀不匹配(比如baseHref配了/admin/但服务静态资源挂在根路径/),都会导致JS请求找不到对应资源,走到兜底返回HTML的逻辑。
  • 排查开发模式内存资源映射问题:dev:ssr启动时不会把编译产物写到磁盘,所有JS/CSS资源都存在服务内存中,如果开发编译中间件注册失败,内存里的资源就无法被正确访问。你可以先执行以下操作排除缓存和临时异常:
    1. 删除项目根目录下的dist文件夹
    2. 删除node_modules/.cache缓存目录
    3. 重新执行npm run dev:ssr启动服务
      如果清缓存后问题复现,检查package.json里dev:ssr对应的执行脚本,确认没有自定义修改ng run <你的项目名>:serve-ssr的默认参数,如果是Angular17+使用Vite作为开发构建工具,检查vite.config.js里的server.fs.allow配置是否覆盖了项目源码目录,没有拦截JS资源请求。
  • 快速定位冲突规则:临时注释server.ts里所有你自定义的路由、中间件逻辑,只保留Angular SSR官方默认的静态资源处理和兜底路由,启动服务如果能正常加载bundle.js,再逐行恢复你自定义的逻辑,就能定位到是哪段代码拦截了JS请求。

补充:这个问题和AOT编译模式无关,你不需要强行用ng serve --aot启动,只要把开发模式下静态资源的路由匹配、路径映射逻辑调通就能解决。

内容的提问来源于stack exchange,提问作者Muhammad Arslan Jamshaid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 17:18:24