【问题标题】:Is there any way to use multiple view engines with Express + Node.js有没有办法通过 Express + Node.js 使用多个视图引擎
【发布时间】:2013-02-10 09:04:04
【问题描述】:

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

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

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

【问题讨论】:

  • 你能说明你是如何处理识别页面的吗?
  • @Lion789:您可以从 consolidate.js documentation 的注释中查看。 “使用cons.hogan 用于hogan.js,cons.jade 用于jade 等。console.log(cons) 用于标识符的完整列表。”

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


【解决方案1】:

编辑

在cmets下面和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 等),然后 consolidate 将完成剩下的工作。


旧答案
关于@Sergii 的回答,它对我没有 100% 的效果。 有时我正在使用的模板中会出现错误。但是有一条错误消息显示在此目录中查找此模板失败。

我尝试了@azariah 解决方案,但仍然无效。

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

如前所述,对我有用的是使用 conolodate.js。
像往常一样添加app.set('view engine', 'pug');
然后,在每次调用渲染时,我都会设置'view engine'

像这样:

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

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

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

【讨论】:

  • 我正在使用它...只是您只能使用1,例如pug,app.set('view engine', 'pug');,这就是您的视图引擎...
  • 正如我上面提到的,调用 app.set 两次没有意义。你只是在最后一次调用时设置视图引擎...
  • 我说的是@Sergii 的answer(不要被误认为是azariah 的)。您可以从 consolidate.js documentation 的注释中检查这一点。使用cons.hogan 代表hogan.js,cons.jade 代表jade 等。console.log(cons) 代表完整的标识符列表。"
【解决方案2】:

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

【讨论】:

    【解决方案3】:
    1. 在您的 package.json 中添加两个引擎和 consolidate.js
    2. yourapp.js

      var engine = require('consolidate');

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

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

    更多信息here

    【讨论】:

    • 是否可以添加自定义模板引擎? expressjs.com/advanced/developing-template-engines.html
    • 这似乎对我不起作用。 Express 4 似乎总是使用相同的引擎渲染所有文件,即使文件扩展名匹配不同的引擎。
    • @WayneBloss 对我来说听起来就像您的代码中隐藏了一个默认模板引擎。如果您生成应用程序或从模板开始/遵循指南/等,您的应用程序可能在某个时候指定了默认渲染。
    • 你如何实现视图并准确呈现它们......这是我对 SO stackoverflow.com/questions/36394662/… 的问题
    • 如果这个 sn-p 曾经工作过,现在它不工作了。如果您不使用 app.set('view engine', ...) 指定引擎,则应用程序将崩溃。如果你指定一个,另一个会被忽略
    猜你喜欢
    • 2021-04-18
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    相关资源
    最近更新 更多