画像遅延読み込みにlazysizesを使う

公開日時
更新日時

ここ最近はTailwind CSSやnext/imageを使うことが増え、lazysizesの代わりにimgタグのloading属性を使うことが増えていた。

ただ、ネイティブのloading属性はまだSafariが対応していないこともあり、未対応ブラウザで多数の画像を表示する場合に無駄な画像読み込みが発生してしまう。

そこでlazysizesを使ってSafariでも画像遅延読み込みに対応させることにした。

以前の記事でもlazysizesで画像を遅延読み込みさせるというのを書いたが、改めて導入手順をまとめておく。

以前の記事はソースコードをダウンロードして設置していたが、今回はnpm packageを利用することにした。

yarn add lazysizes

lazyloadオプションを受け取れるImageコンポーネントを作成。

lazyload時は画像読み込みが完了するまでの代替画像として1px x 1pxの透過png画像を読み込ませるようにしておく。

ls.attrchange プラグインはReactやVueを使う場合には必須。(参考

import 'lazysizes'
import 'lazysizes/plugins/attrchange/ls.attrchange'

type Props = {
  path: string
  alt: string
  lazyload?: boolean
}

export const Image = ({ path, alt, lazyload = false }: Props) => {
  const className = lazyload ? 'lazyload' : ''
  const src = lazyload ? "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=" : path

  return (
    <img
      src={src}
      data-src={path}
      alt={alt}
      className={className}
    />
  )
}

これでChromeだけでなくSafariでも画像遅延読み込みができるようになった。

Safariのloading属性対応も早く来てほしいなぁ。

参考


Related #next.js

Next.js使用時にrecoil-persistのStorageを変更する

クライアント側で実行された場合のみstorageを指定するようにした

Next.jsで環境に応じて特定のページを非表示にする

NODE_ENVでredirectsを出し分けた

Next.jsで動的URLをRewriteする

next.config.jsにrewritesを追加

Next.js + typescriptでpathsのエイリアスがModule not foundになる

next.config.jsに追記する必要があった

Next.js + Algoliaで全文検索UIを実装する

react-instantsearchを利用