私はgatsby-imageを使用して、さまざまな画像サイズを自動的に処理しています。それは素晴らしい働きをします。
ただし、gatsby-imageの docs では、graphqlでimageSharp
を使用してさまざまな画像サイズを取得する例と、childImageSharp
を使用する例があります。 2つの違いは何ですか?
どちらかと関係があると思いますgatsby-transformer-sharp
またはgatsby-plugin-sharp
、しかしそれらのプラグインのドキュメントにはそれに関する情報もありません。
この質問が出されて久しぶりですが、「imageSharpとchildImageSharpの違いは何ですか」という質問に直接答えたいと思います。
imageSharp
とchildImageSharp
の違いそれらは常に同じタイプのノード、つまりImageSharp
です。違いは基準点です。
一般的なgatsbyブログでは、すべてのファイルが最初にgatsby-transformer-file-system
で処理されます。各ファイルは、ファイルの種類などの情報を持つノードを取得します。次に、gatsby-transformer-sharp
のようなプラグインが、関連するタイプ/拡張子を持つノードを取得し、さらに処理して新しいノードを作成します。
File image.png
|
create a node with
gatsby-transformer-file-system -> "type": "File",
"extension": "png"
|
whenever see a node
with a valid image extension,
gatsby-transformer-sharp -> create a node with
"type": "ImageSharp"
that contains info of images
processed by `gatsby-plugin-sharp`
これが発生すると、元のFile
ノードとImageSharp
ノードの間に親子関係が作成されます。子ImageSharp
ノードは、File
という名前のchildImageSharp
ノードでクエリ可能です。
File ImageSharp
|--id: 1 |--id: 2
|--children |--parent
| `--[ id: 2 ] | `--id: 1
`--childImageSharp |--fluid
|--id: 2 ...
|--fluid
...
つまり、同じImageSharp
ノードを少なくとも2つの方法でクエリできます。
ImageSharp
ノードには、ファイルシステム内の場所に関する情報が含まれていないため、src/X
フォルダーから画像を取得するには、次のようにクエリする必要があります。
query {
// relativePath is relative to the folder set in `gatsby-transformer-file-system`
file ( relativePath: { eq: "src/X"} ) {
childImageSharp {
id
fluid {
src
}
}
}
}
ImageSharp
を直接取得するおそらく、どういうわけかImageSharpノードの正確なid
を知っています。あなたはそれを手に入れることができます:
{
imageSharp (id: {eq: "2"}) { // not a real id
id
fluid {
src
}
}
}
allFile
またはallImageSharp
から複数の画像をクエリすることもできます。
これはエラーで戻ります:
// error
{
childImageSharp {
id
}
}
他のプラグインも同じ種類の関係を共有します。 childMardownRemark
ノードで解決されるFile
タイプでMarkdownRemark
ノードを見つけることもできます。
gatsby-image
とは何の関係もありません-同じノードに解決するための異なる方法です。
すばらしい質問です。Sharpは素晴らしいツールであり、どのJavaScriptアプリケーションでも非常に多くのことができます。それはまた、私が調べてみることを提案した広範なドキュメントも持っています。 http://sharp.dimens.io/en/stable/
最初のimageSharpは、特にTransformでさまざまな方法で使用できます。しかし、これはギャツビーの世界でimageSharpを利用する簡単な例です。これがindex.js
ページfolder
にあり、home
のルートがあります
import { Home } from 'routes/Home/Home'
/* eslint no-undef: "off" */
export const pageQuery = graphql`
query HomeQuery {
image1Image: imageSharp(id: { regex: "/image1.png/" }) {
sizes(quality: 100) {
...GatsbyImageSharpSizes_withWebp
}
}
image2Image: imageSharp(id: { regex: "/image2.png/" }) {
sizes(quality: 100) {
...GatsbyImageSharpSizes_withWebp
}
}
image3Image: imageSharp(id: { regex: "/image3.png/" }) {
sizes(quality: 100) {
...GatsbyImageSharpSizes_withWebp
}
}
}
`
export default Home
次に、childImageSharp
を使用して、アプリケーション全体で画像スタイルを定義します。たとえば、types
というフォルダーがあり、パスはsrc/types/images.js
たとえば、このファイルでは、画像の解像度とサイズ、および関連するデータセットを定義します。次に、childImageSharp
をエクスポートして、アプリのさまざまな部分で子を繰り返し再利用することを計画します。
// @flow
export type GatsbyImageResolutions = {
resolutions: {
base64?: string,
height: number,
src: string,
srcSet: string,
width: number,
},
};
export type GatsbyImageSizes = {
sizes: {
aspectRatio: number,
base64?: string,
sizes: string,
src: string,
srcSet: string,
},
};
export type Image = {
childImageSharp: GatsbyImageResolutions | GatsbyImageSizes,
};
これが画像を変換する力の例です。この例は、WordPress REST-apiから標準のhref = linkへのリンクを介してImageURLで返されます。childIamgeSharpを使用して画像のサイズ変更と再形成を行います!両方が1つのファイルに存在しますsrc/post/post.js
/**
* Transform internal absolute link to relative.
*
* @param {string} string The HTML to run link replacemnt on
*/
linkReplace(string) {
// console.log(string)
const formatted = string.replace(
/(href="https?:\/\/dev-your-image-api\.pantheonsite\.io\/)/g,
`href="/`
)
return formatted
}
render() {
const post = { ...this.props.data.wordpressPost }
const headshot = { ...this.props.data.file.childImageSharp.resolutions }
const { percentScrolled } = { ...this.state }
const contentFormatted = this.linkReplace(post.content)
return (
<div ref={el => (this.post = el)}>
<div className={styles.progressBarWrapper}>
<div
style={{ width: `${percentScrolled}%` }}
className={styles.progressBar}
/>
</div>
<div className={styles.post}>
<h1
className={styles.title}
dangerouslySetInnerHTML={{ __html: post.title }}
/>
<div
className={styles.content}
dangerouslySetInnerHTML={{ __html: contentFormatted }}
/>
<Bio headshot={headshot} horizontal={true} />
</div>
</div>
)
}
}
Post.propTypes = {
data: PropTypes.object.isRequired,
}
export default Post
export const postQuery = graphql`
query currentPostQuery($id: String!) {
wordpressPost(id: { eq: $id }) {
wordpress_id
title
content
slug
}
file(relativePath: { eq: "your-image-headshot.jpg" }) {
childImageSharp {
resolutions(width: 300, height: 300) {
...GatsbyImageSharpResolutions
}
}
}
}
これがあなたに役立つかどうか私に知らせてください、そうでなければ私はより詳細に説明するのを助けてくれるでしょう。 SharpとGatsbyは両方とも対象なので、私は非常に情熱的で、フルタイムの仕事でほぼ毎日Sharpに対応しています。
返信が遅れて申し訳ありません。理解が深まったと思いますが、こちらでフォローアップすると思います。
私がこの質問に答えたときのようにギャツビー1.0をもう一度参照すると、2.0はまだリリースされていません。しかし、アカウント1にはいくつかの点を考慮する必要があります。イメージパスはどこにあるのでしょうか。 2つ目は、ブログ投稿のMDファイル、アセットファイル、またはAPIの画像ですか?
これは、gatsby-imageを使用するコンポーネントが次のように見えるものです:(これはGatsby v1ドキュメントからのものです)
import React from "react"
import Img from "gatsby-image"
export default ({ data }) => (
<div>
<h1>Hello gatsby-image</h1>
<Img fixed={data.file.childImageSharp.fixed} />
</div>
)
export const query = graphql`
query {
file(relativePath: { eq: "blog/avatars/kyle-mathews.jpeg" }) {
childImageSharp {
# Specify the image processing specifications right in the query.
# Makes it trivial to update as your page's design changes.
fixed(width: 125, height: 125) {
...GatsbyImageSharpFixed
}
}
}
}
`
Gatsby-imageは Sharp ライブラリのコンポーネントを直接使用します。上記のように、gatsby-imageは、画像のファイルパス、サイズなどを定義するGraphQLクエリを参照するchildImageSharpを使用します。ファイルシステムの元の画像または「元の」画像は、サイズやファイルタイプが異なるため、子供と見なされます。
イメージの特定のパスが直接呼び出されないため、コンポーネントまたはレイアウトでノードまたはイメージの一般的な感覚を定義するときにImageSharpを使用できます。