性能优化
https://mp.weixin.qq.com/s/flG20iXajAyZh3NdOkEK6Q
https://mp.weixin.qq.com/s/jmqcmGOerzhz3MS-oW0mqw
dns-prefetch
preconnect
preload / prefetch
HTTP 压缩
一般来讲是要在服务端处理的,可通过在响应头中设置 Content-encoding: gzip
Webpack 压缩
CompressionPlugin
HtmlWebpackPlugin
minify字段配置压缩
可以在 vue 项目下执行 vue inspect --mode production > webpack.config.js 来查看脚手架的默认 webpack 配置内容,比如:
SplitChunksPlugin
MiniCssExtractPlugin
ImageMinimizerWebpackPlugin
Tree Shaking
- 尽量使用
ES6模块语法,即import和export - 保证没有 编译器(如:
babel)将对应的ES6模块语法转换为CommonJS的语法(如:@babel/preset-env的默认行为) - 可在项目的
package.json文件中添加"**sideEffects**"属性,标识当前内容是否存在副作用操作 - 可在通过
/\*#__PURE__\*/注释,将函数调用标记为无副作用
减少不必要的 cookie
不必要的 cookie 来回传输会造成带宽浪费:
- 减少
cookie存储的内容 - 对于静态资源采用
CDN托管(即非同域),不同域名默认不携带cookie
- 减少
CDN 托管静态资源 + HTTP 缓存
协议升级为 Http2.0
http2.0
针对 TCP 连接数 被限制的问题,
http2.0采用 多路复用 一个域名只对应一个TCP连接针对 http 队头阻塞 问题,
http2.0中通过二进制分帧层为每个 请求/响应 添加stream id保证 请求/响应 一一对应,即不必等待前面的请求处理完成,并且还可以为每个请求添加 优先级针对
header数据大的问题,http2.0中传输的header帧经过处理后会用 二进制 的方式表示,替换了原本的 文本格式,并使用HPACK算法进行压缩- 接收/发送 两端会维护一个 索引表,通过下标来标识
header,针对后续重复的header信息就可以用对应的索引来代替
- 接收/发送 两端会维护一个 索引表,通过下标来标识
针对传统的 请求 —> 响应 模式,
http2.0中提供了 服务端推送 的能力,让服务端能够主动向客户端推送关键资源,加快资源加载
浏览器渲染 HTML 文件的核心过程:
HTML 解释器:将
HTML文档经过词法分析输出DOM TreeCSS 解释器:解析
CSS文档,生成样式规则CSSOM样式计算:将
DOM Tree和CSSOM合并生成Render Tree布局计算:计算
Render Tree节点在页面中的坐标位置,创建Layout Tree划分图层:页面中有很多复杂的效果,如一些复杂的
3D变换、页面滚动,或使用z-index做z轴排序等,为了更加方便地实现这些效果,渲染引擎还需要为特定的节点生成专用的图层,生成对应的图层树Layer Tree图层绘制:
- 染引擎实现图层的绘制时,会把一个图层的绘制拆分成很多小的 绘制指令,并将这些指令按照顺序组成一个 待绘制列表
- 当图层的绘制列表准备好后,主线程 会把 待绘制列表 提交(
commit)给 合成线程
栅格化 raster:
- 由于视口有限,用户只能看到页面的很小一部分,没必要绘制出所有图层内容,因此 合成线程 会将 图层(layer) 划分为 图块(tile)
- 渲染进程 把 生成图块的指令 发送给
GPU并执行生成图块的 位图
合成和显示:
- 一旦所有图块都被光栅化,合成线程 就会生成一个绘制图块的命令 ——
DrawQuad,然后将该命令提交给 浏览器进程 - 浏览器进程 里面有一个 viz 组件,会根据
DrawQuad命令,将其页面内容绘制到内存中,最后再将内存显示在屏幕上
- 一旦所有图块都被光栅化,合成线程 就会生成一个绘制图块的命令 ——
xxxsjan Docs