有没有办法通过 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.engine
和app.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 一起使用的问题