๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ

View Engine <PUG> <res. locals>

category ๐ŸŒš Back/๐Ÿงฉ Node.js 2021. 1. 25. 12:38

 

 

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๋ฌธ, ๊ฐ๊ฐ์˜ ์š”์†Œ์˜ ๊ฐœ์ˆ˜์— ๋”ฐ๋ผ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑ

 

๋ฐ˜์‘ํ˜•