27

场景:我使用Node.jsExpress + Handlebars作为视图引擎和MongoDB开发了一些事务性页面。

现在的问题是在模块集成期间,我得到了一些基于Express + Jade作为视图引擎的页面。

问题:如何集成基于Handlebars的页面和一些基于Jade的页面?

4

3 回答 3

23
  1. package.json中添加引擎和consolidate.js
  2. 你的app.js

    var engine = require('consolidate');

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

    app.engine('车把',engines.handlebars);

更多信息在这里

于 2013-02-25T10:05:36.780 回答
21

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. 更多使用示例的文档。

于 2018-02-26T04:57:35.393 回答
2

编辑

在与 Amol M Kulkarni 下面的评论讨论之后,我又回来分析了这些。

事实证明,这比我想象的要容易得多,我必须回到这里分享我的解决方案。使用巩固,这样做:

首先做要求。

var engines = require('consolidate');

然后你可以删除或设置引擎并查看引擎......
我已经尝试删除所有app.engine并且app.set('view engine', '...');它确实有效。但是,将其设置为 not'html'仅适用于一个引擎。所以我只是确定了它。
我已经这样设置了:

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。像往常一样
添加。 然后,在每次调用 render 时,我都会设置.app.set('view engine', 'pug');
'view engine'

像这样:

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

我对此的担忧是,当更多同时用户访问具有不同引擎的页面时,不确定这是否会发生冲突并返回我遇到的错误查找。

但我猜渲染速度太快了,应该在req.app.set调用另一个渲染时完成。

于 2018-11-02T14:01:26.737 回答