如何优化图片资源
使用 imagemin 来压缩图片
imagemin 是一个图片压缩工具,它提供 CLI 和 npm module 两种使用方式,一般推荐使用 npm module 形式,因为它能提供更多配置选项,也可以嵌入到 webpack
等工具的打包流程中,另外还有一系列配套的插件来处理不同格式的图片文件。
CLI
安装
npm install --global imagemin-cli
使用
imagemin images/* --out-dir=dist
: 将images
文件夹中的所有图片进行压缩并输出到dist
文件夹中。imagemin --help
: 查看所有配置选项。
npm module
安装
npm i -D imagemin
使用
Node script
e.g. 使用
imagemin-mozjpeg
插件来压缩jpeg
图片
打包工具
在 webpack 中使用 imagemin
e.g. webpack.config.js
常用的插件
图片格式 | 有损 | 无损 |
JPEG | ||
PNG | ||
GIF | ||
SVG | ||
WebP |
tips: 如果一个插件提供订制图片质量的配置选项,那它就是一个有损压缩的插件。
用视频替换 GIF
有些 GIF 的体积可能会很大,将它们转换成视频格式可以节省用户带宽。
FFmpeg 是一个音频/视频转换工具,使用方法如下:
安装
使用 npm module,这种方法也需要先安装 FFmpeg。
使用
替换
将 GIF 文件转换成视频之后,还需要在文档中进行替换。
GIF 有三个特点:
自动播放
无限循环
静音
这些都可以通过 video
标签的属性来设置:
还可以通过 <source>
元素来提供 fallback:
提供响应式图片
给不同设备提供不同尺寸的图片,比较常用的两个用来生成不同尺寸图片的工具是 sharp 和 ImageMagick CLI:
sharp
sharp 是一个 npm 包
安装
npm i -D sharp
使用
Node script
ImageMagick CLI
ImageMagick 是一个 CLI 工具
安装
去官网下载安装包。
使用
命令行,不过有平台兼容性问题。
例子 1 convert -resize 33% logo.jpg logo-small.jpg
:将 logo.jpg
转换成原图的三分一大小。
例子 2 convert logo.jpg -resize 300x200 logo-small.jpg
:将图片尺寸调整为 300x200
也可以下载 imagemagick-cli npm 包,然后通过 Node 来调用,这个包解决了操作系统兼容性的问题。
Node script
每张图片应该有多少种尺寸?这个问题没有统一答案,不过比较常见的是 3-5 种。
在文档中设置
将图片转换成不同的尺寸后,还需要在 HTML 中为不同屏幕尺寸指定不同版本的图片,然后浏览器就会根据实际情况来选择加载哪张图片。
src
是为了兼容那些不支持srcset
和sizes
属性的浏览器。logo-small.jpg 480w
表示logo-small.jpg
这张图的宽度是480px
,这样浏览器就不用等把图片下载完后才知道图片的尺寸。注意到图片宽度的单位是px
,但在设置时要写成w
,关于 width descriptor。sizes
属性告诉浏览器图片在页面上显示时的宽度,但是设置这个属性对图片的显示效果并没有影响(我们还是得设置 CSS),这个值只是用来帮助浏览器决定应该加载哪张图片,如果没有这个属性,浏览器就会加载src
属性中指定的图片。sizes
的有效值包括100px
,33vw
,20em
,calc(50vw-10px)
,但是百分比25%
是不合法的。
srcset 和 sizes 属性是配合使用的。
art direction: 在不同大小的屏幕中显示内容不同的图片,而不仅仅是尺寸不同的图片。
使用 WebP 图片
两个常用的将图片转换成 WebP 的工具是:cwebp CLI 工具 和 Imagemin WebP 插件,一般推荐使用 Imagemin WebP 插件,因为可以整合到打包工具中。
cwebp CLI 工具
安装
使用
转换单张图片,使用默认配置:
cwebp images/flower.jpg -o images/flower.webp
转换单张图片,设置 quality 为 50:
cwebp -q 50 images/flower.jpg -o images/flower.webp
转换指定文件夹中的所有图片:
for file in images/*; do cwebp "$file" -o "${file%.*}.webp"; done
Imagemin WebP 插件
安装
npm install imagemin-webp
使用
Node script:
打包工具
浏览器兼容
如果需要兼容不支持 WebP 的浏览器的话,还需要提供 fallback 文件。
<picture>
中可以指定多个<source>
,按优先级排列。<img>
是为了兼容不支持<picture>
标签的浏览器。
使用 CDN
Last updated