🖼️
Templating & Static Files

View Engines

EJS, Pug aur Handlebars
💡 View engine EK MAIL-MERGE TEMPLATE jaisa hai — ek hi shaadi ka card (template) hai, har mehmaan ka naam (data) alag bharkar personalised card (HTML) ban jaata hai.

View engine server par HTML GENERATE karta hai template + data se. Express ko do settings chahiye: "view engine" (kaunsa engine) aur "views" (templates kis folder mein hain, default ./views).

EJS HTML-jaisa syntax deta hai (<%= %>), Pug indentation-based aur bahut concise hai, Handlebars logic-less approach follow karta hai. Express ke saath engine package install karna padta hai — Express khud koi engine bundle nahi karta.

npm install ejs

app.set("view engine", "ejs");
app.set("views", path.join(__dirname, "views"));

// views/profile.ejs  ->  <h1>Hello <%= name %></h1>
app.get("/profile", (req, res) => res.render("profile", { name: "Aarav" }));
🖼️
View engine EK MAIL-MERGE TEMPLATE jaisa hai — ek hi shaadi ka card (template) hai, har mehmaan ka naam (data) alag bharkar personalised card (HTML) ban jaata hai.
1 / 2
⚡ Quick Recap
  • View engine server par template + data se HTML banata hai
  • app.set("view engine") aur app.set("views") dono configure karo
  • EJS escape karta hai <%= %> se — user data ke liye raw output se bacho
Is page mein (2 subtopics)

EJS mein <%= value %> escaped output deta hai (XSS-safe), <%- value %> raw HTML deta hai, aur <% code %> sirf JavaScript chalata hai bina output ke. Partials (<%- include('header') %>) se header/footer reuse hote hain.

<!-- views/users.ejs -->
<%- include('partials/header') %>
<h1><%= title %></h1>
<ul>
  <% users.forEach(u => { %>
    <li><%= u.name %></li>
  <% }) %>
</ul>

Pug indentation-based hai — koi closing tags nahi, bahut concise, lekin whitespace sensitive. Handlebars logic-less philosophy follow karta hai ({{#each}}, {{#if}}) jisse templates simple rehte hain aur logic controller mein rehta hai. Choice team ki comfort par depend karti hai.

//- Pug
h1= title
ul
  each u in users
    li= u.name