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}`
    }
    
    以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。