仅在--prod模式下出现No provider for t错误的排查求助
解决Angular "No provider for t!" 错误
首先,这个错误是Angular依赖注入系统找不到某个服务/类的提供者导致的,而错误里的t是代码压缩混淆后的变量名,得先找到它对应的真实服务才能解决问题。下面是具体的排查步骤:
1. 定位真实的依赖项
因为生产环境的代码会被压缩混淆,变量名被替换成了t,所以第一步要还原它的原始名称:
- 用Source Map反混淆:找到你的
vendor.96643eaf6ee79e7b894d.bundle.js对应的.map文件,借助浏览器开发者工具的Source Map功能(Chrome/Firefox的DevTools默认开启),点击错误栈里的文件路径,就能跳转到未混淆的源码,看到t对应的真实类名。 - 临时关闭压缩:在开发环境(
ng serve)下重现错误,开发环境不会混淆变量名,错误信息会直接显示具体是哪个服务缺失。
2. 检查依赖的提供方式
找到真实的服务后,按以下场景排查:
- 根注入的服务:确认服务类的
@Injectable()装饰器里是否配置了{ providedIn: 'root' },比如:
如果没加这个配置,要确保在根模块(比如@Injectable({ providedIn: 'root' // 根级别提供,全应用可用 }) export class YourRealService {}AppModule)的providers数组里声明了该服务。 - 模块级服务:如果服务是在某个功能模块里提供的,要确保使用该服务的组件所在模块,已经导入了这个功能模块,或者在当前模块的
providers里注册了服务。 - 组件级服务:如果服务是组件专属的,要检查组件的
providers数组是否包含这个服务。
3. 常见的排查误区
- 检查服务的导入路径是否正确,有没有拼写错误;
- 懒加载模块里的服务,如果需要在其他模块使用,要确保它被标记为根注入,或者通过共享模块导出;
- 排查是否存在循环依赖(比如A服务依赖B,B又依赖A),这种情况也会触发类似的注入失败错误。
原始错误信息
vendor.96643eaf6ee79e7b894d.bundle.js:1 ERROR Error: No provider for t!
at x (vendor.96643eaf6ee79e7b894d.bundle.js:1)
at S (vendor.96643eaf6ee79e7b894d.bundle.js:1)
at t._throwOrNull (vendor.96643eaf6ee79e7b894d.bundle.js:1)
at t._getByKeyDefault (vendor.96643eaf6ee79e7b894d.bundle.js:1)
at t._getByKey (vendor.96643eaf6ee79e7b894d.bundle.js:1)
at t....
内容的提问来源于stack exchange,提问作者Jordan Lowe
相关产品推荐
相关产品推荐

