app.locals.appName = "Acme"; // every renderres.locals.user = req.user; // every render in this requestres.render("dashboard", { stats }); // template-specific
Source
Precedence (lowest → highest)
app.locals
1
res.locals
2
render(view, locals)
3
5. Using EJS Templates
Example: EJS syntax
<!-- views/profile.ejs --><%- include("partials/header") %><h1>Hello, <%= user.name %></h1><ul> <% for (const post of posts) { %> <li><%= post.title %></li> <% } %></ul>
Tag
Purpose
<%= %>
Escaped output
<%- %>
Raw HTML
<% %>
JS control flow
<%# %>
Comment
6. Using Pug Templates
Example: Pug indentation
doctype htmlhtml head title= title body h1 Hello, #{user.name} ul each post in posts li= post.title
Pug Feature
Detail
Whitespace-significant
Indentation = nesting
#{var}
Interpolation (escaped)
!{var}
Raw
extends layout
Inheritance
block name
Override-able sections
7. Using Handlebars
Example: express-handlebars setup
import { engine } from "express-handlebars";app.engine("hbs", engine({ extname: ".hbs", defaultLayout: "main", helpers: { uppercase: (s) => s.toUpperCase() }}));app.set("view engine", "hbs");