通过服务端 request
参数判断
以 expressjs
为例
routes.get('/', function (req, res) {
// or req.accepts('image/webp')
const webpAccept = req.headers.accept.indexOf('image/webp') > -1
res.locals.webpAccept = webpAccept
res.render('index')
})
如果控制不了服务端,可以通过客户端异步判断
function isWebpSupport() {
return new Promise(resolve => {
const webp = new window.Image()
webp.addEventListener('load', () => {
resolve(true)
})
webp.addEventListener('error', () => {
resolve(false)
})
// 下面这段字符串可以通过canvas.toDataUrl('image/webp')的方式获取
webp.src =
'data:image/webp;base64,UklGRjIAAABXRUJQVlA4ICYAAACyAgCdASoBAAEALmk0mk0iIiIiIgBoSygABc6zbAAA/v56QAAAAA=='
})
}
if (!('webpAccept' in window)) {
isWebpSupport().then(function (webpAccept) {
window.webpAccept = webpAccept
})
}
但是
浏览器支持 webp 不代表 canvas 可以转成 webp 格式的 base64 字符串!
const canvas = document.createElement('canvas')
canvas.width = 1
canvas.height = 1
const dataUrl = canvas.toDataURL('image/webp')
// 不支持 canvas 转 webp 的浏览器(safari/firefox),会生成 png 格式的 base64 字符串
console.log(dataUrl.indexOf('data:image/webp;base64,') === 0)