Vueカスタムコマンドは阿里雲OSSを組み合わせて画像を最適化する実現方法です。
画像は往々にしてローディングフロントエンドプロジェクトの中で主要な部分を占めていますが、写真の品質を損なわず、ローディングスピードもアップしますか?は、ディスプレイデバイスのpixelRatioおよび要素の幅の高さに応じて、適切なピクチャを表示する 。画像の品質を少し圧縮する はwebp を使用する。
グローバルカスタムコマンドを登録
グローバルカスタムコマンドを登録
Vue.directive('img-condense', {
bind: (el, binding, vnode) => {
let src = el.getAttribute('src')
let newSrc = compressImg(src, el)
el.setAttribute('src', newSrc)
}
})
要素の幅の高さと表示デバイスのpixelRatioを取得します。
let compressImg = (imgUrl, el) => {
// pixelRatio
let pixelRatio = window.devicePixelRatio
let elWidth = elStyle.width * pixelRatio
let elHeight = elStyle.height * pixelRatio
let resize = '/resize'
if (elWidth) {
resize += `,w_${elWidth}`
}
if (elHeight) {
resize += `,h_${elHeight}`
}
})
判断webp
let canUseWebp = document.createElement('canvas').toDataURL('image/webp').indexOf('data:image/webp') == 0
let webp = ''
if (canUseWebp) {
webp = '/format,webp'
}
品質が80%まで下がる
let ossParam?x-oss-process=image${resize}/auto-orient,1/quality,Q_80/bright,-1${webp}
完全版
<img v-img-condense alt="Vue logo" src="../assets/logo.png">
Vue.directive('img-condense', {
bind: (el, binding, vnode) => {
let src = el.getAttribute('src')
let newSrc = compressImg(src, el)
el.setAttribute('src', newSrc)
}
})
let compressImg = (imgUrl, el) => {
// oss
if (imgUrl.includes('aliyuncs.com') || imgUrl.indexOf('blob') === 0 || imgUrl.includes('x-oss-process=')){
return imgUrl
}
// pixelRatio
let pixelRatio = window.devicePixelRatio
let elWidth = el.width * pixelRatio
let elHeight = el.height * pixelRatio
let resize = '/resize'
if (elWidth) {
resize += `,w_${elWidth}`
}
if (elHeight) {
resize += `,h_${elHeight}`
}
if (!elWidth && !elHeight) {
resize = ''
}
// webp
let canUseWebp = document.createElement('canvas').toDataURL('image/webp').indexOf('data:image/webp') == 0
let webp = ''
if (canUseWebp) {
webp = '/format,webp'
}
return `${imgUrl}?x-oss-process=image${resize}/auto-orient,1/quality,Q_80/bright,-1${webp}`
}
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。