image.png

首页加载慢总结

image.png

首页加载-图片过多

总结

image.png

懒加载

原理

image.png

小图标 iconfont

font-family属性
image.png

小图片雪碧图(精灵图)

  1. background:url()
  2. background-position

image.png

首页加载-资源和请求量

总结

image.png

Network 查看请求量

image.png
image.png

converge 查看代码使用情况

image.png
image.png
image.png

解决方案

合并静态资源->减少资源请求量

将多个JavaScript cs合并成一个
image.png

按需加载 | SPA应用 - 路由懒加载 ->减少资源请求量

减少首页JS/css的大小
image.png

首页加载-请求资源(js/css…)过大

总结

image.png

优化图片

总结

image.png

图片压缩

利用熊猫站无损压缩图片

熊猫站无损 压缩图片原理

image.png
image.png

熊猫站批量压缩

熊猫站提供了包可安装
npm install tinify

base64

base64写在代码里减少请求,但同时会增大体积所有大图不适合转64
image.png

url-loader图片策略配置

小图转base64,大图不转

webp格式图片

https://www.upyun.com/webp
image.png
image.png

webpack打包优化

总结

image.png

配置webpack打包

webpack在production环境下默认配置了
image.png

  1. module.exports = {
  2. // 模式
  3. mode: 'production',
  4. }

拆包后文件多是否矛盾?

image.png

打包策略

包分类

image.png

webpack打包分类配置

打包策略

image.png

webpack配置 commons是公共包

image.png

打包效果

image.png

查看打包后资源占用情况

  1. npm install --save-dev webpack-bundle-analyzer
  2. 配置

    1. const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
    2. module.exports = {
    3. configureWebpack: {//自定义webpack配置
    4. plugins: [
    5. new BundleAnalyzerPlugin()
    6. ]
    7. },
    8. }
  3. npm run build

image.png

结合网络缓存做优化

image.png

首页加载-CDN加速静态资源下载

CDN是一种解决方案,用Nginx服务器实现的。

总结

image.png

加速原理1

CDN服务器有多个节点可以选择离你最近的服务器,下载静态资源达到加速
image.png

加速原理2

http请求限制并发,通过CDN可以实现不同文件通过不同域名 端口请求,达到增加并发 一次性请求多个资源
image.png

运行阶段-DOM操作-十万条数据渲染

总结

image.png

操作dom卡顿原因

image.png

逐帧渲染实现加速

image.png

  1. const total = 100000;
  2. let ul = document.querySelector('ul');
  3. //一次渲染一屏幕的量
  4. const once = 20;
  5. //全部渲染完需要次数
  6. const loopCount = total / once;
  7. //已经渲染次数
  8. let countHasRender = 0;
  9. //一次值渲染20
  10. function add() {
  11. //创建一个虚拟节点,不会触发渲染
  12. const fragment = document.createDocumentFragment();
  13. //循环20
  14. for (let i = 0; i < once; i++) {
  15. const li = document.createElement('li');
  16. li.innerText = Math.floor(Math.random() * total);
  17. fragment.appendChild(li);
  18. }
  19. ul.appendChild(fragment);
  20. //渲染次数+1
  21. countHasRender += 1;
  22. loop();
  23. }
  24. function loop() {
  25. if (countHasRender < loopCount) { //loopCount:5000
  26. //requestAnimationFrame逐帧渲染
  27. //类似 setTimeout(add,16)
  28. //帧:一秒钟不放多少涨图片 越多越精细
  29. //1000/60=16 一秒钟/人体适应xx=60得出16
  30. window.requestAnimationFrame(add)
  31. }
  32. }
  33. loop();