Layout em Handlebars - Node.js
O arquivo de layout ou página mestra permite definir o layout geral de todas as páginas web do site. Isso facilita muito a atualização do site e a definição e alteração de blocos de código comuns.
Para trabalhar com arquivos de layout, instalaremos no projeto o módulo express-handlebars
npm install express-handlebars
Suponha que no projeto, na pasta views/partials
menu.hbs
<nav><a href="/">Principal</a> | <a href="/contact">Contatos</a></nav>
E o segundo view é footer.hbs
<footer><p>MyCorp - Copyright © 2017</p></footer>
Vamos criar no projeto, na pasta views
layouts
layout.hbs
<!DOCTYPE html>
<html>
<head>
<title>{{title}}</title>
<meta charset="utf-8" />
</head>
<body>
{{> menu}}
{{{body}}}
{{> footer}}
</body>
</html>
</code>
Aqui, são inseridos os views parciais menu.hbs
footer.hbs
{{{ body }}}
Em seguida, na pasta views
contact.hbs
<h1>{{ title }}</h1> <p>Email: {{ email }}</p> <p>Telefone: {{ phone }}</p>
E o view home.hbs
<h1>Página Principal</h1>
Esses views não contêm elementos como body
head
layout.hbs
Agora, vamos definir o seguinte arquivo app.js
const express = require("express");
const expressHbs = require("express-handlebars");
const hbs = require("hbs");
const app = express();
// configurando as opções para arquivos de layout
app.engine("hbs", expressHbs.engine({
layoutsDir: "views/layouts",
defaultLayout: "layout",
extname: "hbs"
}));
app.set("view engine", "hbs");
hbs.registerPartials(__dirname + "/views/partials");
app.use("/contact", function(_, response) {
response.render("contact", {
title: "Meus Contatos",
email: "gg@mycorp.com",
phone: "+1234567890"
});
});
app.use("/", function(_, response) {
response.render("home.hbs");
});
app.listen(3000, () => console.log("Servidor iniciado em http://localhost:3000"));
Para usar arquivos de layout, é necessário configurar a engine hbs
A função expressHbs.engine()
layoutsDir
defaultLayout
layout.hbs
extname
No final, todo o projeto ficará assim:
my-express-app/ ├── node_modules/ ├── views/ │ ├── layouts/ │ │ └── layout.hbs │ ├── partials/ │ │ ├── menu.hbs │ │ └── footer.hbs │ ├── contact.hbs │ └── home.hbs ├── app.js ├── package.json └── package-lock.json
Exemplo de execução do aplicação:

