Layout em Handlebars no Express com 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 com o seguinte comando:
npm install express-handlebars
Suponha que no projeto, na pasta views/partials, sejam definidos dois views parciais para o menu e o rodapé. O primeiro view é 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, um novo diretório chamado layouts e definir nele o arquivo layout.hbs, que definirá o layout do site:
<!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 e footer.hbs. Além disso, há uma expressão chamada {{{ body }}}, que será substituída pelo conteúdo de views específicos.
Em seguida, na pasta views, definiremos dois views comuns. O view 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 ou blocos comuns, pois todos eles estão definidos no arquivo 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() configura a engine. Em particular, a propriedade layoutsDir define o caminho para a pasta de arquivos de layout em relação ao diretório raiz do projeto. A propriedade defaultLayout indica o nome do arquivo que será usado como página mestra. No nosso caso, é o arquivo layout.hbs, por isso especificamos o nome do arquivo sem a extensão. E a terceira propriedade, extname, define a extensão dos arquivos.
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:

