์ข์๋ ์
- K ์ฌ ํ๋ก์ ํธ๋ฅผ ํ๊ฒ ๋๋ฉด, ์ค๋ก๋ผ ์คํจ์์ web component, template, slot, handlebarsJS ๋ผ๋ ๊ฐ๋ ์ ๋ํด ๋ฐฐ์ธ ์ ์๋ ๊ธฐํ๊ฐ ๋ ๊ฒ ์ด๋ผ๋ ์
์์ ์ฝ๋๋ฅผ ํตํด์ ๋๋ '์ค๋ก๋ผ ์คํจ react' ์์๋, ๋ฐฐ์ฐ๊ณ ์ถ์ ์ฝ๋๋ค์ด ๋ง์ด ๋ น์์์๋ค.
์ด๋ป๊ฒ ๋ฐ๋ก ์ฌ๊ธฐ๋ก ๋๋ฒ๊น ํ๋ฌ ์จ๊ฑฐ์ง
storybook ์์, currentTab ์ ๊ฐ์ ๋ฃ์ผ๋ฉด -> ์์ ์ฒ๋ผ ๋ณํด
storybook ์์, tabs ์ ๋ํ ์ค๋ช ์ ๋ฃ์ผ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ์ง?
'storybook ์์, currentTab ์ ๊ฐ์ ๋ฃ์ผ๋ฉด -> ์์ ์ฒ๋ผ ๋ณํด' ๋ผ๋ ๊ธ์ ๋ฃ์ด์ฃผ๊ณ ์ถ์๋ฐ
[์ฃผ์์ฌํญ] 1. build ๋ช ๋ น์ด๋ง ์ ํจํจ! (#โญโญโญโญโญ)
https://youtu.be/4zeusLdLizs?t=784
[์ฃผ์์ฌํญ] 2. dist ํด๋ (#โญโญโญโญโญ)
https://youtu.be/4zeusLdLizs?t=784
- dist ํด๋์ ๋จ์ด์ ธ์ผ ํจ
- dist ํ์์ ์๋ 'mobile', 'pc' ๋ผ๋ ์ด๋ฆ๋ ๋์ผํด์ผ ํจ
- ๋ ์ค ํ๋๋ง ์กด์ฌํด๋ ๋จ
- ๋ค๋ง, ๋ด๊ฐ ์ ๊ณตํ๊ณ ์ ํ๋ ๊ฒ pc ๋ผ๋ฉด, pc ํด๋๋ ์์ด์ผ ํ๋ค๋ ๊ฒ.
- production ๋ชจ๋์ ๊ฐ๋ฐ ๋ชจ๋์์ ์ค์ ํ๋ ๊ฐ์ด ๋ฌ๋ผ์ง (#โโโโโ ์ด๊ฒ ๋ฌด์จ)
[์ฃผ์์ฌํญ] 3. ๋ชจ๋ฐ์ผ์์๋ m
์ ๋ค์ ๋ถ์ฌ์ค์ผ ํจ (#๋๋ฐ์ด์ค์ ๋ฐ๋ผ, ์ค์ ๋ชจ๋ฐ์ผ๋ก ๋ณ๊ฒฝํ๊ฒ ํ๋ ์ฝ๋)
- production ๋ชจ๋ ์ผ ๋๋ง '/m' ์ ์ถ๊ฐ (#โโโโโโ)
์๋๋ฉด 1) ํธ์คํ ์, ๊ฒฝ๋ก์, m ์ด ์ถ๊ฐ ๋จ -> so, production ๋ชจ๋์ผ ๋ 'm' ์ ์ถ๊ฐ 2) ๊ฐ๋ฐ ๋ชจ๋ ์ผ ๋๋, dist ๊ฐ, ๋ฐ๋ก root ๋ก ๋จ์ด์ง๊ธฐ ๋๋ฌธ์, 'm' ์ ๋ฃ์ง ์์๋ ๋จ

### 'ํ์, ๋นํ์' ์ต๊ทผ ๋ณธ ์ํ ์กฐํํ๊ธฐ
```bash
์ ํํด์ผ ํ๋ ์นดํ
๊ณ ๋ฆฌ๊ฐ
1) ์ต๋ฐ์ด shop API
2) product
3) ๊ทธ ๋ค์ api ๋ค
-> ๊ทผ๋ฐ, 1๋ฒ, 2๋ฒ, ์ ์ด๋ป๊ฒ ๊ตฌ๋ถํ์ง (#โโโโโ)
[์ฝ๋ base] 1) ์ ์ด๋ ๊ฒ ๊ทธ๋ฅ, ์คํฌ๋กค ์ฌ๋ผ๊ฐ๋ ํจ์ ๊ฐ์๊ฑฐ๋ util ์์ ๊ฐ์ ธ์ค๋๊ตฌ๋ 2) css ๋ ๊ทธ๋ฅ import ํด์ค๋ ๊ตฌ๋ -> ๊ทธ๋์, ๋ก์ง๋ง ๊น๋ํ๊ฒ ๋ณด์ด๋๋ก
[๊ถ๊ธํ๊ฑฐ] router ์์ lazy ๋ก ์ฐ์ฌ์ ธ ์๋๊ฑฐ ์ด๊ฒ ๋ญ์ง?
- ์ด๋ ๊ฒ lazy ๋ก ๋์ด ์๋๊ฒ ๋ญ์ง? (https://youtu.be/TXZfSGfn1RE?t=178)
[๊ถ๊ธํ๊ฑฐ] ์ SideNav ํด๋๋ฅผ ๋ง๋ค์ด์, ๋ค์, export ํ๊ณ import ํ๋๊ฑฐ์ง
(https://youtu.be/TXZfSGfn1RE?t=382)
[์ค, ๋ฉ์ง๊ฑฐ] modal ์ฝ๋๋ฅผ ์ด๋ ๊ฒ๋ ์งค ์ ์๋ค! (#๊ทผ๋ฐ, ๋ด๊ฐ (prev) ์ด ๋ฌธ๋ฒ์ ์์ง๋ ์ ๋ชจ๋ฅด๋๊ฑฐ ๊ฐ์) (#โญโญโญโญโญโญโญโญโญโญโญโญโญโญโญโญโญโญโญโญโญโญ)
(https://youtu.be/TXZfSGfn1RE?t=450)
์ค๋ก๋ผ ์คํจ๋, '๊ณตํต ์ปดํฌ๋ํธ' ์ฌ์ฉํ๋ ๋๋. - ์๋๋ฉด, 1) ์ ํด์ง ๊ฑฐ๋ํ ํ๋ฆ์ค ํ๋์ธ VisibleComponent ๋ฅผ ์ฐ๋ ๊ฒ 2) ๊ทธ ํ์ ์ฝ๋๋ก TruthyComponent ์์ฑ์ ์ฐ๊ณ 3) TruthyComponent ์์ฑ ์ ๋ฐ์ธ๋ฉ ํ๋ ์ปดํฌ๋ํธ๊ฐ TitleModal ์ด๋ผ๋ ๊ฒ -> ๊ฒฐ๊ตญ, 1) ์ด๋ค ์ํฉ์์ VisibleComponent ๋ฅผ ์ฐ๋์ง 2) VisibleComponent ๊ฐ ๊ฐ๊ณ ์๋ ์์ฑ(interface) ์ด ๋ญ์ง ํ์ธํ๊ณ 3) ์ถ๊ฐ depth ์ปดํฌ๋ํธ์ interface ๋ฅผ ํ์ ํ๋ ๊ตฌ์กฐ (#โญโญโญ ์ฌ๊ธฐ์์ ์ ๊ธฐํ ๊ฒ์, 'interface' ๋ฅผ ํ์ ํ๋ค๊ณ ๋งํ๋ ๋ถ๋ถ)
๊ทธ๋์ ์ฐ์ , interface ์ค children, text, className ์ ์ฑ๊ฒจ์ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์์ฑํด์ค

[๊ถ๊ธ์ฆ] ๊ทผ๋ฐ, ์ด i ๋ผ๋๊ฒ ๋ญ์ง?
๊ทธ๋์, ์ต์ข ์ ์ผ๋ก, ์ด๋ ๊ฒ ์ฝ๋๊ฐ ์ง์ง
์ต๊ทผ ๋ณธ ์ํ์ ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ์ ๊ทผํ ์ ์์ด์ผ ํ๋๊น, 'provider' ๋ฅผ ๋ง๋ ๋ค. (#โญโญโญโญโญ) (#โโโโโโ ๋ฉ์ง๋ฐ?) (#โญโญโญโญโญ ์ ์ด๋ฐ๊ฑธ ๊ทธ๋ฅ ๊ฐ๋ณ๊ฒ ์ง๋๊ฒ ๋ฉ์ง๋ฐ?)
(https://youtu.be/TXZfSGfn1RE?t=781)
- ๋ณดํต์ useReducer ๋ฅผ ๋ง๋ค์ด์ provider ๋ฅผ ๋ง๋ ๋ค?
- ๊ทธ๋ฐ๋ฐ ์ง๊ธ์,
- const RecentProductStateContext = createContext(null) ์ด๊ฑธ ํ๊ณ
- <RecentProductStateContext.Provider> ์ด๊ฑธ ์จ์ ๋ง๋๋ค?
- ๋ฐ๋ก ์ฌ์ฉํ ์ ์๊ฒ, custom hook ์ ๋ง๋ค์ด์ค๋ค?
- ์ด๋ ๊ฒ ๋งํ๊ณ ์ง ๊ฒ useRecentProductStateContext
๊ทผ๋ฐ, ์ด์ธ์ ๊ฒ๋ค๋ ๋์ด๊ฐ ์ ์๊ฒ, ์ ์๋ ์ฒ๋ผ ์ถ๊ฐํด์ฃผ๋๊ฑฐ์ง? (#โโโโโโ #๋ญ์ง? ๊ทผ๋ฐ ์ ๋ฉ์ง์ง? ์ ์ด๊ฑธ ์ดํดํ๊ณ ์ถ์ง?)
[state ๋ง๋ค๊ธฐ] ์? ์ํ ๊ด๋ฆฌ๋ฅผ Map ์ผ๋ก ํด์ค๋ค๊ณ ? useMemo ๋ ์ฌ์ฉํ๋ค๊ณ ? ์ด๊ฒ๋ ๋ฉ์ง๋ฐ? (#โญโญโญโญโญ)
const [productMap, setProductMap] = useState(new Map())
const recentProducts = useMemo( () => {
// 1. ๋ง์ฝ, productMap ์ size ๊ฐ ์์ผ๋ฉด -> ๋น ๋ฐฐ์ด return ํด์ค
if(!productMap.size) return []
return [...productMap.values()]; // ๊ทธ๊ฒ ์๋๋ฉด, productMap ์์ values ๋ฅผ ๊บผ๋ด์ค
}, [productMap])
(์ด๋ ๊ฒ ๋ง๋ค๊ณ , ํ๋ฒ์ ๋ด๋ ค์ค๋ค๊ตฌ?)
(์ฌ๊ธฐ๊น์ง๋ฅผ '[state ๋ง๋ค๊ธฐ]' ๋ผ๊ณ ์ ์ํ๋ค. ๊ทธ ๋ค์ 'action' ์ ๋ง๋ ๋ค๊ณ ํ๋ค. ์ด ์ธ๋ถ ์ ์๋ฅผ ๋ด๊ฐ ํ ์ ์์ด์ผ ํ๋ค. #โญโญโญโญโญ)
[action] fetchHttpRequest ๋ฅผ ๋จ๋ ์ฌ์ฉํ๊ฑฐ๋, ๊ณ ๋ํ ํด์ ์ฌ์ฉํ ์ ์์.
- mall ์ด ๋น์ด์์ผ๋ฉด, api ๋ฅผ ํธ์ถ ํ์ง ์์๋ ๋ผ
- fetchHttpRequest (utils ์์ ์์)
- error ๊ฐ ๋ฐ์ํ๋ฉด -> ์ค๋ฅ๊ฐ error boundary ์ปดํฌ๋ํธ๋ก ํ๋ฌ๊ฐ๋ค. ์ฌ๊ธฐ์์ ๊ณตํต์ผ๋ก ์บ์นํด์ ์ฌ์ฉ ๊ฐ๋ฅ (#โญโญโญ ์ด๋ฌํ ํ๋ฆ์ ์ฝ๋ ์ฒ์์ ์ด๋ป๊ฒ ํ๊บผ๋ฒ์ ์์ง ์.)
์ด๋ ๊ฒ ํด์ update ํด์ ์ฐ๋ฉด ๋จ (#๐ข๐ข๐ข๐ข๐ข ์ ์ด ์ฝ๋๋ ์ด๊ฑฐ ์ง์ง)
์... localStorage ์์ ๊ฐ์ ธ์ฌ ๋, JSON.parse ํ๋ ๊ฒ๋ ๋ฐ๋ก ํ๋ค... ๋ฉ์ง๋ค. ๊ทธ๋ฆฌ๊ณ , ...productMap.keys() ์ด๋ ๊ฒ ํด์ ๋ค์ด๊ฐ๋ค? ์ด๊ฑด ๋ ๋ญ์ง (#โญโญโญโญโญโญโญโญโญโญโญ)
productMap ์ด productNo ๋ฅผ ๊ฐ๊ณ ์์ผ๋ฉด, ๊ตณ์ด, api ๋ฅผ ํธ์ถํ ํ์๊ฐ ์๋ค๋ ๋ก์ง์ ์ฌ๊ธฐ์์ ์ด์ผ ์๊ฐํด๋ด์ง. ๊ทธ๊ฒ๋ ์ด๋ ๊ฒ ๊ฐ๋จํ๊ฒ.
์ธ๋ถ์ ์ ๋ฌํด์ค ๊ฐ์, value ์ ์ถ๊ฐํ๋ค๊ณ ?
๋ ์ปดํฌ๋ํธ์์ '์ต๊ทผ ๋ณธ ์ํ ๊ธฐ๋ฅ' ์ด ํ์ํ๋, ์ด๊ฑธ provider ๋ก์จ ์ ๊ณต (#โญโญโญโญโญโญโญโญโญโญโญโญโญโญโญ)
(์ด๊ฒ ๊ทผ๋ฐ, ์, ์๋ํ๋๊ฑฐ์ง? | ์ ์๋ํ์ง? | ๋ฉ์ง๋ฐ โญโญโญโญโญโญโญ)
๊ทธ๋ฆฌ๊ณ ๋ค์, ProductDetail
๋ก ๊ฐ์, productNo ๊ฐ 0 ๋ณด๋ค ํด ๋, ์คํ๋๊ฒ ์ค์ ? (#โญโญ ์ด๊ฑด ์ ๋ณด๋ฉด ๋ชจ๋ฅด๋๊ฑฐ ์๋์ผ? ์ด flow ๋ฅผ ์ด๋ป๊ฒ ๋ค ์์ง)
(์ด๋ ๊ฒ ์ถ๊ฐํด์ฃผ๋ ๊ฑด ๋ ๋ญ์ง)
์ด๋ ๊ฒ ๋ ๋ญ๊ฐ๋ฅผ ๋ง๋ค์ด์ฃผ๋๋ฐ....... ์ด๊ฑธ ํด์ผ ๋๋๊ฑด๊ฐ
์์ฌ์ด ์
- ๊ตฌํํด์ผ ํ๋ ๊ธฐ์ ์ ๋นํด, ํ์ฌ ๊ธฐ๊ฐ์ด ๋๋ฌด ์งง๋ค.
- ์ค์ K์ฌ ํ๋ก์ ํธ๋ '๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ' ๋ก ๋์ด ์๋ค๋ ์ .
๋์ git ์ค๋ ฅ์ด ์ ๊ฐ์์ด ๋ ธ์ถ๋์๋ค... ๊ณต๋ถ๋ฅผ ํ์.
ํ๋ก์ ํธ ํจ์น ๋ฐ๊ธฐ... ๋ด git ์์ค....
- ์ต๋ฐ์ด ๊ฐ๋ฐ ๊ฐ์ด๋์์
git stash
๊ฐ ๋์ด.
์์ ์ ์ฅ์
์์,git remote add upstream https://skins.shopy.co.kr/shopby/aurora-skin.git
์ด๊ฑธ ์ฌ์ฉํ๋ค๋ ๊ฑด ๋ฌด์จ ์๋ฏธ์ง?๊ทธ๋ฅ, ํ์ฌ์ ๋ก์ปฌ temp ์ ์ฅ์๋ ์๊ฒฉ ์ ์ฅ์ ์ฃผ์ 'https://skins.shopy.co.kr/shopby/aurora-skin.git' ๋ฅผ ์ฐ๊ฒฐํ๊ณ ์ด๋ฆ์ upstream ์ผ๋ก ์ง๊ฒ ๋ค๋ ์๋ฏธ?
- ๋ฐ์์จ ๊ฑธ ์ด๋ ๊ฒ ํ์ธํ๋ ๊ตฌ๋.
- ์? ๋ฐ์์จ ๊ฑธ
fetch
๋ฅผ ์ฌ์ฉํด์ ๋ฐ์์จ๋ค๊ตฌ? (#โโโโโ ์ด๊ฒ ์ง์ง ๋ญ์ง #rebase ๊ฐ์๊ฑฐ ์์ด?)
fetch
์ดํ ๋ฐ๋กmerge
๋ฅผ ํ๋ค๊ณ ???????
๊ทธ๋ฌ๋ฉด,
incoming change
๋,current change
์ด๊ฒ ๋ญ๊ฐ ๋ค๋ฅธ๊ฑธ๊น๋์ถฉ๋ ํด๊ฒฐํ๊ณ ํจํค์ง ์ค์น -> ์ด๊ฑด,
yarn
์ผ๋ก ์ค์บ์ด
- ๊ทธ ๋ค์ ๋ฐ๋ก, temp ์ push ๋ฅผ ํ๋ค๊ณ ? rebase ๊ฐ์๊ฑฐ ์์ด?
์๋ํด๋ณผ ๊ฒ
- ์ธ๋ดํธ ์ฝํผ๋ ์ด์
์ฌ๊ธฐ ์ด๋ (#โญโญโญโญโญ)
์ค๋ ์ถ๊ฐ๋ก ๊ณต๋ถํ ๊ฒ ๊ธฐ๋ก
์ต๋ฐ์ด ํ๋ก์ ํธ ์ผ๊ธฐ
package.json ์์ serve ์คํ์ ์คํ๋๋ ๋๋ ํ ๋ฆฌ๊ฐ --baseDir=pc
์ด๋ ๊ฒ ์ค์ ํ๋ ๋จ | --baseDir='pc'
์ด๋ ๊ฒ ์ธ๋ฏธ์ฝ๋ก ์ ๋ฃ์ผ๋ ์ ๋จ (#โ
์ธ๋ฏธ ์ฝ๋ก ์ด ๋ค์ด๊ฐ ์์์.)
์๋ํ๋ ๋ฒ์
template ํ๊ทธ ๊ด๋ จ ์์
template ํ๊ทธ๋ฅผ html ์์ ์ด๋ค.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Example: shopby-partials</title> <!-- โญโญโญ --> <template shopby-partials="partials/common-meta.html" shopby-partials-js="partials/common-meta.js"></template> </head> <body> <h1>Welcome to the Example Page</h1> <script src="main.js"></script> </body> </html>
web components
์, ์ด๊ฒ web components ๊ตฌ๋
HandlebarsJS
- https://handlebarsjs.com/guide/#what-is-handlebars ๋ฅผ ์ฌ์ฉํ๋๊ตฌ๋
์ปค์คํ ์๋ฆฌ๋จผํธ
1) ์์ ์ฝ๋
// 1) ์ปค์คํ
์๋ฆฌ๋จผํธ ์ ์ํ๊ธฐ
class ProductKeyword extends HTMLElement {
connectedCallback() {
this.innerHTML = `
<div class="product-list__search-keyword-wrap">
<em class="product-list__search-keyword">${this.getAttribute('keywords')}</em>
<span>๊ฒ์๊ฒฐ๊ณผ</span>
</div>`;
}
}
// 'product-keyword' ๋ผ๋ ์ปค์คํ
ํ๊ทธ ์ ์
customElements.define('product-keyword', ProductKeyword);=
2) ์ปค์คํ
์๋ฆฌ๋จผํธ HTML ์์ ์ฌ์ฉํ๊ธฐ
<product-keyword keywords="๋
ธํธ๋ถ"></product-keyword>
'[ํ๋ก ํธ์๋(FE) ๊ฐ๋ฐ] (feat. ์ฃผ๋์ด) > TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
240815-์ธ์์ธ๊ณ์ค๋น-์๋๋ฒ๋ ์ฑํ (0) | 2024.08.15 |
---|---|
[240814] ์๋๋ฒ๋ ์ฑํ ์ธ์ ์ธ๊ณ (0) | 2024.08.15 |
240813 ์ผ์ผ ๊ฐ๋ฐ ์ผ์ง (0) | 2024.08.13 |