
PUG๋ฅผ ์ฐ๋ ์ด์
HTML, CSS์ ๋ค์ ๋์กํ ์ฝ๋๋ฅผ PUG๋ฅผ ํตํด ๊ฐ๋ตํ ์ฝ๋ฉ์ ํ ์ ์์
Jade๊ฐ ์ด๋ฆ ๋ฐ๊พผ ๊ฒ Pug์
This project was formerly known as "Jade." However, it has been revealed to us that "Jade" is a registered trademark, and as a result a rename is needed. After some discussion among the maintainers, "Pug" has been chosen as the new name for this project. The next major version will carry "pug" as the package name.
์ค์ ๋ฐฉ๋ฒ
// app.js
app.set("view engine", "pug");
app.set("views", "/other"); // change default path to '/other'
๋ํดํธ ๋๋ ํ ๋ฆฌ
'ํ๋ก์ ํธ ์์ ๋๋ ํ ๋ฆฌ + /views'๋ก ๋ํดํธ path๊ฐ ์ค์ ๋๋ค.
viewsํด๋๋ฅผ ๋ง๋ค์ด ๋๋๋ง์ ํ์ํ ํ์ด์ง.pug๋ค์ ๋ง๋ ๋ค.
๋๋ ํ ๋ฆฌ ์ค์

๋ณ์ ์ ๋ฌ 1) ํ์ด์ง ๋๋๋ง ํ ๋
// controller.js
export const home = (req, res) => res.render("home", { pageTitle: "Home" });
res.render("home", { ๋ณ์ : " ๊ฐ " }
.render(): respond๊ฐ์ฒด์ ๋ฉ์๋์ด๋ค.
์ฒซ๋ฒ์งธ ์ธ์("home")๋ ํ ํ๋ฆฟ์ด๋ฆ, (home.pug๋ฅผ ๋๋๋งํ๋ค. ํ์ฅ์๋ app.set์์ ์ค์ ํ๋๋ก ๋ค์ด๊ฐ๋ค.)
๋๋ฒ์งธ ์ธ์{ ... }๋ ํ ํ๋ฆฟ์ ๋ณด๋ผ ๋ณ์๋ฅผ ๋ฃ๋๋ค.
๋ณ์ ์ ๋ฌ 2) res.locals, ์ ์ญ๋ณ์
//middleware.js (+ res.locals)
import routes from "routes.js"
export const localsMiddleware = (req, res, next) => {
res.locals.siteName = "Welcome to Our Company";
res.locals.routes = routes; // routes์์ฒด๋ฅผ ์ ์ญ์ ์ผ๋ก ์ฌ์ฉํ๊ฒ ๋ง๋ฌ
next();
};
// res.locals.๋ณ์๋ช
="๊ฐ"
// ๋ณ์๋ฅผ ์ ์ญ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
// app.js
import { localsMiddleware } from "./middlewares.js";
app.use(localsMiddleware);
๋ณ์ ์ฌ์ฉ: PUG์์
์ปจํธ๋กค๋ฌ, ๋ฏธ๋ค์จ์ด์์ ๋ฐ์ ๋ณ์๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ ๋ณ์์ด๋ฆ์ ๊ทธ๋ฅ ์ฐ๋ฉด๋๋ค.
form(action=routes.login, method="post")
a(href="/video/car/") Join
// ๊ฒฝ๋ก๋ฅผ ""๋ก ์ง์ ์ฃผ๋ฉด, ๊ฒฝ๋ก ์์ ์ ์ผ์ผ์ด ๋ฐ๊ฟ์ผํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์๋ค.
a(href=routes.join) Join
// ๊ฒฝ๋ก๋ฅผ ๋ณ์๋ก ์ค์ ํ๋ฉด ํจ๊ณผ์ ์ผ๋ก ๋ณ์๋ฅผ ๊ด๋ฆฌํ ์ ์๊ฒ ๋๋ค.
# { ๋ณ์ }: ํ ํ์์ ๋ฌธ์์ด๊ณผ ๋ณ์๋ฅผ ๊ฐ์ด ์ฌ์ฉํ ๋
h3 Searching for #{searchingFor}
`${ ๋ณ์ }`: ๋ฌธ์์ด๊ณผ ๋ณ์๋ฅผ ํ ๊ณณ์ ๋ด์ ๋ `${}`๋ฅผ ์ฌ์ฉํ์ฌ ๋ด๋๋ค.
form(action=`/videos${routes.upload}`, method="post", enctype="multipart/form-data")
PUG ์ฝ๋( ํญ๊ณผ ๋์ด์ฐ๊ธฐ๋ฅผ ํผ๋ํด์ ์ฐ์ง ์๊ฒ ์ฃผ์ )
<span class="hello">
= span.hello
footer.footerClass // ํ๊ทธ: footer, ํด๋์ค: footerClass
.footer__icon // div:์๋ต, ํด๋์ค: footer, ์์ฑ: icon
head
include ../partials/footer
//ํธํฐ ์ฌ์ฉ
extends templates/layout
block content
h1 = pageTitle
// ๋ ์ด์์ ์ฌ์ฉ
// block์ ํ์ด์ง๋ง๋ค ๊ฐ๊ฐ์ ๋ด์ฉ์ ์ฑ์๋๋ ๊ณต๊ฐ
ul
each val, index in movies.genres
li= val
//each๋ฌธ, ๊ฐ๊ฐ์ ์์์ ๊ฐ์์ ๋ฐ๋ผ ๋ฆฌ์คํธ๋ฅผ ์์ฑ
'๐ Back > ๐งฉ Node.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ์ฌ์ฉ์ ์ธ์ฆ ๋ฏธ๋ค์จ์ด: PassportJS (0) | 2021.02.12 |
|---|---|
| mixin: ๊ฐ์ ํ์์ ๋ชจ๋ํํ์ฌ ๋๋๋งํ๊ธฐ (0) | 2021.01.25 |
| [Express ๋ฏธ๋ค์จ์ด ์ฝ๋] app.use(), app.get(), Router() (0) | 2021.01.25 |
| [Express ๋ฏธ๋ค์จ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ] morgan, helmet, cookie-parser, body-parser (0) | 2021.01.25 |
| [Express ๋ฏธ๋ค์จ์ด] ๋ฏธ๋ค์จ์ด๋? ๋ฏธ๋ค์จ์ด ์์ฑ๋ฒ (0) | 2021.01.22 |