Hugo パイプ入門
Hugo パイプは、Hugo のアセット処理関数のセットです。
/assets 内のリソースを検索する
これは /assets
内にマウントされたグローバル リソースに関するものです。 .Page
にスコープされたリソースについては、「ページリソース」
を参照してください。
マウント設定
を使用して、Hugo の assets
仮想フォルダーに任意のディレクトリをマウントできることに注意してください。
関数 | 説明 |
---|---|
resources.Get |
Get は、指定されたファイル名を Hugo のアセット ファイルシステムから探し出し、さらなる変換に使用できる Resource オブジェクトを生成します。詳細は、「リソースを取得する」
を参照してください。 |
resources.GetRemote |
Get と同じですが、リモートの URL を受け付けます。 「リソースを取得する」
を参照してください。 |
resources.GetMatch |
``GetMatch は、指定されたパターンにマッチする最初の Resource を見つけます。 見つからない場合は nil を返します。 使用されるルールについてのより完全な説明は、 Match` を参照してください。 |
resources.Match |
Match は、指定されたベースパスのプレフィックスにマッチするすべてのリソースを取得します。たとえば、 “*.png” は、すべての png ファイルにマッチします。 “*” はパスの区切り文字 (/ ) にはマッチしないので、リソースをサブフォルダにまとめる場合は、たとえば、“images/*.png” のようにそれを明示する必要があります。 バンドル内の任意の PNG 画像にマッチさせるには “**.png” を指定し、images フォルダー以下のすべての PNG 画像にマッチさせるには “images/**.jpg” を使用します。 マッチングは大文字と小文字を区別しません。Match は、ファイルシステムのルートからの相対パスで、Unix スタイルのスラッシュ (/ ) と先行するスラッシュを含まないファイル名を使用して、マッチングします (たとえば、 “images/logo.png”)。 完全なルールセットについては、https://github.com/gobwas/glob を参照してください。 |
この名前空間のすべてのテンプレート関数の最新の概要については、 resources
パッケージの GoDoc ページ
を参照してください。
リソースを取得する
Hugo パイプでアセットを処理するには、 resources.Get
または resources.GetRemote
を使用して Resource
として取得する必要があります。
resources.Get
は、以下のように、第一引数は assets
ディレクトリ/複数のディレクトリ からの相対的なローカルパスです。
{{ $local := resources.Get "sass/main.scss" }}
resources.GetRemote
は、以下のように、第一引数にリモートの URL を指定します。
{{ $remote := resources.GetRemote "https://www.example.com/styles.scss" }}
リソースが見つからない場合、 resources.Get
と resources.GetRemote
は nil
を返します。
リソースをコピーする
resources.Copy
を使用すると、ほぼすべての Hugo Resource
(1 つの例外は Page
) をコピーできます。おそらく、名前を変更するときに最も役に立つでしょう。
{{ $resized := $image.Resize "400x400" | resources.Copy "images/mynewname.jpg" }}
<img src="{{ $resized.RelPermalink }}">
返された Resource
内の .Data
を使用して、HTTP レスポンスに関する情報を取得できます。 これは、ボディのない HEAD リクエストの場合に特に便利です。 データ オブジェクトには次のものが含まれます。
- StatusCode
- HTTP ステータスコード。たとえば、 200 Status
- HTTP ステータス テキスト。たとえば、「200 OK」 TransferEncoding
- 転送エンコーディング。たとえば、 “chunked” ContentLength
- コンテンツの長さ。 たとえば、1234 ContentType
- コンテンツタイプ、たとえば、 “text/html”
キャッシュ化
デフォルトでは、Hugo は指定された URL
と options
(ヘッダーなど) に基づいてキャッシュキーを計算します。
オプションマップに key
を設定することで、これをオーバーライドできます。これは、リモートリソースをフェッチする頻度をより細かく制御するために使用できます。
{{ $cacheKey := print $url (now.Format "2006-01-02") }}
{{ $resource := resource.GetRemote $url (dict "key" $cacheKey) }}
エラー処理
resources.GetRemote
からの戻り値には、呼び出しが失敗した場合にエラーを返す .Err
メソッドが含まれています。 エラーを WARNING
としてログに記録したい場合は、以下のような構文を使用できます。
{{ with resources.GetRemote "https://gohugo.io/images/gohugoio-card-1.png" }}
{{ with .Err }}
{{ warnf "%s" . }}
{{ else }}
<img src="{{ .RelPermalink }}" width="{{ .Width }}" height="{{ .Height }}" alt="">
{{ end }}
{{ end }}
.Err
を自分で処理しなかった場合、Hugo は Resource
オブジェクトを最初に使い始めたときにビルドに失敗することに注意してください。
リモートオプション
リモートの Resource
を取得する場合、resources.GetRemote
はオプションのオプションマップを第2引数として受け取ります。たとえば、次の通りです。
{{ $resource := resources.GetRemote "https://example.org/api" (dict "headers" (dict "Authorization" "Bearer abcd")) }}
同じヘッダーキーに複数の値が必要な場合は、以下のようにスライスを使用します。
{{ $resource := resources.GetRemote "https://example.org/api" (dict "headers" (dict "X-List" (slice "a" "b" "c"))) }}
また、リクエストメソッドを変更したり、リクエストボディを設定することもできます。
{{ $postResponse := resources.GetRemote "https://example.org/api" (dict
"method" "post"
"body" `{"complete": true}`
"headers" (dict
"Content-Type" "application/json"
)
)}}
リモートリソースのキャッシュ化
resources.GetRemote
でフェッチしたリモートリソースは、ディスク上にキャッシュされます。詳細については、「ファイルキャッシュの設定」
を参照してください。
リソースをコピーする
ページリソースやグローバルリソースをコピーするには resources.Copy
を使用します。
リソースの公開パスを変更するためによく使用される resources.Copy
は 2 つの引数、
publishDir
のルートからの相対パス(先頭の /
はあってもなくても構いません)と、コピーするリソースを取ります。
{{ with resources.Get "img/a.jpg" }}
{{ with .Resize "300x" }}
{{ with resources.Copy "img/a-new.jpg" . }}
<img src="{{ .RelPermalink }}" width="{{ .Width }}" height="{{ .Height }}" alt="">
{{ end }}
{{ end }}
{{ end }}
を参照してください。
アセットディレクトリ
アセットファイルはアセットディレクトリに保存する必要があります。これはデフォルトでは /assets
ですが、設定ファイルの assetDir
キーで設定できます。
アセット公開
Hugo は、 .Permalink
、.RelPermalink
、または .Publish
を実行すると、 publishDir
(通常は public
) にアセットを公開できます。 .Content
を使用すると、アセットをインライン化できます。
Go パイプ
読みやすくするために、このドキュメントの Hugoパイプの例は Go パイプ を使用して記述されます。
{{ $style := resources.Get "sass/main.scss" | resources.ToCSS | resources.Minify | resources.Fingerprint }}
<link rel="stylesheet" href="{{ $style.Permalink }}">
メソッドのエイリアス
Hugoパイプの resources
変換メソッドには、それぞれ キャメルケース のエイリアス (resources.ToCSS
は toCSS
) を使用します。
このエイリアスを持たない非変換メソッドは、 resources.Get
、resources.FromString
、resources.ExecuteAsTemplate
および resources.Concat
です。
したがって、上記の例は以下のように書くこともできます。
{{ $style := resources.Get "sass/main.scss" | toCSS | minify | fingerprint }}
<link rel="stylesheet" href="{{ $style.Permalink }}">
キャッシュ化
Hugo パイプの呼び出しは、パイプチェーン 全体に基づいてキャッシュされます。
パイプチェーンの例は、以下のとおりです。
{{ $mainJs := resources.Get "js/main.js" | js.Build "main.js" | minify | fingerprint }}
パイプチェーンが呼び出されるのはサイト構築で最初に遭遇したときだけで、それ以外はキャッシュから結果が読み込まれます。そのため、Hugo パイプは何千回、何百万回と実行されるテンプレートでも、ビルドのパフォーマンスに悪影響を与えることなく使用できます。