使用 Handlebars 和 ExpressJS 的多个布局?

Multiple layouts with Handlebars and ExpressJS?

如果我使用 Handlebars 作为 Express 4 的模板引擎,似乎只有一个选项可以指定一个布局模板用于所有视图:

app.engine('hbs', expressHbs({extname:'hbs', defaultLayout:'layout.hbs'}));

如果您的应用需要多个布局怎么办?如果 viewA.hbs 使用一种布局而 viewB.hbs 需要不同的布局怎么办?

当我学习 nodejs 时,我来自 PHP Laravel 背景,其中 Blade templating engine 让你指定在每个视图文件的顶部使用哪个布局.它使得在任何给定视图的布局模板之间切换变得非常简单。

当您调用 render 方法时,您应该能够从 route/controller 传递布局。

router.get('/', function(req, res) {
    res.render('home', {layout: 'viewBLayout.hbs'});
});

我很确定 jade 可以让您从模板内部切换布局,但我不知道您是否可以使用把手来做到这一点。

如果您使用 express-hbs,您可以在模板中使用如下注释指定布局:

{{!< layout}}

或者,您可以尝试 exphbs。还支持布局注释,可以嵌套多个布局。 (免责声明:我写的。)

确保您首先在 /layouts 目录中创建两个名为 "main.handlebars" 和 "backend.handlebars" 的文件:

例如,如果需要,请为两条路线尝试此代码

router.get('/', function(req, res) {
    res.render('home', {layout: 'main'});
});

router.get('/backend', function(req, res) {
    res.render('home', {layout: 'backend'});
});