Web/13-前端面试/02-性能优化/前端性能优化(一):静态资源优化.md
2020-12-15 21:34:51 +08:00

264 lines
8.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 图片格式和应用场景
### JPEG 格式
JPEGJoint Photographic Experts Group是一种针对彩色照片而广泛使用的有损压缩图形格式属于位图
常用文件扩展名为`.jpg`也有 `.jpeg``.jpe`JPEG 在互联网上常被应用于存储和传输照片
- 适合颜色丰富的照片彩色图大焦点图通栏 banner 结构不规则的图形
- 不适合线条图形和文字图标图形因为它的压缩算法不太这些类型的图形并且不支持透明度
### PNG 格式
PNGPortable Network Graphics是一种无损压缩的位图图形格式支持索引灰度RGB 三种颜色方案以及 Alpha 通道等特性
PNG 最初是作为替代 GIF 来设计的能够显示 256 文件比 JPEG 或者 GIF 但是 PNG 非常好的保留了图像质量支持 Alpha 通道的半透明和透明特性最高支持 24 位彩色图像PNG-24 8 位灰度图像PNG-8
- 适合纯色**透明**线条绘图图标边缘清晰有大块相同颜色区域需要带**半透明**的图片
- 适合由于是无损存储所以不太适合体积太大的彩色图像
比如说如果你需要带透明背景的图片此时就可以用 png 格式的图
### GIF 格式
GIFGraphics Interchange Format是一种位图图形格式 8 位色 256 种颜色重现真彩色的图像采用 LZW 压缩算法进行编码
支持 256 仅支持完全透明和完全不透明如果需要带动画效果的图片GIF 是比较通用的选择
- 适合动画图标
- 不适合每个像素只有 8 比特不适合存储彩色图片
### Webp 格式
Webp 是一种现代图像格式可为图像提供无损压缩和有损压缩这使得它非常灵活 Google 在购买 On2 Technologies 后发展出来 BSD 授权条款发布
Webp的优秀算法能同时保证图像质量和较小体积可以插入多帧实现动画效果可以设置透明度采用 8 位压缩算法
无损的 Webp PNG 26%有损的 Webp JPEG 25-34 GIF 有更好的动画
- 适合适用于图形和半透明图像
### 总结
- banner图大图可以用 jpgwebp格式
- 图标带透明背景的图可以用 png 格式
- 带动画效果的图可以用 gif 格式
## 图片优化的常见方法
### 1用工具压缩图片
**压缩 PNG 图片**
- 工具[node-pngquant-native](https://www.npmjs.com/package/node-pngquant-native)
- 介绍跨平台压缩比特别高压缩png24非常好
安装方法
```
npm install node-pngquant-native
```
**压缩 JPEG 图片**
- 工具[jpegtran](https://www.npmjs.com/package/jpegtran)
- 官网<https://www.npmjs.com/package/jpegtran>
- 介绍跨平台但压缩的比率只有80-90%
安装方法
```bash
npm install g jpegtran
```
使用方法
```bash
jpegtran -copy none -optimize -outfile output_file.jpg input_file.jpg
```
**压缩 GIF **
- 工具Gifsicle
- 官网含安装方法<https://www.lcdf.org/gifsicle/>
- 介绍Gifsicle 通过改变每帧比例减小 gif文件大小同时可以使用透明来达到更小的文件大小是目前公认的最好的解决方案
使用方法
```bash
# 压缩命令。注意这里是将压缩级别设置为3。如果将压缩级别设置为1或者2则基本不压缩。
gifsicle --optimize=3 -o out_file.gif in_file.gif
# 裁掉透明部分
gifsicle --optimize=3 --crop-transparency -o out_file.gif in_file.gif
```
### 2将图片尺寸跟随网络环境进行变化
**具体方案**不同网络环境Wifi/4G/3G加载不同尺寸和像素的图片通过在图片 URL 中添加参数来改变
图片 url 举例1图片的原始url链接
```
https://img12.360buyimg.com/img/s3866x3866_jfs/t1/149913/14/18648/719436/5fd8b9b5Eb697b825/7c23f3028aff8e2b.jpg
```
图片 url 举例2通过图片的url参数将这张图的尺寸设置为200px
```
https://img12.360buyimg.com/img/s200x200_jfs/t1/149913/14/18648/719436/5fd8b9b5Eb697b825/7c23f3028aff8e2b.jpg
```
### 3响应式图片
**方法1**通过 JavaScript 绑定事件检测窗口大小以此设置图片大小
**方法2**CSS媒体查询
代码举例 640px的窗口大小里设置图片的尺寸为640px
```css
@media screen and (max-width:640px) {
my_image{
width:640px;
}
}
```
**方法3**img标签的 `srcset` 属性这个是 H5的新特性
代码举例
```html
<img srcset="img-320w.jpg, img-640w.jpg 2x, img-960w.jpg 3x" src=“img-960w.jpg”
alt=“img”> x 描述符:表示图像的设备像素)
```
### 4逐步加载图像lazyloadLQIPLQIP
**方法1**使用统一占位符俗称图片的`懒加载lazyload`
**方法2**使用 **LQIP** 的图片加载方式也就是说在大图没有完全加载出来的情况下先这张图对应的的低质量图片进行占位
LQIPLow Quality Image Placeholders低质量图像占位符这种技术背后的想法是在网络环境较差的情况下你可以尽快向用户展示完全可用的网页为他们提供更好的体验即使在更好的网络连接上这仍然为用户提供了更快的可用页面并且改善了体验
- 安装 LQIP 工具`npm install lqip`
- GitHub源码https://github.com/zouhir/lqip-loader
代码举例将目标图片转换为 LQIP 形式的图
```js
const lqip = require('lqip');
//文件路径
const file = './in.png';
//将输入的图片转为base64
lqip.base64(file).then(res => {
// 色值
console.log(res);
});
lqip.palette(file).then(res => {
//这里输出的是base64的图片地址
console.log(res);
});
```
另外我们还可以使用 **SQIP** 的图片加载方式
SQIPSVG Quality Image Placeholders SVG 格式的图像占位符
- 安装 SQIP 工具`npm install sqip`
- GitHub 源码<https://github.com/axe312ger/sqip>
代码举例将目标图片转换为 SQIP 形式的图
```js
const sqip = require('sqip');
const result = sqip({
filename: './input_file.png',
numberOfPrimitives: 10 //可根据不同应用场景设置大小
});
console.log(result.final_svg);
```
### 5雪碧图Image spriting
雪碧图是比较常见的图片优化方式也就是把多张小图合并成一张大图这样的话就只需做一次网络请求减少图片的 http 请求次数
读者们可以自行查阅
### 6有些场景下并不需要图片文件
有些场景下并不需要图片我们可以用其他的方式来代替图片
举例
- Web Font 代替图片
- 使用 Data URI 代替图片base64就是属于 Data URI的方式
## 图片服务器自动优化
### 概念
图片服务器自动化优化是可以在图片 URL 链接上增加不同特殊参数服务器自动化生成通过这些参数可以设置图片的不同格式大小质量
### 常见处理方式
- 图片裁剪按长边短边填充拉伸等缩放
- 图片格式转换支持 JPGGIFPNGWebP 支持不同的图片压缩率
- 图片处理添加图片水印高斯模糊重心处理裁剪边框等
- AI 能力鉴黄涉政智能抠图智能排版智能配色智能合成等 AI 功能
### 图片举例
原始图片链接
```
https://img12.360buyimg.com/img/s3866x3866_jfs/t1/149913/14/18648/719436/5fd8b9b5Eb697b825/7c23f3028aff8e2b.jpg
```
将图片压缩为 200*150
```
https://img12.360buyimg.com/img/s200x200_jfs/t1/149913/14/18648/719436/5fd8b9b5Eb697b825/7c23f3028aff8e2b.jpg
```
将图片转换为 webp 格式
```
https://img12.360buyimg.com/img/s200x200_jfs/t1/149913/14/18648/719436/5fd8b9b5Eb697b825/7c23f3028aff8e2b.webp
```
将图片质量压缩至10%
```
https://img12.360buyimg.com/img/s3866x3866_jfs/t1/149913/14/18648/719436/5fd8b9b5Eb697b825/7c23f3028aff8e2b.jpg.q10
```