Goaは、サービスDSLのFiles
関数を通じて、HTML、CSS、JavaScript、画像などの静的アセットを
提供するための簡単な方法を提供します。この関数を使用すると、HTTPパスをディスク上の
ディレクトリや特定のファイルにマッピングでき、サービスが静的コンテンツを効率的に
配信できるようになります。
Files
関数の使用Files
関数は、HTTPを介して静的アセットを提供するエンドポイントを定義します。標準の
http.ServeFile
関数と同様に動作し、定義されたパスに基づいてファイルやディレクトリの
リクエストを処理します。
Files(path, filename string, dsl ...func())
{*filepath}
)を含めることができます。単一のファイルを提供するには、特定のパスとディスク上のファイルの場所を指定してFiles
関数を定義します。
var _ = Service("web", func() {
Files("/index.html", "/www/data/index.html", func() {
// すべてオプションですが、OpenAPI仕様に役立ちます
Description("ホームページを提供します。")
Docs(func() {
Description("追加のドキュメント")
URL("https://goa.design")
})
})
})
この例では:
/index.html
- /index.html
へのリクエストは/www/data/index.html
にあるファイルを提供します。/www/data/index.html
- ディスク上のファイルの絶対パス。ディレクトリから複数のファイルを提供するには、パスにワイルドカードを使用します。
var _ = Service("web", func() {
Files("/static/{*path}", "/www/data/static", func() {
Description("CSS、JS、画像などの静的アセットを提供します。")
})
})
この例では:
/static/{*path}
- {*path}
ワイルドカードは/static/
以降の任意のサブパスにマッチし、動的なファイル提供を可能にします。/www/data/static
- 静的アセットを含むディレクトリ。/static/{*path}
のようなワイルドカードパスを使用する場合、Goaはワイルドカードの値をベースディレクトリと組み合わせてファイルを特定します:
Filename
で指定されたベースディレクトリに追加されます例えば、以下の設定の場合:
Files("/static/{*path}", "/www/data/static")
URLパスが/static/css/style.css
の場合、Goaは/www/data/static/css/style.css
に解決します。
ディレクトリを提供する際は、インデックスファイル(例:index.html
)が正しく
マッピングされていることを確認してください。ワイルドカードパスの下でindex.html
を
明示的にマッピングしない場合、基礎となるhttp.ServeFile
呼び出しはindex.html
ファイルの代わりに./
へのリダイレクトを返します。
var _ = Service("bottle", func() {
Files("/static/{*path}", "/www/data/static", func() {
Description("SPAの静的アセットを提供します。")
})
Files("/index.html", "/www/data/index.html", func() {
Description("クライアントサイドルーティングのためのSPAのindex.htmlを提供します。")
})
})
この設定により、/index.html
へのリクエストはindex.html
ファイルを提供し、
/static/*
へのリクエストは静的ディレクトリからファイルを提供することが保証されます。
Goaサービスで静的ファイル提供を実装する際、ファイルを管理および提供するための いくつかのオプションがあります:
ファイルシステムの使用:サービス実装で、ファイルシステムを使用して埋め込みファイルを提供します。
埋め込みファイルの使用:Go 1.16+のembed
パッケージを使用すると、静的ファイルを
バイナリに直接埋め込むことができ、デプロイメントがよりシンプルで信頼性の高いものになります。
この例では、embed
パッケージを使用して静的ファイルを提供する方法を示します。
以下のデザインを想定:
var _ = Service("web", func() {
Files("/static/{*path}", "static")
})
サービス実装は以下のようになります:
package web
import (
"embed"
// ... その他のインポート ...
)
//go:embed static
var StaticFS embed.FS
// ... その他のサービスコード ...
メイン関数で、以下の手順で静的ファイルを提供するようにHTTPサーバーを設定します:
StaticFS
からhttp.FS
インスタンスを作成:http.FS(web.StaticFS)
New
関数の最後の引数として渡すFiles
で定義されたエンドポイントを通じて
埋め込まれた静的ファイルを効率的に提供できますファイルシステムインスタンスは、適切なファイルシステムのセマンティクスとセキュリティを 維持しながら、埋め込まれたファイルへのアクセスを提供します。
func main() {
// その他のセットアップコード...
mux := goahttp.NewMuxer()
server := genhttp.New(
endpoints,
mux,
goahttp.RequestDecoder,
goahttp.ResponseEncoder,
nil,
nil,
http.FS(web.StaticFS), // 埋め込みファイルシステムを渡す
)
genhttp.Mount(mux, server)
// サーバーを起動...
}
このセットアップでは:
static
ディレクトリをバイナリに埋め込みます。GoaのFiles
関数を使用することで、サービスで静的コンテンツを効率的に提供できます。
特定のパスとファイルの場所を定義することで、静的アセットの配信をシームレスに管理
できます。インデックスファイルの適切なマッピングを確保し、埋め込みファイルシステムを
活用してデプロイメントを効率化してください。