Closed21
GatsbyJSと挿入する画像の最適化(gatsby-image)
- How to load an image from the filesystem
- How to use Gatsby Image
- How to load a video
- How to load a GIF
- Additional Guides
ファイルを読み込む方法は3つある
-
static
ディレクトリに置く -
webpack
を使ってimport
する -
GraphQL
する
ということで、またGraphQL
するらしい
必要なもの
$ npm install gatsby-transformer-sharp gatsby-plugin-sharp gatsby-image gatsby-source-filesystem
-
gatsby-source-filesystem
: データ源を設定する(インストール済) -
gatsby-image
:GraphQL
とReact component
をいい感じで繋いでくれる(らしい) -
gatsby-plugin-sharp
: 画像の変換を担う(らしい)
画像の最適化を改めて考える
- 大きな画像はリサイズが必要
- スマホ/タブレット用のサイズの画像も複数必要
- 不要なメタデータを削除してJPEG/PNGを最適化
- 画像は
lazy load
させる - 画像をロードするときは
blur-up
テクニックを使う - 画像の場所をキープする(画像がロードされるにしたがってページがスクロールしないように)
ものすごく適当に翻訳したが「画像の最適化」といってもいろいろ大変なことが分かった。
これらはぜひ自動でやってもらいたい。だからGatsby Image
を使う。
gatsby-config.js
に設定を書く
-
gatsby-plugin-sharp
とgastby-transformer-sharp
のプラグインを追加する -
gatsby-source-filesystem
に画像があるディレクトリのパスを追加する
まずgatsby-config.js
を変更することは、チュートリアルをやったので分かる
-
src/assets/images/
に写真を置くことにする -
name: "images"
と名前(なんて呼ぶんだろう)をつけておく
module.exports = {
plugins: [
`gatsby-transformer-sharp`,
`gatsby-plugin-sharp`,
{
resolve: `gatsby-source-filesystem`,
options: {
name: `images`,
path: `${__dirname}/src/assets/images/`,
},
],
}
GraphQL
する
- ページコンポーネントに
GraphQL
クエリを書く -
GraphQL "fragments"
を使う
fragments
は後で戻ってくる
-
src/assets/images/pic01.jpg
をGraphQL
する - とりあえず
GraphiQL
でクエリを作成する -
file > relativePath
の部分でファイル名を指定する(eq
) -
childImageSharp > fluid
を選択、..GatsbyImageSharpFluid
のfragment
を挿入 - HowToガイドには
fragment
は使えないと書いてあるが...GatsbyImageSharpFluid
は使えた
- クエリ
query MyQuery {
file(relativePath: {eq: "pic01.jpg"}) {
childImageSharp {
fluid {
...GatsbyImageSharpFluid
}
}
}
}
- 結果
GraphiQLの結果
{
"data": {
"file": {
"childImageSharp": {
"fluid": {
"base64": "data:image/jpeg;base64,/9j/2w...(適当に省略)...2Q",
"aspectRatio": 1.408450704225352,
"src": "/static/f7...42/6aab9/pic01.jpg",
"srcSet": "/static/f7...42/f836f/pic01.jpg 200w,\n
/static/f7...42/2244e/pic01.jpg 400w,\n
/static/f7...42/6aab9/pic01.jpg 576w",
"sizes": "(max-width: 576px) 100vw, 576px"
}
}
}
},
"extensions": {}
}
gatsby-img
する
-
import Img from "gatsby-image"
する -
Img
を使う
Img
が持ってる属性(props
?)はどのページを調べたらいいんだろう
修正ポイント
- ファイルの先頭で
graphql
とImg
をimport
する - ページコンポーネントの場合、ファイルの末尾にページクエリを書く
- 本文の
img
をImg
に置き換える
import { graphql } from `gatsby`
import Img from `gatsby-image`
const Landing = ({ data }) => (
<Layout>
.... いろいろ書く
<Img fluid={ data.file.childImageSharp.fluid } alt="" />
.... つづきもいろいろ
</Layout>
)
export default Landing
export const query = graphql`
query MyQuery {
file(relativePath: { eq: "pic08.jpg" }) {
childImageSharp {
fluid {
...GatsbyImageSharpFluid
}
}
}
}
`
複数の画像をクエリする
- ファイル名を指定して複数クエリを作成する
- そのままだとエラーがでるので、クエリに
alias
をつける
export const query = graphql`
query MyQuery {
pic08: file(relativePath: { eq: "pic08.jpg" }) {
childImageSharp {
fluid {
...GatsbyImageSharpFluid
}
}
}
pic09: file(relativePath: { eq: "pic09.jpg" }) {
childImageSharp {
fluid {
...GatsbyImageSharpFluid
}
}
}
}
`
ページコンポーネント
-
data.file.
の.file.
をエイリアス名に変更する
<Img fluid={ data.pic08.childImageSharp.fluid } alt="" />
<Img fluid={ data.pic09.childImageSharp.fluid } alt="" />
ここまでで分かってないことのまとめ
-
fragments
の種類と内容 -
Img
で指定可能なprops
Gatsby image props
title
alt
className
fixed
fluid
-
fadeIn
:bool
などなど。
img
タグに対して作用するっぽい。
キャプション(figcaption
)とかは別途指定する必要がありそう
動画を埋め込む方法
- YouTubeなどの外部サービスにアップロードした動画を
iframe
とかで埋め込むのが楽ちん -
gatsby-remark-embed-video
プラグインを使えば.md
ファイルに書ける - 自サイトの動画も表示できる(けど、いまは使わないので必要なときに読み直す)
GIF画像の埋め込み
-
gatsby-image
ではなく直接import
する -
Animated GIFs
はファイルサイズが大きくなるので、サイトパフォーマンスに気をつける -
sensitive to motion
な人に害を与えることもあるので基本的にautoplay
させない
リモートにある画像を埋め込む
gatsby-node.js
を使うみたいで、ちょっと難しそうなので後回しにする
とりあえずできた(と思う)
-
gatsby-plugin-image
が追加されてる気がする -
StaticImage
は便利そう
このスクラップは2021/02/14にクローズされました