์ฃผ์ ์์
- ํด๋ ๊ตฌ์กฐ ๋ฐ ๋ชจ๋ ๊ตฌ์กฐ ๋ณ๊ฒฝ โ 2024-08-27
- express api์ ๋ฐ์ดํฐ ์ฐ๊ฒฐ โ 2024-08-27
- ๋ฆฌ๋ ๋๋ง ๋ก์ง ์์ฑ โ 2024-08-27
ํ์ต ํค์๋
- fsd ํจํด โ 2024-08-27
- esm โ 2024-08-27
- Webpack๊ณผ babel โ 2024-08-27
- https://luxurious-share-af6.notion.site/2-bfaf16a16f8743eb9ee0e08af52673be?pvs=4
๊ณ ๋ฏผ ๋ฐ ํด๊ฒฐ๊ณผ์
ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง ๋ฐฉ์์ผ๋ก ๋์ ๋ ๋๋งํ๊ธฐ
์ด์ ๊น์ง๋ง ํด๋ ์นํฉ์ ํตํด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์กด์ฑ์ ์นํฉ์ ๋๊ฒจ์ฃผ์ด ์ด๋ฌํ ๋ชจ๋์ ์ฌ์ฉํ๋ ๋ฐฉ์์ ๊ณ ๋ คํ์๋ค. ํ์ง๋ง ์ด์ ๊ณ์ํด์ ์คํจ๋ฅผ ๊ฑฐ๋ญํ ๊ฒฐ๊ณผ, ์ด๋ฌํ ์นํฉ์ ์คํฌ๋ฆฝํธ ํ์ผ์์ ์คํํ๋ค๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๋ค๋ ๊ฒฐ๋ก ์ ๋ด๋ ธ๋ค.
๋๋ ์ด์ ์ด ์ธ ๊ฐ์ง ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
- ์นํฉ์์ ๋ชจ๋ ๋ฒ๋ค๋ง ํ import ํด์ ์ฌ์ฉ โ ์คํจ
- Pug๋ fs์ ์์กดํ๋ ๋ชจ๋์ด๊ธฐ ๋๋ฌธ์, ๋ธ๋ผ์ฐ์ ์์ pug๋ฅผ Importํ๊ฒ ๋๋ฉด ์์กด์ฑ์ด ์๋ fs ๋ชจ๋ ๋ํ ์ฌ์ฉํด์ผ ํ๋๋ฐ, fs ๋ชจ๋์ node.js๊ฐ ์๋ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์๋ ์๋ํ์ง ์๊ธฐ ๋๋ฌธ์ ์คํจํ๋ค.
- not defined ์๋ฌ์ not relative path~์ ๊ฐ์ ์๋ฌ๋ง ์ด์ด์ก๋ค.
- commonjs์ require๋ฌธ์ ํตํด import
- commonjs๋ฅผ ํตํด import ํ๋ ๋ฐฉ์๋ ์๋ํด๋ดค์ง๋ง, ์ ์ด์ ๋ธ๋ผ์ฐ์ ์์ require ๋ฌธ๋ฒ ์์ฒด๊ฐ ๋์ํ์ง ์์ผ๋ฏ๋ก ์์ฉ์์๋ค.
- require is not defined ์๋ฌ๋ง ๋ด๋ค.
- ์คํธ๋ฆฝํธ ํ๊ทธ๋ก cdn jsdeliver์ ํตํด ๋ชจ๋์ ๊ฐ์ ธ์ ์ฌ์ฉ
- ์คํฌ๋ฆฝํธ ํ๊ทธ๋ก ๊ฐ์ ธ์จ pug esm์์ export default๋ฅผ ์ค์ ํด์ฃผ์ง ์์ ๋์ค๋ ์๋ฌ๋ง ๋์๋ค.
์ด์ ํ๋ฃจ์ข
์ผ ์ด๊ฑฐ๋ง ์ก๊ณ ์์๊ธฐ์ ๊ฑฐ์ ํฌ๊ธฐํ๊ณ ๊ทธ๋ฅ pug ํ์ผ์ ์จ๋ผ์ธ ์ปดํ์ผ๋ฌ๋ฅผ ํตํด ๋ณํํ ๋ค ์ฌ์ฉํ๋ ค๋ ์ฐฐ๋, ๋ฌธ๋ โPug online compilerโ๋ ์ด๋ป๊ฒ ์ปดํ์ผ์ ํ๋๊ฑธ๊น? ์ถ์ด์ ํด๋น ์ปดํ์ผ๋ฌ์ ์คํฌ๋ฆฝํธ ํ๊ทธ๋ฅผ ๋ดค๋๋ฐ https://gnjo.github.io/pug/pug.js?v=1๋ผ๋ ์ฃผ์๋ก import ํด์์ ์ฌ์ฉํ๋ค. ๋๋ ์ด ํ๊ทธ๋ฅผ ํ์ฉํด์ ์ฌ์ฉํ๊ณ , module์์ window.pug๋ฅผ ํตํด ์ฌ์ฉํ๋๋ ์ ๋๋ก compileClient ๋ฉ์๋๊ฐ ๋์ํ๋ค!
ํ์ง๋ง ๊ธฐ์กด์ ๊ฐ์ง๊ณ ์๋ pug ํ์ผ ์ค์ import ํด์ mixin์ ์ฌ์ฉํ๊ฑฐ๋ ํ ํ๋ฆฟ ์์ฒด๋ฅผ Import ํด์ค๋ ์์ ์ fs ๋ชจ๋์ ๊ฑฐ์น๊ธฐ ๋๋ฌธ์ ๋ธ๋ผ์ฐ์ ์์ ํ์ฉํ ์ ์๋ค.
import deleteConfirm from "/shared/deleteConfirm/index.js";
function Card() {
const template = `style
| @import url('/entities/card/style/card.css')
div.cardContainer(id=card.id draggable="true" data-date=card.date)
form(action="post").editform(hidden)
.form__div--cardForm
input.form__input--title(type="text" placeholder="์ ๋ชฉ์ ์
๋ ฅํ์ธ์" value=card.title)
textarea.form__textarea--cardDetail(type="text" placeholder="๋ด์ฉ์ ์
๋ ฅํ์ธ์" rows=1 maxlength=500)#cardDetail #{card.detail}
.form__div--buttonWrapper
input.form__input__cancel-button(type="button", value="์ทจ์")
input.form__input__submit-button(type="button", value="๋ฑ๋ก")
li.generalCard(data-drag=card.id)
.articleWrapper
article
p.title #{card.title}
p.detail #{card.detail}
p.author author by #{card.author}
aside
img.deleteTodo(src="/asset/close.svg", alt="delete", data-close=card.id)
img.activeEditmode(src="/asset/pen.svg", alt="edit", data-edit=card.id)`;
const compiledFunction = window.pug.compile(template, {
basedir: "/Users/miguel/Desktop/naver/membership/week1/views",
});
function render(section, cards) {
cards.forEach((card) => {
section.innerHTML += compiledFunction({ card: card });
deleteConfirm.render(card.id);
});
}
return {
render,
};
}
const card = new Card();
export default card;
์ด์ฒ๋ผ esm์ ํ์ฉํ์ฌ ํจ์ํ์ ํน์ง์ ํ์ฉํ์ฌ ์ฌ์ฉํ ์ ์๋๋ก ํ์๋ค. ํจ์ ์์ ํจ์๋ฅผ ๋ฃ๊ณ , ํด๋ก์ ๋ฅผ ํ์ฉํ ๋ด๋ถ ํจ์์ ๋ํด์๋ ์บก์ํ๊ฐ ์ ์ฉ๋์ด ๋ณด์์๋ ์ด์ ์ ์ง๋๋ค.
์์ ๊ฐ์ ์นด๋ ์ปดํฌ๋ํธ์ ๊ฒฝ์ฐ, mainsection ์ปดํฌ๋ํธ ๋ด๋ถ โ section ์ปดํฌ๋ํธ ๋ด๋ถ๋ฅผ ๊ฑฐ์ณ import ํด์จ ์ปดํฌ๋ํธ๋ฅผ ํด๋น ๋ถ๋ชจ ์์์ ํจ์ ์์์ ๋ ๋๋งํ๋ ๋ก์ง์ ํฌํจํ๋ ๋ฐฉ์์ผ๋ก ํ์ฌ๊ธ ์ฐ์์ ์ผ๋ก ๋ ๋๋ง์ ์ํค๋๋ก ์ค๊ณํ์๋ค.
fsd ์์น์ ์ถฉ์คํ ๋ชจ๋๋ค
์ด๋ฌํ ๋ฐฉ์์ ๋ ๋๋ง์ ๋ชจ๋ํ๊ฐ ์ ๋์ด ์๊ธฐ ๋๋ฌธ์, ์ด๋ฅผ ๋ณด๋ค ๊ณ์ธต์ ์ผ๋ก ๋ณด๋ค ์ ํ์ ํ๊ณ , ๊ตฌ์ฒด์ ์ธ ๋ฐฉ์์ผ๋ก ๋ชจ๋์ ์ฌ์ฉํ๋ฉด ๊ฐ๋ ์ฑ์ด๋ ๊ตฌ์กฐ ์ธก๋ฉด์์ ๊ฐ์ง๋ ์ด์ ์ด ํฌ๋ค. ์ด์ ๊ธฐ์กด์ fsd ์์น์ ๊ทธ์ ๊ฐ๋ ์ ๋ด๊ฐ ํธํ๋๋ก ํด์ํ์ฌ ์ค๊ณํ๋ค๋ฉด, ์ด๋ฒ์๋ fsd ์์น์ ์ถฉ์คํ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ง๋ ค ํ๋ค.