note
Jekyll ํ ๋ง๋ฅผ ์ฌ์ฉํ Github ๋ธ๋ก๊ทธ ๋ง๋ค๊ธฐ (window)
Ruby์ Jekyll์ ์ด์ฉํ์ฌ GitHub Pages์์ ๋ธ๋ก๊ทธ๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ๋จ๊ณ๋ณ๋ก ์ดํด๋ณธ๋ค. Ruby ์ค์น๋จผ์ , Ruby๋ฅผ ์ค์นํด์ผ ํ๋ค. Ruby์ ๊ณต์ ์ค์น ํ๋ก๊ทธ๋จ์ธ RubyInstaller๋ฅผ ๋ฐฉ๋ฌธํ์ฌ ๊ถ์ฅํ๋ ์ต์ ๋ฒ์ ์ Ruby์ Devkit์ ๋ค์ด๋ก๋ํ๊ณ ์ค์นํ๋ค. https://rubyinstaller.org/downloads/ ์ค์น๊ฐ ์๋ฃ๋๋ฉด ์ปค๋งจ๋ ์ฐฝ์ ์ด๊ณ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์ฌ Ruby๊ฐ ์ ๋๋ก ์ค์น๋์๋์ง ํ์ธํ๋ค. ๋ฒ์ ์ ๋ณด๊ฐ ์ถ๋ ฅ๋๋ค๋ฉด ์ค์น๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋ ๊ฒ์ด๋ค.ruby -v ruby 3.3.4 (2024-07-09 revision be1089c8ec) [x64-mingw-ucrt] Jekyll ์ค์นRuby ์ค์น๊ฐ ์๋ฃ๋๋ฉด, Jekyll๊ณผ Bundler๋ฅผ ์ค์นํ ..
[CSS] transfrom ์คํ์ผ์ด ์ ์ฉ๋ ์์์ ์์์์์์ position: fixed๊ฐ ์ ์ฉ๋์ง ์๋ ์ด์
position: fixed ์ transform transfrom ์คํ์ผ์ด ์ ์ฉ๋ ์์์ ์์์์์์ position: fixed๋ฅผ ์ ์ฉ์ํค๋ฉด ์๋ํ๋๋ก ๋์ํ์ง ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ๋ณดํต ๋ทฐํฌํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ์์๋ฅผ ์์น์ํค๊ธฐ ์ํด fixed๋ฅผ ์ฌ์ฉํ์ง๋ง, transfrom์ด ์ ์ฉ๋ ์์์ ๋ด๋ถ์์๋ transfrom ์์๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐฐ์น๊ฐ ๋๊ฒ ๋๋ค. ์ด์ ๋ฅผ w3 ๊ณต์๋ฌธ์์์ ํ์ธํ ์ ์์๋ค. For elements whose layout is governed by the CSS box model, any value other than none for the transform property also causes the element to establish a containing block for..
[Next.js] Dynamic Imports
Next.js์์์ Lazy Loading Lazy Loading์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์๊ตฌ๋๋ ๋ฆฌ์์ค๋ฅผ ํ์ํ ๋๋ง ๋ก๋ํด์ ๋ก๋ฉ ์๋๋ฅผ ๊ฐ์ ํ๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํค๋ ์ ๋ต์ด๋ค. Next.js ์์ Lazy Loading ์ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ผ๋ก๋ ๋ ๊ฐ์ง๊ฐ ์๋ค. 1. Dynamic Imports 2. React.lazy()์ Suspense React.lazy()์ Suspense React.lazy()๋ React์์ ์ ๊ณตํ๋ ๋ด์ฅ ๊ธฐ๋ฅ์ผ๋ก ์ฝ๋๋ฅผ ๋ถํ ํ์ฌ ํ์ํ ์์ ์ ๋น๋๊ธฐ์ ์ผ๋ก ๋ก๋ํ ์ ์๋๋ก ํ๋ค. ์ด์ ํจ๊ป Suspense๋ lazy ์ปดํฌ๋ํธ๊ฐ ๋ก๋ ๋๋ ๋์ ๋์ฒดํด์ ๋ณด์ฌ์ค ์์๋ฅผ ์ง์ ํ ์ ์๋ค. React ํ๋ก์ ํธ ์ React Router ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํจ๊ป ์ฌ์ฉํด์ ํ์ด์ง ์ ํ ๋ก๋ฉ..
[Next.js] import ๊ฒฝ๋ก์ @๋ณ์นญ ์ฌ์ฉํ๊ธฐ
import ์ ๋ ๊ฒฝ๋ก & ๊ฒฝ๋ก ๋ณ์นญ next.js ํ๋ก์ ํธ ์ tsconfig.json ์ต์ ์ ํตํด ๊ฒฝ๋ก๋ฅผ ๋ณ์นญ์ผ๋ก ์ง์ ํ์ฌ ๊ฐ๋ ์ฑ์ ๋์ผ ์ ์๋ค. import ์ ๋ ๊ฒฝ๋ก // tsconfig.json / jsconfig.json { "compilerOptions": { "baseUrl": "./src" } } tsconfig.json ๋๋ jsconfig.json ํ์ผ์์ baseUrl ์ต์ ์ ์ ๋๊ฒฝ๋ก๋ก ๊ฐ์ ธ์ฌ ๊ฒฝ๋ก๋ฅผ ์์ฑํ๋ค. [ic]"baseUrl":"./src"[/ic] ์์ฑ ์ ์๋์ ๊ฐ์ด import ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ ์ ์๋ค. import ๊ฒฝ๋ก ๋ณ์นญ // tsconfig.json / jsconfig.json { "compilerOptions": { "paths": { "@/*": ["./sr..
Node.js๋ก CRA ์ ๊ธฐ๋ณธ ํ์ผ๊ณผ ํด๋ ํ ๋ฒ์ ์ธํ ํ๊ธฐ
๋ฆฌ์กํธ๋ฅผ ๊ณต๋ถํ๋ฉด์ CRA ๋๋ง๋ค ๋ฐ๋ณต์ ์ผ๋ก ๊ธฐ๋ณธ ํ์ผ์ ์์ฑํ๊ฑฐ๋ ํด๋๋ง ์์ ์ ํ๋ ๊ฒ์ด ์๊ฐ์ด ์๊น๋ค๋ ์๊ฐ์ด ๋ค์๋ค. ๋งค ๋ฒ component ๊ตฌ์กฐ๋ ํ์ผ์ด ๋ฐ๋์๊ธฐ ๋๋ฌธ์ ํ์ผ์ ๋ณต์ฌ ๋ถ์ฌ๋ฃ๊ธฐ๋ ์ ๋งคํ๋๋ฐ, ์ด ์์ ๋ค์ Node.js์ file system์ ์ด์ฉํด์ ์๋ํ๋ฅผ ํด๋ณด์๋ค. file system ๋ชจ๋ import Node.js์ ๋ด์ฅ๋์ด์๋ ํ์ผ์์คํ ์ ๋ถ๋ฌ์จ๋ค. const fs = require('fs'); ๋๋ ํ ๋ฆฌ ์ธํ ์์ฑํ ๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก๋ฅผ array์ ๋ด์ ์์ฑํด์ค๋ค. const arrDirectory = [ 'src/apis', 'src/components/Shared/BtnLike', 'src/components/Shared/NotFound', 'src/components..
[Deep Dive] 42์ฅ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ
๋๊ธฐ ์ฒ๋ฆฌ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ํ ๋ฒ์ ํ๋์ ํ์คํฌ๋ง ์คํํ ์ ์๋ ์ฑ๊ธ ์ค๋ ๋ ๋ฐฉ์์ผ๋ก ๋์ํ๋ค. ์ฑ๊ธ ์ค๋ ๋ ๋ฐฉ์์ ํ ๋ฒ์ ํ๋์ ํ์คํฌ๋ง ์คํํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฒ๋ฆฌ์ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ํ์คํฌ๋ฅผ ์คํํ๋ ๊ฒฝ์ฐ ๋ธ๋กํน(์์ ์ค๋จ)์ด ๋ฐ์ํ๋ค. ํ์ฌ ์คํ ์ค์ธ ํ์คํฌ๊ฐ ์ข ๋ฃํ ๋๊น์ง ๋ค์์ ์คํ๋ ํ์คํฌ๊ฐ ๋๊ธฐํ๋ ๋ฐฉ์์ ๋๊ธฐ ์ฒ๋ฆฌ๋ผ๊ณ ํ๋ค. setTimeout ํจ์๋ ์ผ์ ์๊ฐ์ด ๊ฒฝ๊ณผํ ์ดํ์ ์ฝ๋ฐฑ ํจ์๋ฅผ ํธ์ถํ์ง๋ง setTimeout ์ดํ์ ํ์คํฌ๋ฅผ ๋ธ๋กํนํ์ง ์๊ณ ๊ณง๋ฐ๋ก ์คํํ๋ค. ํ์ฌ ์คํ ์ค์ธ ํ์คํฌ๊ฐ ์ข ๋ฃ๋์ง ์์ ์ํ๋ผ ํด๋ ๋ค์ ํ์คํฌ๋ฅผ ๊ณง๋ฐ๋ก ์คํํ๋ ๋ฐฉ์์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ผ๊ณ ํ๋ค. setTimeout๊ณผ setInterval, HTTP์์ฒญ, ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ฐฉ..
[Deep Dive] 22์ฅ this
this ํค์๋ this๋ ์์ ์ด ์ํ ๊ฐ์ฒด ๋๋ ์์ ์ด ์์ฑํ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํค๋ ์๊ธฐ ์ฐธ์กฐ ๋ณ์๋ค. this๋ฅผ ํตํด ์์ ์ด ์ํ ๊ฐ์ฒด ๋๋ ์์ ์ด ์์ฑํ ์ธ์คํด์ค์ ํ๋กํผํฐ๋ ๋ฉ์๋๋ฅผ ์ฐธ์กฐํ ์ ์๋ค. ํจ์๋ฅผ ํธ์ถํ ๋ arguments ๊ฐ์ฒด์ this๊ฐ ์๋ฌต์ ์ผ๋ก ํจ์ ๋ด๋ถ์ ์ ๋ฌ๋๋ค. ๋จ, this๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ, ์ฆ this ๋ฐ์ธ๋ฉ์ ํจ์ ํธ์ถ ๋ฐฉ์์ ์ํด ๋์ ์ผ๋ก ๊ฒฐ์ ๋๋ค. // ์ ์ญ์์ this → ์ ์ญ ๊ฐ์ฒด window๋ฅผ ๊ฐ๋ฆฌํจ๋ค. console.log(this); //window // ์ผ๋ฐ ํจ์ ๋ด๋ถ์ this → ์ ์ญ ๊ฐ์ฒด window๋ฅผ ๊ฐ๋ฆฌํจ๋ค. function test() { console.log(this); // window } // stric mode๊ฐ ์ ์ฉ๋ ์ผ๋ฐ ํจ์ ๋ด๋ถ์ ..
[Deep Dive] 16์ฅ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ
16์ฅ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ ๋ด๋ถ ์ฌ๋กฏ๊ณผ ๋ด๋ถ ๋ฉ์๋ ์ด์ค ๋๊ดํธ([[...]])๋ก ๊ฐ์ผ ์ด๋ฆ๋ค์ด ๋ด๋ถ ์ฌ๋กฏ๊ณผ ๋ด๋ถ ๋ฉ์๋๋ค. ๋ด๋ถ ์ฌ๋กฏ๊ณผ ๋ด๋ถ ๋ฉ์๋๋ ECMAScript ์ฌ์์ ์ ์๋ ๋๋ก ๊ตฌํ๋์ด ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์์ ์ค์ ๋ก ๋์ํ์ง๋ง ๊ฐ๋ฐ์๊ฐ ์ง์ ์ ๊ทผํ ์ ์๋๋ก ์ธ๋ถ๋ก ๊ณต๊ฐ๋ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ ์๋๋ค. const o = {}; // ๋ด๋ถ ์ฌ๋กฏ์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๋ด๋ถ ๋ก์ง์ด๋ฏ๋ก ์ง์ ์ ๊ทผํ ์ ์๋ค. o.[[Prototype]] // Uncaught StyntaxError: Unexpected token '[' // ์ผ๋ถ ๋ด๋ถ ์ฌ๋กฏ๊ณผ ๋ด๋ถ ๋ฉ์๋์ ํํ์ฌ ๊ฐ์ ์ ์ผ๋ก ์ ๊ทผํ ์ ์๋ ์๋จ์ ์ ๊ณตํ๊ธฐ๋ ํ๋ค. o.__proto__ // Object.prototype ์์ฑ์ผ ๊ธฐ์ค Object.pro..
[JavaScript] ์ผํ ์ฐ์ฐ์ (Comma Operator)
์ผํ ์ฐ์ฐ์๋ MDN์์๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํ๋ค. ์ผํ ์ฐ์ฐ์๋ ๊ฐ ํผ์ฐ์ฐ์๋ฅผ ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ํ๊ฐํ๊ณ ๋ง์ง๋ง ํผ์ฐ์ฐ์์ ๊ฐ์ ๋ฐํํ๋ค. ์ผํ ์ฐ์ฐ์๋ ์ฃผ๋ก ์ฌ๋ฌ ๋์์ ํ๋์ ์ค์์ ์ฒ๋ฆฌํ๋ ค๋ ๋ณต์กํ ๊ตฌ์กฐ์์ ํ์ฉํ ์ ์๋ค. ์ฐ์ฐ์ ์ฐ์ ์์์์ ๊ฐ์ฅ ๋ฎ์ ์์๋ฅผ ๊ฐ์ง๊ธฐ๋๋ฌธ์ ๋จผ์ ์ํํ๊ธฐ ์ํด์๋ ๊ดํธ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. let x, y, z; x = 1, y = 2, z = 3; // 3 console.log(x); // 1 let a, b, c; a = (b = 5, c = 6); // 6 console.log(a); // 6 ์ผํ ์ฐ์ฐ์์ ํ์ฉ for ๋ฌธ const array = [ ['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i'], ]; for (let..
[Deep Dive] 14-15์ฅ
14์ฅ ์ ์ญ ๋ณ์์ ๋ฌธ์ ์ ๋ณ์์ ์๋ช ์ฃผ๊ธฐ ์ง์ญ ๋ณ์์ ์๋ช ์ฃผ๊ธฐ ์ ์ญ ๋ณ์์ ์๋ช ์ฃผ๊ธฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ช ์ฃผ๊ธฐ์ ๊ฐ๋ค. ํ์ง๋ง ํจ์ ๋ด๋ถ์์ ์ ์ธ๋ ์ง์ญ ๋ณ์๋ ํจ์๊ฐ ํธ์ถ๋๋ฉด ์์ฑ๋๊ณ ํจ์๊ฐ ์ข ๋ฃํ๋ฉด ์๋ฉธํ๋ค. ์ฆ, ์ง์ญ ๋ณ์์ ์๋ช ์ฃผ๊ธฐ๋ ํจ์์ ์๋ช ์ฃผ๊ธฐ์ ์ผ์นํ๋ค. ์ง์ญ ๋ณ์๊ฐ ํจ์๋ณด๋ค ์ค๋ ์์กดํ๋ ๊ฒฝ์ฐ๋ ์๋ค. ๋๊ตฐ๊ฐ ์ค์ฝํ๋ฅผ ์ฐธ์กฐํ๊ณ ์์ผ๋ฉด ์ค์ฝํ๋ ์๋ฉธํ์ง ์๊ณ ์์กดํ๊ฒ ๋๋ค. ์ง์ญ ๋ณ์๋ ํจ์๊ฐ ์์ฑํ ์ค์ฝํ์ ๋ฑ๋ก๋๋ค. ๋ฐ๋ผ์ ๋ณ์๋ ์์ ์ด ๋ฑ๋ก๋ ์ค์ฝํ๊ฐ ์๋ฉธ(๋ฉ๋ชจ๋ฆฌ ํด์ )๋ ๋๊น์ง ์ ํจํ๋ค. ๋ํ ํธ์ด์คํ ์ ์ค์ฝํ๋ฅผ ๋จ์๋ก ๋์ํ๋ฉฐ, ํธ์ด์คํ ์ ๋ณ์ ์ ์ธ์ด ์ค์ฝํ์ ์ ๋๋ก ๋์ด ์ฌ๋ ค์ง ๊ฒ์ฒ๋ผ ๋์ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ณ ์ ์ ํน์ง์ ๋งํ๋ค๊ณ ํ ์ ์๋ค. ์ ์ญ ๋ณ์์ ์๋ช ์ฃผ๊ธฐ ๋ธ..