webp的几个问题
1. 什么是webp?
最直接的便是一个图片的后缀是.webp
而不是.png/.jpeg
等,官方的说法便是由Google开发的一种用于图画紧缩的现代格局,目的便是减小图片的大小从而进步网页加载速;
2. 是不是所有浏览器都支撑webp图片?如何判别浏览器是否支撑webp格局的图片
不是所有的浏览器都支撑 WebP 图片格局,但大多数干流的现代浏览器都已经支撑了。以下是一些常见的浏览器对 WebP 格局的支撑情况:
- Google Chrome:支撑 WebP 格局。
- Mozilla Firefox:支撑 WebP 格局。
- Microsoft Edge:支撑 WebP 格局。
- Safari:从 Safari 14 开端,支撑 WebP 格局 要判别浏览器是否支撑 WebP 格局的图片,能够运用 JavaScript 进行检测。以下是一种常用的办法:
function isWebPSupported() {
var elem = document.createElement('canvas');
if (!!(elem.getContext && elem.getContext('2d'))) {
// canvas 支撑
return elem.toDataURL('image/webp').indexOf('data:image/webp') === 0;
}
// canvas 不支撑
return false;
}
if (isWebPSupported()) {
console.log('浏览器支撑 WebP 格局');
} else {
console.log('浏览器不支撑 WebP 格局');
}
上述代码经过创立一个 canvas 元素,并尝试将其转化为 WebP 格局的图片。假如浏览器支撑 WebP 格局,则会回来一个以 “data:image/webp” 开头的数据 URL。
经过这种方式,你能够在网页中运用 JavaScript 检测浏览器是否支撑 WebP 格局,并根据需要供给恰当的代替图片
3. 图片转化成webp之后一定会比之前的图片更小吗?
答案是否定的。一般来说,具有很多细节、色彩改变和复杂结构的图画或许会在转化为 WebP 格局后取得更好的紧缩作用,反之有些转化后或许会比之前更大;所以最好是图片转化为 WebP 格局之前,主张进行测验和比较不同紧缩参数和质量等级的成果,以找到最佳的紧缩设置,对最终转化后变成更大的主张不做转化
4. 如何将图片转化成webp
- 图画编辑软件 如 Adobe Photoshop、GIMP 或在线工具,如 Google 的 WebP 编码器。这些工具能够让你将现有的图画转化为 WebP 格局,并挑选紧缩质量和紧缩类型(有损或无损)
- 插件转化webp插件文档链接接入
5. 项目中如何接入??
思路:
- 第一步肯定是转化将项目中的存储的图片文件经过插件转化出webp格局的图片
- 判别网页运转的浏览器是否支撑webp格局的图片,假如支撑,将项目中所有运用png/jpeg的图片的全部替换成webp
6. 转化出项目中图片的webp格局的图片
const imagemin = require("imagemin");
const imageminWebp = require("imagemin-webp");
function transformToWebp(destination, filePaths) {
await imagemin([filePath || `${destination}/*.{jpg,png}`], {
destination: `${destination}/webp/`, // 转化出的webp图片放置在什么目录
plugins: [imageminWebp({quality: 75})] // 运用imageminWebp转化转化质量等级设置多少
})
}
详细到项目中,咱们只希望转化咱们当时正在开发的文件夹中的图片,并且已经转化的未作修正的就不要再重复转化; 如何知道哪些是新增的或者修正的呢? 想一想️,是不是“git status”能够看到 所以开端做如下调整
// 获取git库房中产生改变的文件列表
function getGitStatusChangedImgFiles() {
return String(execSync('git status -s'))
.split('\n')
.map(item => item.split(' ').pop()
.filter(path => path.match(/\.(jpg)|(png)/))
);
};
回来一个包括改变图片文件路径的数组[‘src/example/image/a.png’,’src/example/image/b.png’, ‘……’]
const imgPaths = getGitStatusChangedImgFiles()
async function transformAllChangedImgToWebp() {
const resData = await promise.all(
imgPaths.map(path => {
const imgDir = path.replace(/([^\\/]+)\.([^\\/]+)/i, "") // src/banners/guardian_8/img/95_copy.png => src/banners/guardian_8/img/
return transformToWebp(imgDir, path)
})
)
const allDestinationPaths = resData.map((subArr) => subArr[0].destinationPath)
// 假如这里咱们想将生成的webp图片主动的add上去,那么就这样:
execSync(`git add ${allDestinationPaths.join(" ")}`);
}
什么时分转化成webp最好?
咱们在commit的时分进行转化图片,以及主动将转化的图片进行提交 这样咱们就能够运用git的钩子函数处理了;
npm install husky --save-dev
// .husky/pre-commit中
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
current_branch=`git rev-parse --abbrev-ref HEAD`
if [[ $current_branch === 'main']]; then
# 生成 webp 图片
npm run webp -- commit
fi
这样在咱们commit时就会主动触发pre-commit钩子函数,在package.json中配置webp履行的脚步,履行上述transformAllChangedImgToWebp
函数,然后在里边转化出webp图片并将新生成的webp主动git add
上去,最后同时commit
;
知识点
1. execSync是什么?
execSync
是一个 Node.js 内置模块child_process
中的办法,用于同步履行外部指令。在 Node.js 中,child_process
模块供给了一组用于创立子进程的函数,其间包括execSync
办法。execSync
办法用于履行指定的指令,并等候指令履行完成后回来成果。
const { execSync } = require('child_process'); const output = execSync(command, options);
2. git status -s
会显示每个文件的状况信息
-
A
:新增文件 -
M
:修正文件 -
D
:删去文件 -
R
:文件名修正 -
C
:文件的复制 -
U
:未知状况
3. execSync(‘git status -s’)回来值是什么?
经过String后就能够变成可见的字符串了,然后经过分割等就能拿到详细的修正的文件路径
4. Husky是什么?
Husky 是一个用于在 Git 提交过程中履行脚本的工具。它能够帮助开发人员在代码提交前或提交后履行一些自定义的脚本,例如代码格局化、代码质量检查、单元测验等。Husky 能够保证团队成员在提交代码之前遵循一致的标准和约好。
Husky 的作业原理是经过在 Git 钩子(Git hooks)中注册脚本来完成的。Git 钩子是在特定的 Git 事件产生时履行的脚本,例如在提交代码前履行pre-commit
钩子,或在提交代码后履行post-commit
钩子。push代码前履行pre-push
的钩子、编写提交信息时履行commit-msg
的钩子可用于提交什么标准
小结
- 经过
execSync('git status -s')
从中获取筛选当时新增/修正过的图片; - 调用
imagemin和imagemin-webp
将图片转化出webp格局的图片
- 在
husky的pre-commit中触发上述调用履行
,并在里边顺道将新生成的webp同时add上去 - 至于后续生成的webp图片怎样运用,这将鄙人一篇文章中学习