Angular 17中BrowserModule未导入CommonModule却导出的原理疑问
关于Angular 17中BrowserModule未显式导入却导出CommonModule的疑问解答
首先明确两个核心点:
- Angular的NgModule规则里,导出模块并不强制要求必须先显式导入它,但如果没导入就导出,这个操作其实没有实际作用——因为当前模块并没有包含该模块的导出项,无法把它暴露给下游导入该模块的模块。
- 回到你看到的BrowserModule,Angular 17的源码里它其实是显式导入了CommonModule的,你截图里的内容大概率是被截断了,只展示了exports部分,没显示完整的@NgModule配置。
查看Angular官方源码的BrowserModule定义,完整的@NgModule装饰器配置是这样的:
@NgModule({ declarations: [...COMMON_DECLARATIONS, ...BROWSER_DECLARATIONS], imports: [CommonModule], // 这里明确导入了CommonModule exports: [CommonModule, ...COMMON_DECLARATIONS, ...BROWSER_DECLARATIONS], providers: [...BROWSER_PROVIDERS] }) export class BrowserModule { /* ... */ }
BrowserModule导出CommonModule的目的很明确:让任何导入BrowserModule的模块,都能自动获得CommonModule提供的通用指令(比如*ngIf、*ngFor),不需要再单独导入CommonModule。
如果真的存在模块没导入就导出CommonModule的情况,那这个导出不会生效——下游模块无法通过导入该模块获得CommonModule的功能,因为当前模块本身并没有加载CommonModule的内容。
内容的提问来源于stack exchange,提问作者Sukesh Marla
相关产品推荐
相关产品推荐

