Angular路由报错:Cannot find module 'app/user/user.module'原因咨询
问题原因及解决方案
你遇到的这个问题其实和Angular版本的语法变更直接相关,我来给你拆解清楚:
1. 旧字符串写法被废弃(版本兼容性)
Angular 8及以后的版本,官方废弃了loadChildren: 'app/user/user.module#UserModule'这种带#的字符串模块加载语法,转而推荐使用动态导入的方式。之前的示例能正常运行,大概率是基于Angular 7或更早的版本——那时候这种写法还是官方支持的。
而且Angular 8默认启用了Ivy编译器,这个新编译器对旧的字符串路径解析逻辑不再兼容,哪怕你调整路径加./也没用,因为底层的模块查找规则已经变了。
2. 路径解析逻辑的变化
旧写法里的app/xxx这种绝对路径,在旧版Angular的构建系统里能被正确识别,但新版本的CLI和构建工具对模块路径的解析更严格,它不再支持这种从根目录出发的字符串路径格式,所以你加./也无法让编译器找到对应的模块文件。
3. 箭头函数写法为何生效
() => UserModule这种写法本质是利用了ES6的动态导入特性,也是Angular现在推荐的标准写法:
- 它能让TypeScript编译器直接解析模块的真实路径,不会出现找不到模块的问题
- 支持Tree Shaking,能优化打包体积
- 完美兼容Ivy编译器,是未来的主流写法
可行的解决方案
- 推荐方案:继续使用箭头函数写法,或者更完整的动态导入语法:
这种写法是Angular官方现在主推的,没有版本兼容问题,还能获得更好的打包优化。{ path: 'user', loadChildren: () => import('./user/user.module').then(m => m.UserModule) } - 如果非要用旧字符串写法(不推荐):
你需要降级到Angular 7及以下版本,或者在tsconfig.json里配置paths映射,同时禁用Ivy编译器,但这只是临时的妥协,不适合长期维护。
内容的提问来源于stack exchange,提问作者Paritosh
相关产品推荐
相关产品推荐

