有没有办法使用Express + Node.js多个视图引擎

时间:2013-02-25 08:57:21

标签: node.js express handlebars.js pug viewengine

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

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

问题:如何整合 Handlebars 上构建的网页&一些关于 Jade

3 个答案:

答案 0 :(得分:20)

  1. package.json
  2. 中添加引擎和consolidate.js
  3. yourapp.js

    var engines = require('巩固');

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

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

  4. 更多信息here

答案 1 :(得分:13)

  

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

答案 2 :(得分:1)

编辑

在与Amol M Kulkarni讨论以下评论之后,我回来了并再次分析了这些评论。

事实证明,这比我想回到这里分享我的解决方案要容易得多。使用合并,执行以下操作:

首先执行需求。

var engines = require('consolidate');

然后,您可以删除或设置引擎并查看引擎...
我尝试删除所有的app.engineapp.set('view engine', '...');,它确实起作用了。但是,将其设置为'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等),其余的工作便由整合来完成。


旧答案
关于@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');
然后,每次调用渲染时,都要设置'view engine'

像这样:

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

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

但是我想渲染是如此之快,应该在调用另一个req.app.set时完成。