未导出的DashComponent为何能在其他Angular路由模块中直接使用?
问题原因说明
NgModule.exports仅管控模板内的组件引用
Angular 模块的exports配置,作用范围仅限其他模块在自身组件的HTML模板中,直接使用当前模块声明的组件、指令、管道。你在路由配置中直接填写component: DashComponent属于 TypeScript 层面的类直接引用,只要路由配置文件里正确通过import语句引入了DashComponent对应的源码文件,TS 编译就能正常通过。
Angular 运行时不会校验这类直接类引用的模块导出关系:路由加载组件时是直接拿着组件类去实例化,不走模板解析的指令匹配逻辑,自然不会触发未导出的报错。你可以做个对比测试:在A模块下的任意组件模板里写<app-dash></app-dash>(app-dash是DashComponent的选择器),此时一定会抛出模板解析错误,提示找不到对应组件,这才是exports规则生效的场景。- Ivy 编译模式的特性加持
Angular 9+ 默认开启的 Ivy 编译模式下,组件的所有元数据(模板、样式、选择器等)都是直接附加在组件类本身的,只要能拿到组件类的引用,运行时就能直接读取元数据完成实例化,不需要依赖模块的导出配置来获取元数据。 - 两个模块存在公共上级导入上下文
如果A、B两个路由模块都被同一个根模块(如 AppModule)或者更高层级的公共父模块同时导入,DashComponent已经被 Angular 编译器在全局组件注册上下文中收录,哪怕没有导出,路由实例化时也能正常获取到组件的配置信息,不会出现找不到组件的错误。 - 未开启模块级别的打包隔离
如果你没有使用模块联邦、子应用独立打包这类会隔离模块上下文的方案,整个项目的代码是在同一个编译打包上下文里,只要 TS 层面能找到类引用,就不会出现运行时的类缺失报错,和模块是否导出没有关系。
内容的提问来源于stack exchange,提问作者iJade
相关产品推荐
相关产品推荐

