Template Engine EJS no Express com Node.js
Como alternativa ao Handlebars, vamos examinar brevemente o uso de outra template engine - EJS. Esta engine utiliza uma sintaxe amplamente inspirada na template engine Web Forms da plataforma ASP.NET, desenvolvido pela Microsoft.
Primeiro, adicionamos o pacote ejs ao projeto com o comando:
npm install ejs --save
No arquivo app.js, definimos o seguinte código:
const express = require("express");
const app = express();
app.set("view engine", "ejs");
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"));Aqui, definimos o mesmo código de um dos tópicos anteriores, mas agora configuramos a engine ejs:
app.set("view engine", "ejs");Em seguida, adicionamos à pasta views do projeto um novo arquivo chamado contact.ejs (as visualizações em EJS têm a extensão .ejs por padrão):
<!DOCTYPE html>
<html>
  <head>
    <title><%=title %></title>
    <meta charset="utf-8" />
  </head>
  <body>
    <h1><%=title %> em EJS</h1>
    <% if(emailsVisible) { %>
    <h3>Endereços de Email</h3>
    <ul>
      <% for(var i=0; i < emails.length; i++) { %>
      <li><%=emails[i] %></li>
      <% } %>
    </ul>
    <% } else { %>
    <h3>Endereço de Email Ausente</h3>
    <% } %>
    <p>Telefone: <%=phone %></p>
  </body>
</html>Para trabalhar com o modelo de visualização, utilizamos expressões JavaScript, que são definidas com a tag <% expressão %>. Cada bloco de código, como estruturas condicionais e loops, deve ser delimitado por chaves, como em JavaScript, e cada bloco deve ter uma chave de abertura e uma de fechamento:
<% for(var i=0; i < emails.length; i++) { %>
    .........................
<% } %>Ao acessar o endereço /contact, a aplicação irá gerar a página web:

Templates Parciais
O EJS permite inserir código de um template em outro usando a função include. Por exemplo, vamos definir na pasta views um diretório chamado partials, no qual adicionamos dois arquivos. O primeiro arquivo, menu.ejs, terá o seguinte código:
<nav><a href="/">Página Principal</a> | <a href="/contact">Contatos</a></nav>O segundo arquivo, footer.ejs, representará o rodapé:
<footer><p>MyCorp - Copyright © 2024</p></footer>Agora, incluímos esses arquivos em contact.ejs:
<!DOCTYPE html>
<html>
<head>
    <title><%=title %></title>
    <meta charset="utf-8" />
</head>
<body>
    <%- include("partials/menu.ejs") %>
    <h1><%=title %> em EJS</h1>
    <% if(emailsVisible) { %>
        <h3>Endereços de Email</h3>
        <ul>
            <% for(var i=0; i<emails.length; i++) { %>
                <li><%=emails[i] %></li>
            <% } %>
        </ul>
    <% } else { %>
        <h3>Endereço de Email Ausente</h3>
    <% } %>
    <p>Telefone: <%=phone %></p>
    <%- include("partials/footer.ejs") %>
</body>
</html>A função include recebe o caminho do template a ser inserido. O arquivo app.js permanece o mesmo. Como resultado, o conteúdo dos templates incluídos será adicionado à página web:
