多くの異なるページを持つアプリを構築する際、複数のHTMLファイルで共有されるマークアップをレイアウトに抽出すると便利です。これにより、プロジェクトのコードの総量を減らし、後々、複数のファイルで同じ変更を行うことを避けることができます。
SailsとExpressでは、レイアウトはビューエンジン自体によって実装されます。たとえば、jade
には独自の構文を持つ独自のレイアウトシステムがあります。
便宜上、Sailsは、デフォルトのビューエンジンであるEJSを使用する場合に、レイアウトの特別なサポートをバンドルしています。異なるビューエンジンでレイアウトを使用したい場合は、適切な構文を見つけるためにそのビューエンジンのドキュメントを確認してください。
Sailsのレイアウトは、アプリのviews/
フォルダにある特別な.ejs
ファイルで、他のビューを「ラップ」または「サンドイッチ」するために使用できます。レイアウトには通常、プリアンブル(例:<!DOCTYPE html><html><head>....</head><body>
)と結論(</body></html>
)が含まれます。元のビューファイルは、<%- body %>
を使用して含まれます。レイアウトは、ビューなしで使用されることはありません。それは、パンだけのサンドイッチを誰かに提供するようなものです。
アプリのレイアウトサポートは、config/views.js
で設定または無効にすることができ、layout
という特別なローカルを設定することで、特定のルートまたはアクションに対して上書きできます。デフォルトでは、Sailsはviews/layouts/layout.ejs
にあるレイアウトを使用してすべてのビューをコンパイルします。
ビューが使用するレイアウトを指定するには、以下の例を参照してください。詳細については、routesのドキュメントを参照してください。
以下のルート例では、./views/users/privacy.ejs
にあるビューを./views/users.ejs
にあるレイアウト内で使用します。
'get /privacy': {
view: 'users/privacy',
locals: {
layout: 'users'
}
},
以下のコントローラーアクションの例では、./views/users/privacy.ejs
にあるビューを./views/users.ejs
にあるレイアウト内で使用します。
privacy: function (req, res) {
res.view('users/privacy', {layout: 'users'})
}
なぜレイアウトはEJSでのみ機能するのですか?
数年前、レイアウト/パーシャルの組み込みサポートはExpressで非推奨になりました。代わりに、開発者はこの機能を実装するためにビューエンジン自体に依存することが期待されていました。(詳細については、https://github.com/balderdashy/sails/issues/494を参照してください。)
Sailsは、Express 2.xおよびSails 0.8.xアプリとの下位互換性、および特に他のMVCフレームワークから来た新しいコミュニティメンバーへの親しみやすさのために、レガシーの
layouts
機能をサポートしています。その結果、レイアウトはデフォルトのビューエンジン(ejs)でのみテストされています。レイアウトが好みではない場合、または(今のところ)ejs以外のサーバーサイドビューエンジン(例:Jade、handlebars、haml、dust)を使用している場合は、
sails.config.views
でlayout:false
を設定し、ビューエンジンのカスタムレイアウト/パーシャルサポートに依存する必要があります。