REACT

CSR์˜ ๋Œ€ํ‘œ์ ์ธ ๋‹จ์  ์ค‘ ํ•˜๋‚˜์ธ ์ทจ์•ฝํ•œ SEO ์ ์ˆ˜์™€ ๋ชจ๋“ ์‚ฌ๋žŒ๋“ค์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์›น ์ ‘๊ทผ์„ฑ ๊ฐœ์„ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผํ•œ๋‹ค.    ์›น ์ ‘๊ทผ์„ฑ๊ณผ SEO์„ ๊ฐœ์„ ํ•˜๊ธฐ ์ด์ „์˜ ์ ์ˆ˜์ด๋‹ค.์ ‘๊ทผ์„ฑ์€ ํŽ˜์ด์ง€ ๋งˆ๋‹ค ์ƒ์ดํ•˜์ง€๋งŒ, ๊ฐ€์žฅ ๋‚ฎ์€ ๋ฉ”์ธํŽ˜์ด์ง€์˜ ์ ์ˆ˜๊ฐ€ 69์ , SEO ์ ์ˆ˜๋Š” 83์ ์„ ๊ธฐ๋กํ•˜์˜€๋‹ค. SEO : ๊ฒ€์ƒ‰์—”์ง„ ์ตœ์ ํ™”๐Ÿ” React์˜ SEO๋ฆฌ์•กํŠธ์™€ ๊ฐ™์€ SPA๋Š” SSR๊ณผ๋Š” ๋‹ฌ๋ฆฌ, ์ดˆ๊ธฐ์— HTML์ด ์ตœ์†Œํ•œ์˜ ๋‚ด์šฉ์„ ํฌํ•จํ•˜๊ณ , ๋Œ€๋ถ€๋ถ„์˜ ์ฝ˜ํ…์ธ ๋Š” JS๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์ธก์—์„œ ๋ Œ๋”๋ง์ด ๋˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ๋ชจ๋“  ํฌ๋กค๋Ÿฌ๊ฐ€ ์•„๋‹Œ ๋งŽ์€ ํฌ๋กค๋Ÿฌ๋“ค์ด JS๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด์™€ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.(๊ตฌ๊ธ€๋ด‡์€ JS๋ฅผ ์ง€์›ํ•ด์„œ SEO๊ฐ€ ๋‚˜์˜์ง€ ์•Š๋‹ค๊ณ  ํ•จ)Next.js๋ฅผ ์ด์šฉํ•œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋ณ„๋‹ค๋ฅธ ์ž‘์—…์„ ..
์ง„ํ–‰์ค‘์ธ ํ”„๋กœ์ ํŠธ๋Š” ๋ฐ˜๋ ค๋™๋ฌผ์˜ ๊ธฐ๋ก๊ณผ ์‚ฌ์ง„ ๊ณต์œ ๊ฐ€ ์ฃผ๋œ ๊ธฐ๋Šฅ์ธ ๋งŒํผ, ์ด๋ฏธ์ง€ ์ตœ์ ํ™” ์ž‘์—…์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.๋ฒˆ๋“ค์‚ฌ์ด์ฆˆ๋ฅผ ์—ด์‹ฌํžˆ ์ค„์—ฌ๋„ KB๋‹จ์œ„์ง€๋งŒ.. ์ด๋ฏธ์ง€๋Š” ๋‹จ์œ„๋ถ€ํ„ฐ MB์ด๋ฏ€๋กœ, ์ด๋ฏธ์ง€ ์ตœ์ ํ™”๋Š” ํ•„์ˆ˜์ด๋‹ค. Next.js์˜ ์ด๋ฏธ์ง€ ์ตœ์ ํ™”Next.js๋Š” next/image๋ฅผ ํ†ตํ•ด ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด๋ฏธ์ง€ ์ตœ์ ํ™” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์ค€๋‹ค.But, ๋ฆฌ์•กํŠธ๋Š” ์ด์™€ ๊ฐ™์€ ์ด๋ฏธ์ง€ ์ตœ์ ํ™”๋ฅผ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์ฃผ์ง€ ์•Š์œผ๋ฏ€๋กœ, ์ง์ ‘ ์ตœ์ ํ™” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผํ•œ๋‹ค...!๐Ÿซฃ  ์ž๋™ resizingWebp ๊ฐ™์€ ์ตœ์‹  ์ด๋ฏธ์ง€ ํฌ๋งท ์ง€์›Lazy Loading๋กœ ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์†๋„ ํ–ฅ์ƒCDN ์ง€์›์ด๋ฏธ์ง€ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•๋“ค์„ ๊ณต๋ถ€ํ•ด๋ฉด์„œ, ์ ์šฉํ•ด๋ณด์•˜๋‹ค.  1. browser-image-compression ํ™œ์šฉํ•œ ์ด๋ฏธ์ง€ ํญ, ํƒ€..
์ฑ„ํŒ… ์ž…๋ ฅ์ฐฝ์— ์ด๋ชจ์ง€ ์•„์ด์ฝ˜์„ ๋ˆ„๋ฅด๋ฉด, ์ด๋ชจํ‹ฐ์ฝ˜ ํ‚ค๋ณด๋“œ๊ฐ€ ๋‚˜์™€ ์ด๋ชจ์ง€๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๊ฒŒ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์—ˆ๋‹ค.  emoji-picker-react const [showPicker, setShowPicker] = useState(false); const [message, setMessage] = useState("");const onEmojiClick = (event, emojiObject) => { setMessage((prevMessage) => prevMessage + emojiObject.emoji); setShowPicker(false); }; return ( setMessage(e.target.value)} > ..
keyDown/keyUp ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ• ๋•Œ, ์˜์–ด๋Š” ๊ดœ์ฐฎ์ง€๋งŒ ํ•œ๊ตญ์–ด๋กœ ์ž…๋ ฅํ•˜๋ฉด ์ด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ๐Ÿค” Why? ์ด ๋ฌธ์ œ๋Š” ํ•œ๊ธ€์˜ ์กฐํ•ฉํ˜• ์ž…๋ ฅ ๋ฐฉ์‹ ๋•Œ๋ฌธ์ด๋ผ๊ณ ํ•œ๋‹ค. ํ•œ๊ธ€ ์ž…๋ ฅ์€ ์—ฌ๋Ÿฌ ํ‚ค ์ž…๋ ฅ์ด ์กฐํ•ฉ๋˜์–ด ํ•˜๋‚˜์˜ ๊ธ€์ž๋ฅผ ์™„์„ฑํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์น˜๊ธฐ ๋•Œ๋ฌธ์—, key Event๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์‹œ์ ์—๋Š” ์ž…๋ ฅ์ด ์™„์ „ํžˆ ์™„์„ฑ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.  e.nativeEvent.isComposing  ์ด ์†์„ฑ์€ ์‚ฌ์šฉ์ž๊ฐ€ ํ…์ŠคํŠธ ์ž…๋ ฅ ์ค‘์— ๋ฌธ์ž ์กฐํ•ฉ(์˜ˆ: ํ•œ๊ธ€ ์ž์Œ๊ณผ ๋ชจ์Œ ์กฐํ•ฉ)์ด ์ง„ํ–‰ ์ค‘์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ‚ค ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ์ž…๋ ฅ์ด ์™„์„ฑ๋œ ์ƒํƒœ์ธ์ง€๋ฅผ ํ™•์ธํ•˜์—ฌ, ์ž…๋ ฅ์˜ ์™„์„ฑ์ด ๋œ ๊ฒฝ์šฐ์—๋งŒ ๊ฒ€์ƒ‰์ฒ˜๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ํ•œ๋‹ค. const handleKeyDown: Keyboar..
Yuuuki
'REACT' ํƒœ๊ทธ์˜ ๊ธ€ ๋ชฉ๋ก