面试题答案
一键面试懒加载实现
- 路由配置:
- 使用
loadChildren
语法。例如,在app-routing.module.ts
中配置如下:
const routes: Routes = [ { path: 'feature', loadChildren: () => import('./feature/feature.module').then(m => m.FeatureModule) } ];
- 这里
loadChildren
接收一个返回Observable
或Promise
的函数,该函数使用动态import()
语法来异步加载模块。当用户导航到/feature
路径时,FeatureModule
才会被加载。
- 使用
- 组件延迟加载:除了路由模块懒加载,还可以对组件进行延迟加载。可以通过
ComponentFactoryResolver
来实现动态组件加载,在需要的时候创建并加载组件,从而减少初始加载的内容。
模块拆分策略
-
按功能划分模块:
- 原则:将应用按照不同的功能特性拆分成独立的模块。例如,一个电商应用可以拆分为产品模块(
ProductModule
)、购物车模块(CartModule
)、用户模块(UserModule
)等。 - 好处:每个模块职责明确,便于开发、维护和测试。同时,也有利于实现懒加载,只在需要时加载特定功能模块。
- 原则:将应用按照不同的功能特性拆分成独立的模块。例如,一个电商应用可以拆分为产品模块(
-
核心模块与共享模块:
- 核心模块:创建一个
CoreModule
,将只需要在应用启动时加载一次的服务、组件等放入其中。例如,AppComponent
、全局配置服务等。在app.module.ts
中导入CoreModule
,并且确保只导入一次,防止多次实例化服务。 - 共享模块:创建
SharedModule
,将应用中多个模块可能共享的组件、指令、管道等放入其中。例如,通用的按钮组件、格式化管道等。其他模块通过导入SharedModule
来复用这些内容。
- 核心模块:创建一个
-
路由模块独立:
- 原则:将路由相关的配置独立成模块。例如,
AppRoutingModule
只负责应用的路由配置,这样使得路由管理更加清晰,也便于维护和扩展。 - 配置:在
AppRoutingModule
中定义应用的主路由,各个功能模块也可以有自己独立的路由模块,通过嵌套路由的方式与主路由集成。
- 原则:将路由相关的配置独立成模块。例如,
-
模块粒度控制:
- 避免过大模块:模块不能过于庞大,否则失去了模块拆分和懒加载的意义。如果一个模块包含过多功能,应进一步细分。
- 避免过小模块:也不能拆分得过细,导致模块间依赖关系复杂,增加维护成本。要在功能聚合和依赖管理之间找到平衡。