Intro
์ฌํ ๋ค๋ ์ค๋๋ผ ํผ๊ณคํด์ ๊ณต๋ถ๋ฅผ ๋ง์ด ๋ชปํ๋ค. ์ฌํ ํ์ ์ฆ์ด ์ฌํ๋ค..๐ญ
์ฌํ ๋ค๋ ์ค๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ค ๊น๋จน์ ๊ธฐ๋ถ์ด๋ค์... ๊ฐ์ ๋ค์ ์ตํ์!!
์ค๋ ํ์ตํ ๋ด์ฉ
FE ์ฑ์ฉ ๊ณผ์ ๋ก ๋ฐฐ์ฐ๋ ์๋ฐ ์คํฌ๋ฆฝํธ
์ด๋ฒ์ฃผ๋ ๊ณ ์์ด ๊ฒ์ ์ฌ์ดํธ๋ฅผ ๊ตฌํํ๋ ์ค์ต์ ํ์ตํ๋ค.
๊ตฌํํด์ผ ํ ๋ถ๋ถ๋ค์ด ๋ง์์ ์๊ฐ๋ณด๋ค ๊ฝค ๋ณต์กํ๋ค. ์ฐจ๊ทผ์ฐจ๊ทผ ๊ฐ์๋ฅผ ๋ค์ผ๋ฉฐ ๋ฐ๋ผํด๋ณด๊ณ ํผ์์ ์ฝ๋๋ฅผ ์งค ์ ์๋๋ก ์ฐ์ต๋ ๋ง์ด ํด์ผ๊ฒ ๋ค.
์ค์ต ์ฒ์๋ถํฐ ์ค๋ฅ๊ฐ ๋์.. ์กฐ๊ธ ํค๋งธ๋ค.
์์ธ์ด ๋ฌด์์ธ์ง ์ฌ์ค ์ ๋ชจ๋ฅด๊ฒ ๋ค.
ํด๊ฒฐํ๋ค๊ฐ ํ๋ค์ด์ ์ฌ์๋ค๊ฐ ๋ค์ ์คํํ๋๊น ๋ ์๋๋ค.
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ ธ๋ ๋ชจ๋์ ์ญ์ ํ๊ณ ์บ์๋ฅผ ์ง์ด ํ ๋ค์ npm install์ ํด๋ณด์๋๋ฐ ํด๊ฒฐ๋์ง ์์๊ณ
rm -rf node_modules
rm -f package-lock.json
npm cache verify
http-server ์คํํ ๋ ํ์ฌ ๋๋ ํ ๋ฆฌ์์ HTTP ์๋ฒ๋ฅผ ์์ํ๋ฉฐ, ์บ์๋ฅผ ๋นํ์ฑํํ์ฌ ํ์ผ ๋ณ๊ฒฝ์ด ๊ฐ์ง๋ ๋๋ง๋ค ํญ์ ์๋ก์ด ๋ด์ฉ์ ์ ๊ณตํ๋ ๋ช ๋ น์ด๋ก ์์ ํด์ ์คํํ์๋๋ฐ๋ ํด๊ฒฐ๋์ง ์์๋ค.
http-server -c-1 .
๊ทผ๋ฐ ๋ ธํธ๋ถ์ ๋ค์ ์ผ๋๊น ์ ๋๋ค..!!
๋ญ๊ฐ ๋ฌธ์ ์์๊น๋ ํฌ๋กฌ๊ณผ ๊ด๋ จ๋ ๋ฌธ์ ์ธ ๊ฒ ๊ฐ๊ธฐ๋..
์ฝ๋ ๊ตฌ์กฐ ๋ถ์
- index.html
index.html์์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ค๋ฅผ ๋ถ๋ฌ์ฌ ๋ ์ ํธ์ด๋ ์ปดํฌ๋ํธ ํด๋์ค ๋ฑ์ ๋ชจ๋ ๋ก๋ํ ํ, main์ ์คํํด์ผ ํ๋ค.
๊ทธ๋์ script ์์์ ์ ์ํ์ฌ์ผ ํ๋ค.
- App.js
class App {
$target = null;
data = []; // react, vue ์ฒ๋ผ ์ปดํฌ๋ํธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. setState ๊ด๋ จ
constructor($target) {
this.$target = $target;
// ์ธ์คํด์ค ์์ฑ (searchInput, searchResult, imageInfo)
this.searchInput = new SearchInput({
$target,
onSearch: keyword => {
api.fetchCats(keyword).then(({ data }) => this.setState(data));
}
});
this.searchResult = new SearchResult({
$target,
initialData: this.data,
onClick: image => {
this.imageInfo.setState({
visible: true,
image
});
}
});
this.imageInfo = new ImageInfo({
$target,
data: {
visible: false,
image: null
}
});
}
setState(nextData) {
console.log(this);
this.data = nextData;
this.searchResult.setState(nextData);
}
}
์ปดํฌ๋ํธ๋ฅผ ์์ฑํ ํด๋์ค๋ค์ ๊ฐ์ง๊ณ App.js์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค. ๊ทธ๋ฆฌ๊ณ main.js ์์
App์ ๋ํ ์ธ์คํด์ค๋ฅผ ์์ฑํ์ฌ
์ต์ข ์ ์ผ๋ก id๊ฐ App์ธ ์๋ฆฌ๋จผํธ ์๋๋ก js๋ก ๋ง๋ DOM์ ์์ฑํ๊ฒ ๋๋ค.
๋คํฌ๋ชจ๋ ์ค์
@media (prefers-color-scheme: dark) {
body {
background-color: #000;
color: white;
}
}
๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ด ์ปดํจํฐ์ ์ํ๊ฐ ๋คํฌ๋ชจ๋์ธ์ง ๋ผ์ดํธ๋ชจ๋์ธ์ง์ ๋ฐ๋ผ ๋คํฌ๋ชจ๋๋ฅผ ์ค์ ํ ์ ์๋ค.
๋งฅ์์ ์ค์ > ํ๋ฉด ๋ชจ๋์์ ๋ผ์ดํธ/๋คํฌ ๋ชจ๋๋ฅผ ์ค์ ํ ์ ์๋ค.
๋คํฌ๋ชจ๋์ธ ๊ฒฝ์ฐ์ ๋ฏธ๋์ด์ฟผ๋ฆฌ์ ๋ด์ฉ์ด ์ ์ฉ๋๋ค.
๋ค์์ ๋ฏธ๋์ด ์ฟผ๋ฆฌ ๋ฌธ์์ด์ ๋ถ์ ๊ฒฐ๊ณผ๋ฅผ ๋ํ๋ด๋ ๋ช ๋ น์ด์ด๋ค.
window.matchMedia('(prefers-color-scheme: dark)').matches
matches ๋ช ๋ น์ด๋ Boolean ํ์์ผ๋ก ๋ฐํ๋๋ฉฐ ํด๋น ๋ฏธ๋์ด ์ฟผ๋ฆฌ๊ฐ ์ ์ฉ๋๋ฉด true ์๋์ด์์ผ๋ฉด false๋ฅผ ๋ฐํํ๋ค.
CSS ๋ณ์
:root[color-mode="dark"] {
--background: #000;
--textColor: white;
}
body {
background-color: var(--background);
color: var(--textColor);
}
css์์ ๋ณ์๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ฐฐ์ ๋ค.
https://developer.mozilla.org/ko/docs/Web/CSS/Using_CSS_custom_properties
์ฌ์ฉ์ ์ง์ CSS ์์ฑ ์ฌ์ฉํ๊ธฐ (๋ณ์) - CSS: Cascading Style Sheets | MDN
์ฌ์ฉ์ ์ง์ ์์ฑ(CSS ๋ณ์, ์ข ์ ๋ณ์)์ CSS ์ ์์๊ฐ ์ ์ํ๋ ๊ฐ์ฒด๋ก, ๋ฌธ์ ์ ๋ฐ์ ์ผ๋ก ์ฌ์ฌ์ฉํ ์์์ ๊ฐ์ ๋ด์ต๋๋ค. ์ฌ์ฉ์ ์ง์ ์์ฑ์ ์ ์ฉ ํ๊ธฐ๋ฒ์ ์ฌ์ฉํด ์ ์ํ๊ณ , (--main-color: black;)
developer.mozilla.org
์ฌ์ฉ์๊ฐ ์ ์ํ ์ด๋ฆ์ผ๋ก var()๋ฅผ ํตํด ๊ฐ์ ๋ถ๋ฌ์ฌ ์ ์๋ค.
:root๋ก ์ค์ ํ๋ฉด HTML ์ด๋์๋ ์ฌ์ฉ์ ์ง์ ์์ฑ์ ์ ๊ทผํ ์ ์๋ค.
๋ง๋ฌด๋ฆฌ
ํ์๋ณด๋ค ์ง์ค๋ ฅ๋ ๋จ์ด์ง๊ณ ๋๋ฌด ํผ๊ณคํด์ ํ์ต์ ๋ง์ด ๋ชปํ๋๋ฐ ๋ด์ผ์ ์ข ๋ ์ง์คํด์ ๊ณต๋ถํ ์ ์๋๋ก ํด์ผ๊ฒ ๋ค.
