react-router在app应用中的问题

130 阅读2分钟

开发路径惯性,项目一开始就react-router v6. 并给每个路由组件lazy优化,这时一切正常. 但碰到一些路由组件消耗比较大的时候有几个问题

  1. react router每次切换组件的时候都是卸载组件而不是css隐藏. 所以每次切换页面的时候,有一个组件渲染比较消耗, 每次路由匹配到这个组件 都需要重新渲染,内部状态无法保存. 了解了一些常规的 route缓存技术,但 npm下载量都不是很高
  2. suspen fallback 对路由的处理问题. 我的路由组件fallback统一封装是一个loading加载模态图. 每次切换页面都展示loading,体验不是很好. 会造成页面闪烁,特别是ToC场景中体验很差

react router 为什么每次切换组件的时候是卸载未匹配的组件而不是css隐藏

  1. 内存管理.卸载组件可以释放相关资源,减少内存占用. 如何一直保持组件不卸载可能会出现内存泄露问题
  2. 性能优化. 卸载不需要的组件可以提高性能
  3. 符合react的设计思想

总而言之,言而总之. react-router这么做就是为了优化性能,但降低了用户体验. 实际产品中我们更希望的是react-router可以缓存路由, 其次对于长时间不使用的路由缓存进行卸载, 不要让页面内存过高

重新审视了一下整个项目,发现我们每个页面都需要缓存,就感觉没必要用react-router了.只是给内部组件第一次加载进行了lazy优化.然后丢到LRU缓存里面 ,超过5min不使用即清理掉

切换组件可以用隐藏来设置

  1. 使用状态控制显示和隐藏 父组件维护这个状态
  2. 条件渲染 boolean &&
  3. 样式控制 css display none

目前我们项目就是这样控制组件

github.com/remix-run/r… juejin.cn/post/735864…