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