项目性能优化

219 阅读4分钟

1、性能优化的指标和工具

1-1、为什么要进行web性能优化

image.png

image.png

image.png

1-2、性能指标和优化目标

image.png

image.png

image.png

1-3、RAIL测量模型

image.png

image.png image.png

image.png

1-4、使用WebPageTest评估Web网站性能

webPageTest 网址

image.png

1-5、使用LightHouse分析性能

安装

npm install lighthouse

使用

例如: 访问b站网站:

image.png

lighthouse http://www.bilibili.com,自动打开一个空白页面

最终在本地生成一个测试报告:

image.png

找到并打开测试报告分析性能指标:

image.png

image.png

1-6、使用Chrome DevTools分析性能

image.png

1-7、常用的性能测量APIs

image.png

DNS 解析耗时: domainLookupEnd - domainLookupStart
TCP 连接耗时: connectEnd - connectStart
SSL 安全连接耗时: connectEnd - secureConnectionStart
网络请求耗时 (TTFB): responseStart - requestStart
数据传输耗时: responseEnd - responseStart
DOM 解析耗时: domInteractive - responseEnd
资源加载耗时: loadEventStart - domContentLoadedEventEnd
First Byte时间: responseStart - domainLookupStart
白屏时间: responseEnd - fetchStart
首次可交互时间: domInteractive - fetchStart
DOM Ready 时间: domContentLoadEventEnd - fetchStart
页面完全加载时间: loadEventStart - fetchStart
http 头部大小: transferSize - encodedBodySize
重定向次数:performance.navigation.redirectCount
重定向耗时: redirectEnd - redirectStart
// 计算一些关键的性能指标
window.addEventListener('load', (event) => {
    // Time to Interactive
    let timing = performance.getEntriesByType('navigation')[0];
    console.log(timing.domInteractive);
    console.log(timing.fetchStart);
    let diff = timing.domInteractive - timing.fetchStart;
    console.log("TTI: " + diff);
})
// 页面可见性的状态监听
let vEvent = 'visibilitychange';
if (document.webkitHidden != undefined) {
    // webkit prefix detected
    vEvent = 'webkitvisibilitychange';
}

function visibilityChanged() {
    if (document.hidden || document.webkitHidden) {
        console.log("Web page is hidden.")
    } else {
        console.log("Web page is visible.")
    }
}

document.addEventListener(vEvent, visibilityChanged, false);

2、渲染优化

2-1、浏览器渲染原理和关键渲染路径

image.png

image.png

image.png

image.png

image.png

2-2、回流与重绘, 如何避免布局抖动

image.png

image.png

image.png

2-3、使用FastDom

fastdom 可以用来避免布局抖动

image.png

2-4、复合线程与图层

image.png

2-5、避免重绘

2-6、高频事件防抖

2-7、React时间调度实现

3、代码优化

3-1、JS开销和如何缩短解析时间

3-2、配合V8 有效优化代码

3-3、函数优化

3-4、对象优化

3-5、HTML优化

3-6、CSS对性能的影响

4、资源优化

4-1、资源的压缩与合并

4-2、图片格式优化

4-3、图片加载优化

4-4、字体优化

5、构建优化

5-1、webpack的优化配置

image.png

image.png

5-2、webpack的依赖优化

5-3、基于webpack的代码拆分

5-4、手把手教你做webpack的资源压缩

5-5、基于webpack的持久化缓存

5-6、基于webpack的应用大小监测与分析

5-7、React按需加载的实现方式

6、传输加载优化

6-1、启用压缩Gzip

mac 安装 ngnix

安装 homebrew, 官网地址

  1. 安装(可以用 brew 安装)

sudo brew install nginx

  1. 查看 nginx 版本

nginx -v

  1. 启动 nginx

sudo nginx

也可以使用下面的命令启动,但是配置文件nginx.conf修改后用这个命令执行不生效,故不建议使用:

sudo brew services start nginx

image

  1. 查看 nginx 是否启动成功

在浏览器中访问http://localhost:8080,如果出现如下界面,则说明启动成功.

image

备注:端口号是在配置文件 nginx.conf 里面配置的,默认端口是 8080 ,配置文件的位置 /usr/local/etc/nginx

  1. 关闭nginx

sudo nginx -s stop

也可以使用下面的命令启动,但是配置文件nginx.conf修改后用这个命令执行不生效,故不建议使用:

sudo brew services stop nginx

  1. 重新加载nginx

sudo nginx -s reload

  1. 可能遇到的问题

端口被占用

nginx: [emerg] bind() to 0.0.0.0:80 failed (48: Address already in use)

解决方法:修改 nginx.conf 文件里的端口号

权限不够

nginx: [alert] could not open error log file: open() “/usr/local/var/log/nginx/error.log” failed (13: Permission denied)

解决方法:在命令前加上 sudo,这时可能会要求输入密码,密码就是电脑的开机密码啦~

cd /usr/local/cellar/nginx/1.12.1/bin➜ bin sudo brew services start nginxbin chmod a+x ./nginxchmod: Unable to change file mode on ./nginx: Operation not permitted//将nginx文件添加权限➜  bin sudo chmod a+x ./nginx➜  bin sudo ./nginxnginx: [emerg] getgrnam("root") failed in /usr/local/etc/nginx/nginx.conf:2//修改nginx.conf文件,然后重新启动nginx➜  1.12.1 cd bin➜  bin sudo ./nginx➜  bin sudo nginx -s reload➜  bin sudo nginx -s stop

  1. 补充

安装 homebrew ,将以上命令粘贴至terminal,然后回车即可

/usr/bin/ruby -e "$(curl -fsSL raw.githubusercontent.com/Homebrew/in…)"

常用的指令有:

nginx-s reload 重新加载配置nginx-s reopen 重启nginx-s stop 停止nginx-s quit 退出nginx-V 查看版本,以及配置文件地址nginx-v 查看版本nginx-c filename 指定配置文件nginx-h 帮助

image.png

nginx.conf 配置gzip:

gzip  on;

gzip_min_length 1k;

gzip_comp_level 6;

gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/xml text/javascript application/json;

gzip_static on;

gzip_vary on;

gzip_buffers 4 16k;

gzip_http_version 1.1;

6-2、启用Keep Alive

image.png

6-3、HTTP资源缓存

image.png

image.png

6-4、一次性理解Service workers技术,给网站提速

image.png

image.png

6-5、HTTP 2的性能提升

image.png

image.png

6-6、用流行的SSR技术给前端减负

image.png

image.png

image.png

7、前沿优化解决方案

7-1、拯救移动端图标SVG

7-2、使用Flexbox优化布局(上)

7-3、使用Flexbox优化布局(下)

7-4、优化资源加载的顺序

7-5、预渲染页面

7-6、Windowing提高列表性能

7-7、使用骨架组件减少布局移动

8、性能优化问题面试指南

8-1、Web加载&渲染基本原理

8-2、首屏加载优化

8-3、JavaScript 内存管理