跳到主要内容

README

看你做了挺多项目,有没有在架构层面上考虑过对项目的优化

虽然做了很多项目,但很多都是搭好的框架,所以这方面经验还比较少,但自己下来有考虑过一些优化方案,主要是基于webpack的,我来优化的话首先就是从打包开始优化,因为这个是项目的根据把

打包

  • 把公共代码提取出来
  • 压缩css和js
  • 抽离css和js
  • 包大小分析工具
  • 按需加载 - babel-plugin-import
  • 动态加载 - import() 可以结合路由来进行动态加载
  • 配置删除生产环境的console.log
  • 开启Tree shaking 当引入一个模块时,不引入所有的代码,只引入需要的代码
  • 可以把一些一些第三方库React才分出来放到CDN,提升速度

环境支持

  • 比如添加babel-polyfill来让ES6语法得到更多的环境支持
  • plugin-proposal-decorators可以使用修饰器来connect
  • less让css变得好写
  • 比如现在有postcss的话就可以极大的提升适配性

提深打包效率

  • alias可以加快webpack查找模块的速度。
  • happypack并发打包
  • 使用动态链接库文件DLL,不用每次都打包第三方库
  • babel缓存 不重复编译

代码层面

  • 添加首屏渲染时的loading,或者可以添加加载中的骨架
  • 预加载 - preload 提前加载某些重要资源到时候直接就可以使用
  • 预判加载 - prefetch 在浏览器空闲的时候预判下一个页面需要什么先做了
  • 懒加载 - React.lazy包装一个组件 延迟加载不是立即需要的组件,Suspense的callback显示loading(或者使用社区提供的react-loadable)
  • 使用不可变数据优化state 如immer immutable
  • React.memo和pureComponent浅比较props和state
  • 使用useMemo缓存大量的计算
  • 优化高频事件:函数节流,函数防抖。
  • 避免无用的多层嵌套
  • 避免滥用context
  • 长列表优化,添加虚拟滚动
  • 避免 JavaScript 运行时间过长阻塞渲染,可以启用requestIdleCallback
  • 费事的JS可以放到其他线程。在浏览器中启用并行线程可以使用 Web Worker 中

网络层面

  • 小图标以base64打包嵌入页面减少请求数量
  • 设置好一些常用资源的缓存时间来,尽量命中强缓存和协商缓存
  • 可以采用CDN来减小资源的传播时延(主要受距离影响)
  • 可以开启g-zip压缩减少包的大小
  • http1.1的同一个域名并行TCP最多6个,如果存在大量资源可以考虑拆分域名
  • 使用 Http2.0
  • BFF 非常合适做的一件事就是后端服务的聚合。业务聚合,把要访问几个接口通过BFF变成请求一个接口

HTML与浏览器层面

  • 避免多次重绘和回流
  • 合理使用 defer 和 async 来加载资源,避免阻塞DOM加载
  • 对于动画效果的实现,避免使用 setTimeout 或 setInterval,请使用 requestAnimationFrame。
  • 择适当的图像类型以及大小减少下载时间
    • 使用CSS3、SVG、IconFont代替图像
    • 使用字体图标 iconfont 代替图片图标
  • CSS写在头部,JS写在尾部并异步
  • 使用事件委托

避免代码问题

  • async await 的不当使用导致并行请求被串行化了;
  • 频繁地 JSON.parse 和 JSON.stringify 大对象;
  • 正则表达式的灾难性回溯;
  • 闭包导致的内存泄漏;
  • CPU 密集型任务导致事件循环 delay 严重;
  • 未捕获的异常导致进程频繁退出,守护进程(pm2/supervisor)又将进程重启,这种频繁的启停也会比较消耗资源;