Jade (現在の Pug) は優れたテンプレート エンジンですが、ビューのコンパイルには多くのリソースが消費されます。ジェイドは遅い。もちろん、コンパイル済みビューをキャッシュする Express on production の「キャッシュ ビュー」機能を使用できますが、コンパイル済みビューはメモリに格納されるため、大量のリソースを消費する可能性があります。Jade のおかげで、私が開発した最新の Express アプリは最初のリクエストに 800 ミリ秒以上で応答しました。そのため、テンプレート エンジンを変更したくなかったので、あなたと同じように、私の開発に関する Jade ビューをコンパイルすることにしました。元のビューの代わりにこれらのファイルをデプロイします。
.js
という名前の関数で構成されるファイルであるコンパイル済みビューを使用するには、jadeランタイムtemplate
を使用する必要があります。ランタイムは属性値を生成し、値のエスケープなどの処理を行います。この関数は、動的データ用の 1 つの引数を受け入れます。template
これらの関数はクライアント側用にコンパイルされるため、コンパイルされたビューはグローバル jade ランタイム (つまりwindow.jade
) に依存します。node.js では、GLOBAL
オブジェクトを設定できます。つまりGLOBAL.jade = require('jade/lib/runtime')
、それは良い考えではありません。コンパイルされた関数を次のように変更することにしました。
- を使用
require
して、コンパイルされたビュー (.js
ファイル) を表示できますmodule.exports
。
- この関数は、jade ランタイムである 2 番目の引数を受け入れます。
次のコード スニペットではgulp
、gulp-jade
とgulp-replace
ノード モジュールを で使用しています.gulpfile
。
gulp.task('compile-jade', () => {
// get all the jade files and compile them for client
return gulp.src([
'../views/**/*.jade'
]).pipe(jade({
client: true
}))
// replace the function definition
.pipe(replace('function template(locals)', 'module.exports = function(locals, jade)'))
.pipe(gulp.dest('../views_js') );
});
関数宣言を変更したので、ファイル.js
の代わりにコンパイル済みファイル ( files)をロードでき.jade
ます。しかし、別の問題があります。これらのファイルを使用するための事前に作成されたテンプレート エンジンは (私の知る限り) ありません。そのため、新しいエンジンを定義する必要があります。とても簡単です:
let jade = require('jade/lib/runtime');
app.engine('js', function (filePath, options, callback) { // define the template engine
let data = require(filePath)(options, jade);
callback(null, data);
});
これで、ビュー関連の設定をエクスプレスで変更できます。
app.set('view engine', 'js');
app.set('views', path.join(__dirname, 'views_js'));
アプリケーションの起動時に最初のリクエストに応答するのに 7 ミリ秒かかります。require
存在しないファイルに対してエラーをスローすることに注意してください。そのため、使用を検討しtry/catch
たり、可能な例外を処理することを約束したりできます。