Usando Templates Parciais no Pug no Express com Node.js
Templates Parciais
O Pug permite inserir um template dentro de outro. Por exemplo, vamos definir um novo arquivo chamado footer.pug na pasta views do projeto:
<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, seguida pelo caminho do template a ser incluído.
O arquivo da aplicação app.js permanece o mesmo do tema anterior:
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 na pasta views:
<!DOCTYPE html>
<html>
<head>
    block title
    <meta charset="utf-8" />
</head>
<body>
    block content
    include footer.pug
</body>
</html>Usamos a diretiva block para definir blocos onde será inserido algum conteúdo. No momento da definição desse template, não sabemos o que será esse conteúdo. Ele será definido em outros templates que usarão esse layout. Neste exemplo, definimos dois blocos com os nomes title e content.
Assim como em qualquer template, podemos incluir outros templates. Aqui, incluímos o rodapé de footer.pug, que geralmente é um elemento comum para a maioria das páginas do site.
Agora, definimos o template contact.pug, que usará esse layout:
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, seguida pelo caminho do arquivo.
Como a página mestre define dois blocos, title e content, neste caso, definimos o conteúdo para cada um desses blocos. Esse conteúdo será inserido nos locais correspondentes na página mestre.
my-express-app/ │ ├── views/ │ ├── layout.pug │ ├── footer.pug │ └── contact.pug │ ├── app.js │ ├── package.json │ └── node_modules/