Usando Templates Parciais no Pug - Node.js
Templates Parciais
O Pug permite inserir um template dentro de outro. Por exemplo, vamos definir um novo arquivo chamado footer.pug
views
<footer><p>MyCorp - Copyright © 2024</p></footer>
Vamos incluí-lo no arquivo contact.pug
<!DOCTYPE html>
<html>
<head>
<title>#{title}</title>
<meta charset="utf-8" />
</head>
<body>
<h1>#{title} no Pug</h1>
if emailsVisible
<h3>Endereços de Email</h3>
<ul>
each email in emails
<li>#{email}</li>
</ul>
else
<h3>Email ausente</h3>
<p>Telefone: #{phone}</p>
include footer.pug
</body>
</html>
Para incluir um template parcial, utilizamos a diretiva include
O arquivo da aplicação app.js
const express = require("express");
const app = express();
app.set("view engine", "pug");
app.use("/contact", function(request, response) {
response.render("contact", {
title: "Meus Contatos",
emailsVisible: true,
emails: ["gg@mycorp.com", "lol@mycorp.com"],
phone: "+1234567890"
});
});
app.use("/", function(request, response) {
response.send("Página Principal");
});
app.listen(3000, () => console.log("Servidor iniciado em http://localhost:3000"));

Dessa forma, podemos definir vários templates e incluí-los em diferentes partes de um template padrão.
Layout
Diversos templates podem compartilhar blocos de interface, como o rodapé. Se quisermos alterar o texto no rodapé, precisaríamos modificar o código em todos os templates onde o rodapé é usado. Isso não é eficiente. Nesse caso, é melhor usar páginas mestre ou layouts, que permitem definir blocos de interface comuns para outros templates.
Por exemplo, adicionamos um novo arquivo layout.pug
views
<!DOCTYPE html>
<html>
<head>
block title
<meta charset="utf-8" />
</head>
<body>
block content
include footer.pug
</body>
</html>
Usamos a diretiva block
title
content
Assim como em qualquer template, podemos incluir outros templates. Aqui, incluímos o rodapé de footer.pug
Agora, definimos o template contact.pug
extends layout.pug
block title
<title>#{title}</title>
block content
<h1>#{title} em Pug</h1>
if emailsVisible
<h3>Endereços de Email</h3>
<ul>
each email in emails
<li>#{email}</li>
</ul>
else
<h3>Email ausente</h3>
<p>Telefone: #{phone}</p>
Para usar a página mestre em um template, aplicamos a diretiva extends
Como a página mestre define dois blocos, title
content
my-express-app/ │ ├── views/ │ ├── layout.pug │ ├── footer.pug │ └── contact.pug │ ├── app.js │ ├── package.json │ └── node_modules/