面试题答案
一键面试性能瓶颈点分析
- 路由配置复杂度:大量路由配置会增加初始化解析时间。例如,嵌套路由层次过深,每个路由都有复杂的参数配置、重定向规则等,使得Angular在启动时需要花费更多时间构建路由映射表。
- 组件加载时机不当:懒加载组件如果配置不合理,可能会在不必要的时候加载。比如,某些组件只有在特定条件下才会用到,但初始加载时就被加载进来,增加了初始加载的体积。
- 不必要的组件重渲染:当路由变化时,一些与路由参数无关的组件可能会因为所在模块或父组件的变化而重渲染。例如,一个展示全局信息的组件,仅因为路由变化导致父模块重新初始化而重新渲染。
- 与服务器端交互频繁:每次路由切换都可能触发与服务器端的交互,如获取用户权限、加载特定数据等。如果没有合理缓存,大量的重复请求会导致性能问题。
优化策略
- 路由配置优化
- 扁平路由结构:尽量减少路由嵌套层次,将部分深层嵌套路由转换为扁平结构,通过参数传递来处理不同状态。例如,原本
/parent/child/:id
这种嵌套路由,可改为/parent/:id/child
,简化路由解析过程。 - 预加载策略调整:对于一些常用但不紧急的懒加载模块,使用
PreloadAllModules
策略,在应用初始化时就开始预加载。而对于特定条件下才使用的模块,设置loadChildren
函数,按需加载。例如,管理后台中,统计报表模块只有特定权限用户才会用到,可设置为按需加载。
- 扁平路由结构:尽量减少路由嵌套层次,将部分深层嵌套路由转换为扁平结构,通过参数传递来处理不同状态。例如,原本
- 组件加载策略调整
- 延迟加载:对于非关键组件,特别是在页面初始化时不需要立即显示的组件,采用延迟加载。例如,页面底部的广告组件,可在页面滚动到一定位置时再加载。
- 使用
OnPush
策略:对于数据来源稳定,不需要频繁检测变化的组件,设置ChangeDetectionStrategy.OnPush
。这样只有当输入属性引用变化或触发事件时才会检测变化,减少不必要的重渲染。比如,展示用户头像的组件,只要用户信息不变,就不需要重新渲染。
- 与服务器端交互的优化
- 数据缓存:在客户端缓存从服务器获取的数据,当路由切换需要相同数据时,先从缓存中读取。可以使用
localStorage
或应用内的内存缓存。例如,用户权限信息在登录后缓存起来,每次路由切换检查权限时,优先从缓存读取。 - 合并请求:如果多个路由切换需要获取的数据来自同一个服务器接口,将这些请求合并。比如,一个页面展示用户基本信息、订单统计等多个模块,原本每个模块都单独请求数据,可合并为一个请求获取所有数据。
- 数据缓存:在客户端缓存从服务器获取的数据,当路由切换需要相同数据时,先从缓存中读取。可以使用
实际项目经验说明
在一个电商后台管理系统项目中,有大量的功能模块,每个模块都有对应的路由。起初,路由配置采用了多层嵌套,导致应用启动缓慢。通过将部分嵌套路由扁平处理,启动时间明显缩短。同时,一些不常用的功能模块(如促销活动设置模块,只有在特定时间才会用到)从初始加载改为按需加载,优化了页面加载性能。对于展示商品列表的组件,设置ChangeDetectionStrategy.OnPush
,只有在商品数据发生变化时才重新渲染,避免了因路由切换等无关操作导致的重渲染。在与服务器交互方面,将用户登录信息、权限信息等缓存起来,减少了每次路由切换时权限验证的服务器请求次数,大大提高了系统的响应速度。