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

Posted

技术标签:

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

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

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

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

【问题讨论】:

你能说明你是如何处理识别页面的吗? @Lion789:您可以从 consolidate.js documentation 的注释中查看。 “使用cons.hogan 用于hogan.js,cons.jade 用于jade 等。console.log(cons) 用于标识符的完整列表。” 【参考方案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 及更高版本的解决方案(直到再次更改)

    NPM 安装你需要的引擎。

    // some examples
    npm install ejs
    npm install pug
    npm install handlebars
    

    设置要在您的app.js 中使用的引擎。

    app.set('view engine', 'pug');
    app.set('view engine', 'ejs');
    

    渲染你的模板,一定要设置文件扩展名。

    // 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'  );
    

    更多使用示例的文档。

    https://expressjs.com/en/guide/using-template-engines.html

【讨论】:

【参考方案3】:
    在您的 package.json 中添加两个引擎和 consolidate.js

    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 ***.com/questions/36394662/… 的问题 如果这个 sn-p 曾经工作过,现在它不工作了。如果您不使用 app.set('view engine', ...) 指定引擎,则应用程序将崩溃。如果你指定一个,另一个会被忽略

以上是关于有没有办法通过 Express + Node.js 使用多个视图引擎的主要内容,如果未能解决你的问题,请参考以下文章

Node.js Error: Cannot find module express的解决办法

res.render 中的 Express-Node JS 车把模板:如何迭代?

通过 consolidate.js 获取 Node.js Express 3.x 模板继承与 Swig 一起使用的问题

如何使用 express 框架通过 node.js 获取远程客户端的本地 IP 地址?

如何使用 express 中间件处理类型?

Socket.io 使用 node.js,根本没有 express?