静的アセット
静的アセットとは、ビルド出力に直接コピーされるコード以外のファイルです。 これには画像、スタイルシート、お気に入りアイコン、フォントなどが含まれます。
デフォルトでは、これらのアセットをstatic
フォルダ内に配置することを推奨します。 そのディレクトリに入れたファイルは、ディレクトリ階層を保ったまま、生成されたbuild
フォルダのルートにコピーされます。 例: 静的フォルダにsun.jpg
という名前のファイルを追加すると、build/sun.jpg
にコピーされます。
すなわち、以下のようになります。
baseUrl: '/'
となるサイトの場合、画像/static/img/docusaurus.png
は/img/docusaurus.png
で配信されます。baseUrl: '/subpath/'
となるサイトの場合、画像/static/img/docusaurus.png
は/subpath/img/docusaurus.png
で配信されます。
静的ディレクトリのソースは、docusaurus.config.js
でカスタマイズすることができます。 例えば、以下のように設定すると、別の可能なパスとしてpublic
を追加することができます。
export default {
title: 'My site',
staticDirectories: ['public', 'static'],
// ...
};
これで、static
内だけでなくpublic
内のファイルもすべてビルド出力にコピーされます。
静的アセットの参照
JSX内
JSXでは、絶対URLを使ってコード内のstatic
フォルダからアセットを参照できますが、サイトのbaseUrl
を変更するとそれらのリンクが壊れてしまうので、これは理想的ではありません。 https://example.com/test
で配信されている画像<img src="/img/docusaurus.png" />
に対して、ブラウザはURLルートから、つまりhttps://example.com/img/docusaurus.png
として解決しようとしますが、実際にはhttps://example.com/test/img/docusaurus.png
で配信されているため失敗します。
静的アセットをimport()
またはrequire()
するか(推奨)、useBaseUrl
ユーティリティ関数を使用します。どちらもパスの前にbaseUrl
を付加します。
例:
import DocusaurusImageUrl from '@site/static/img/docusaurus.png';
<img src={DocusaurusImageUrl} />;
<img src={require('@site/static/img/docusaurus.png').default} />
import useBaseUrl from '@docusaurus/useBaseUrl';
<img src={useBaseUrl('/img/docusaurus.png')} />;
SVGファイルをインポートすることも可能です。これらはReactコンポーネントに変換されます。
import DocusaurusLogoWithKeytar from '@site/static/img/docusaurus_keytar.svg';
<DocusaurusLogoWithKeytar title="Docusaurus Logo" className="logo" />;
Markdown内
Markdownでは、リンクや画像をMarkdown構文で書く場合、絶対パスを使うことに固執することができますが、これはDocusaurusがMarkdownを解析する際にURLではなくrequire
呼び出しとして処理するためです。 Markdownの静的アセットを参照してください。
次のようににリンクを書いたとします:[文書をダウンロード](/files/note.docx)
Docusaurusは、次のように変更します: <a href={require('static/files/note.docx')}>文書をダウンロード</a>
Docusaurusは、Markdown構文のリンクのみを解析します。 もし、アセットの参照がJSXタグ(<a>
/ <img>
)を使用している場合、何も行われません。
CSS内
CSSでは、フォントや画像などのアセットを参照するために、一般的にurl()
関数が使用されます。 静的アセットを参照する場合は、以下のように絶対パスを使用します。
@font-face {
font-family: 'Caroline';
src: url('/font/Caroline.otf');
}
static/font/Caroline.otf
アセットは、バンドラーによって読み込まれます。
重要なポイントです。**ベースURLを決してハードコードしないでください!**ベースURLは実装の詳細とみなされ、簡単に変更できるようにする必要があります。 すべてのパスは、たとえURLスラグのように見えても、実際にはファイルパスです。
URLスラッグの概念モデルがより理解しやすいと思われる方は、次のような経験則を参考にしてください。
- JSXを書くときは、
/test/
のようなベースURLがあることにして、src="/img/thumbnail.png"
のような絶対URLパスを使わず、アセットをrequire
します。 - MarkdownやCSSを書くときは
/
であることにして、常にベースURLのない絶対パスを使います。
注意事項
以下の点を頭に入れておいてください。
- デフォルトでは、
static
フォルダ内のファイルは、いずれも後処理、名前ハッシュ化、軽量化されません。- しかし、上記で示したように、通常それらを
require
呼び出しに変換できるので、それらは処理されることになります。 これは、積極的なキャッシュとより良好なユーザー体験のために有効です。
- しかし、上記で示したように、通常それらを
- ハードコードされた絶対パスで参照されるファイルの欠落は、コンパイル時に検出されず、404エラーになります。
- デフォルトでは、GitHub PagesはJekyllを介して公開ファイルを処理します。 Jekyllは
_
で始まるファイルを破棄するので、GitHubページをホスティングに使用している場合は、static
ディレクトリに.nojekyll
ファイルという空のファイルを追加してJekyllを無効化することを推奨します。