web-dev-qa-db-ja.com

Express + Node.jsで複数のビューエンジンを使用する方法はありますか?

シナリオNode.jsExpress + ハンドルバー をビューエンジンとして使用していくつかのトランザクションページを開発しました MongoDB

現在、問題はモジュール統合中に発生します。ビューエンジンとして Express + Jade で構築されたページがいくつかあります。

質問ハンドルバージェイドで構築されたページを統合する方法

22
Amol M Kulkarni
  1. エンジンと consolidate.js の両方をpackage.jsonに追加します
  2. yourapp.js

    var engine = require( 'consolidate');

    app.engine( 'jade'、engines.jade);

    app.engine( 'handlebars'、engines.handlebars);

詳細 ここ

22
Sergii

Express 4.0以降のソリューション(再び変更されるまで)

  1. NPMは必要なエンジンをインストールします。

    // some examples
    npm install ejs
    npm install pug
    npm install handlebars
    
  2. app.jsで使用するエンジンを設定します。

    app.set('view engine', 'pug');
    app.set('view engine', 'ejs');
    
  3. テンプレートをレンダリングします。必ずファイル拡張子を設定してください。

    // forces usage of the respective render engine by setting the file extension explicitly.
    res.render( 'about.ejs', { title: 'About' } );
    res.render( 'about.pug', { title: 'About' } );
    
  4. その他の使用例のドキュメント。

17
azariah

[〜#〜]編集[〜#〜]

コメントの下でAmolM Kulkarniと話し合った後、私は戻ってきてこれらを再度分析しました。

そして、結局、ここに戻ってソリューションを共有する必要があると思っていたよりもかなり簡単でした。 consolidateを使用して、次のようにします。

最初にrequireを実行します。

_var engines = require('consolidate');
_

次に、エンジンを削除または設定して、エンジンを表示できます...
すべての_app.engine_とapp.set('view engine', '...');を削除しようとしましたが、機能しました。ただし、_'html'_以外に設定すると、1つのエンジンでのみ機能します。だから私はそれを確実に設定しました。
次のように設定しました:

_app.engine('html', engines.swig); // take note, using 'html', not 'ejs' or 'pug'..
app.set('view engine', 'html'); // also 'html' here.
_

そして、後で_app.render_を実行するときは、ファイル拡張子が付いていることを確認してください。うまく機能します。

_res.render( 'theme.ejs', {}); // will render with ejs
res.render( 'theme.pug', {}); // will render with pug
_

これらのエンジン(pug、ejsなど)がインストールされていることを確認してください。残りはconsolidateが行います。


古い答え
@ Sergiiの回答に関しては、100%機能しませんでした。使用しているテンプレートでエラーが発生することがあります。しかし、このディレクトリでこのテンプレートを検索できなかったという間違ったエラーメッセージが表示されます。

@azariahソリューションを試しましたが、それでも機能しませんでした。

_app.set('view engine', 'pug'); // does not make sense.
app.set('view engine', 'ejs'); // overriding the last .set()
_

私のために働いたのは、前述のようにconsolodate.jsを使用することです。
通常どおりapp.set('view engine', 'pug');を追加しました。
そして、renderを呼び出すたびに、_'view engine'_を設定します。

そのようです:

_req.app.set('view engine', 'ejs');
res.render( 'theme', theme );
_

これについての私の心配は、より多くの同時ユーザーが異なるエンジンでページにアクセスするとき、これが衝突して、私が持っているエラールックアップで戻ってくるかどうかわからないということです。

しかし、レンダリングは非常に高速であるため、別の_req.app.set_が呼び出されるまでにレンダリングを実行する必要があると思います。

1
Reigel