01. ์ ์์ง์ ์ง๊ณ ๋์ด๊ฐ๊ธฐ
- Express, Pug, app.get(), (req, res)
- package.json, babel, nodemon
- javascript๋ฅผ ํตํด HTML ์์ ๊ฐ์ ธ์ค๊ธฐ, ์์ฑ, class ์ถ๊ฐ/์ญ์
- ํ์ํ ํ๊ฒฝ : Node.js v14.17.3 ์ด์
02. ์๋ฒ ์ธํ
1. npm init
: package.json ํ์ผ์ ์์ฑํ์ฌ ํจํค์ง์ ๊ดํ ์ ๋ณด์ ์์กด ์ค์ธ ๋ฒ์ ์ ๊ดํ ์ ๋ณด๋ก Node.js์์ ์ฌ์ฉํ๋ ๋ชจ๋๋ค์ ํจํค์ง๋ก ๋ง๋ค๊ธฐ ์ํด ์
๋ ฅํ๋ ์ปค๋งจ๋
-y
์ต์ : name, version, description ๋ฑ์ ์ ๋ณด์ ๋ํด ์ผ์ผ์ด ์ ๋ ฅํ์ง ์๊ณ , default ๊ฐ์ ๋ด์ package.json ํ์ผ์ ์์ฑํด์ค๋ค. ์๋ฏธ๋ yes
2. npm i nodemon -D
npm i
: npm install์ alias-D ์ต์
: devDependencies์ ํจํค์ง๋ค์ด ์ถ๊ฐ
3. ํด๋ ๋ฐ ํ์ผ ์์ฑ
zoom
โโโ node_modules
โโโ package-lock.json
โโโ package.json
โโโ README.md
โโโ babel.config.json // ํ๋ก์ ํธ ์ ์ฒด์ Babel ์ค์ ์ ์
โโโ nodemon.json // nodemon ์ค์ ์ ์
โโโ src
โโโ server.js // ์๋ฒ ์ญํ
- nodemon.json
{
"exec": "babel-node src/server.js" // src/server.js์ ๋ํด babel-node ๋ช
๋ น๋ฌธ์ ์คํ์ํด
}
- babel.config.json
{
"presets": ["@babel/env"]
}
/*
๊ฐ์์์ "presets": ["@babel/preset_env"]๋ก ์๋ ค์ค์
๊ทธ๋ ๊ฒ ์งํํ๋๋ [nodemon] app crashed๊ฐ ๋ ์ ๋๊ธ์ ์ฐธ๊ณ ํ์ฌ ์์ ํ๋ค.
์ ๋ฐ๊ฟ์ฃผ๋ฉด ์คํ์ด ์ ๋๋์ง๋ ๋ชจ๋ฅด๊ฒ ๋คใ
*/
4. npm i @babel/core @babel/cli @babel/node
@babel/preset-env
-D
5. package.json์ script ์ถ๊ฐ
"scripts": {
"dev": "nodemon"
},
/*
dev๋ nodemon์ ํธ์ถํ๊ณ ,
nodemon์ด ํธ์ถ๋๋ฉด nodemon์ด nodemon.json์ ์ดํด๋ณด๊ณ ๊ฑฐ๊ธฐ์ ์๋ ์ฝ๋๋ฅผ ์คํ
*/
6. npm i express
, npm i pug
7. server.js ํธ์ง
import express from "express";
const app = express();
console.log("Hello");
app.listen(3000);
03. Frontend ์ธํ
1. ํด๋ ๋ฐ ํ์ผ ์์ฑ
zoom
โโโ node_modules
โโโ package-lock.json
โโโ package.json
โโโ README.md
โโโ babel.config.json
โโโ nodemon.json
โโโ src
โโโ public // public ํ์ผ๋ค์ FrontEnd์์ ๊ตฌ๋๋จ
โ โโโ js
โ โโโ app.js // ์น ํ์ด์ง์ ๋์ ์ธ ๊ธฐ๋ฅ ๋ด๋น
โโโ views
โ โโโ home.pug // html ํ
ํ๋ฆฟ ํ์ผ
โโโ server.js
2. home.pug ํ ํ๋ฆฟ ์ฝ๋ ์์ฑ
html:5
+tab
doctype html
html(lang="en")
head
meta(charset="UTF-8")
meta(name="viewport", content="width=device-width, initial-scale=1.0")
title Noom
body
h1 It works!
script(src="/public/js/app.js")
3. server.js ์์
import express from "express";
const app = express();
app.set("view engine", "pug"); // view engine์ pug๋ก ์ค์
app.set("views", __dirname + "/views"); // Express์ template์ด ์ด๋์๋์ง ์ง์
app.use("/public", express.static(__dirname + "/public")); // public url์ ์์ฑํด์ ์ ์ ์๊ฒ ํ์ผ ๊ณต์
app.get("/", (req, res) => res.render("home")); // home.pug๋ฅผ render ํด์ฃผ๋ route handler๋ฅผ ๋ง๋ฆ
app.get("/*", (req, res) => res.redirect("/")); // catchall url, ์ด๋ค url๋ก ์ด๋ํ๋๋ผ๋ ํ์ผ๋ก ๋๋ ค๋ณด๋
const handleListen = () => console.log(`Listening on http://localhost:3000`);
app.listen(3000, handleListen);
4. nodemon.json ์์
- ๊ธฐ๋ณธ ์ค์ ์ผ๋ก๋ ์ ์ ํํ ๋ง ๋ณด์ฌ์ง๋ app.js๋ฅผ ์์ ํ ๋๋ nodemone์ด ๊ณ์ ์ฌ์คํ๋๋ค. views๋ ์๋ฒ๋ฅผ ์์ ํ ๋๋ง ์ฌ์์๋๋๋ก ๊ณ ์น๋ค.
{
"ignore": ["src/public/*"],
"exec": "babel-node src/server.js"
}
5. MVP CSS ์ฌ์ฉํ๊ธฐ
- ๊ธฐ๋ณธ์ ์ธ HTML tag์ ์คํ์ผ์ ์ ํ์ฃผ๋ CSS ํ๋ ์์ํฌ
link(rel="stylesheet", href="https://unpkg.com/mvp.css")
๋ฅผ head์ ์์ฑ
์ฐธ๊ณ
https://velog.io/@clean01/Npm-npm-init์-์๋ฏธ
https://phsun102.tistory.com/29(npm install ์ต์ ์ ์ฐจ์ด)
728x90