๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์ „์ฒด ๊ธ€

(72)
[์„ฑ๋Šฅ ๊ฐœ์„ ] Next Image + blur data url vs. cloudinary 'use client';import { BlurImageOnLoad } from '@tripie-pyotato/design-system/@components';import API from 'constants/api-routes';const TripieBlurImage = ({ src }: { src: string; index: number }) => { return ;};export default TripieBlurImage;2025.02.15 - [๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป dev] - Nextjs blurDataUrl dynamic ํ•˜๊ฒŒ ์ œ๊ณตํ•˜๊ธฐ Nextjs blurDataUrl dynamicํ•˜๊ฒŒ ์ œ๊ณตํ•˜๊ธฐ์˜ค๋žœ๋งŒ์— ํฌ์ŠคํŒ…! ์˜ค๋Š˜์€ nextjs ์ด๋ฏธ์ง€ ์ปดํฌ๋„ŒํŠธ์—์„œ blurDataUrl์„ ํ™œ์šฉํ•ด์„œ ์ด๋ฏธ์ง€๊ฐ€ ์™„์ „ํžˆ ๋กœ..
[์„ฑ๋Šฅ ๊ฐœ์„ ] Font metrics override์œผ๋กœ Font ์ตœ์ ํ™”ํ•˜๊ธฐ ์›นํฐํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด font-display:swap์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ์ฝ˜ํ…์ธ ๋ฅผ fallback ํฐํŠธ๋กœ ๋ณด์—ฌ์ค˜์„œ FOIT๋ฅผ ์ œ๊ฑฐํ•˜๊ณ ,woff2๋‚˜ woff ๋“ฑ ์šฉ๋Ÿ‰์ด ์ ์€ ํฐํŠธ format์„ ์ œ๊ณตํ•ด์„œ ๋กœ๋“œ ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•ด ํฐํŠธ ์ตœ์ ํ™”๋ฅผ ํ•˜๊ธฐ๋„ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ํ•ด๋‹น ๋ฐฉ์‹์€ layout shift๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ์—๋Š” ๋ถ€์กฑํ•œ ์ ์ด ์žˆ๋‹ค.์˜ค๋Š˜์€ Font metrics override์™€ size-adjust๋ฅผ ํ†ตํ•ด layout shift๋ฅผ ์ตœ์†Œํ™”(์ œ๊ฑฐ)ํ•˜์—ฌ ํฐํŠธ ์ตœ์ ํ™”๋ฅผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋‹ค๋ฃจ๊ณ ์ž ํ•œ๋‹ค. ๋‹ค์Œ์€ fallback ํฐํŠธ๋ฅผ ์ œ๊ณตํ•ด์„œ ํ…์ŠคํŠธ ๋žœ๋”๋ฅผ ๊ฐ€์†ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.@font-face { font-family: 'MaruBuri'; src: local('MaruBuri'), url('../static/fon..
์„ธ์…˜ ์Šคํ† ๋ฆฌ์ง€, ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€ ์–ด๋–ค ๊ฑธ ์จ์•ผํ• ๊นŒ? 2025.03.13 - [๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป dev] - ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€ vs ์„ธ์…˜ ์Šคํ† ๋ฆฌ์ง€ vs ์ฟ ํ‚ค ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€ vs ์„ธ์…˜ ์Šคํ† ๋ฆฌ์ง€ vs ์ฟ ํ‚คhttp ํ”„๋กœํ† ์ฝœ์€ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์˜ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์ด ์šฉ์ดํ•˜๋„๋ก ์ค‘์š”ํ•œ ํ•ด์ค€๋‹ค. ๋‹ค๋งŒ http ํ”„๋กœํ† ์ฝœ์€ stateless ํ”„๋กœํ† ์ฝœ์ด๋ผ๋Š” ์ ์—์„œ ์„œ๋ฒ„๋‚˜ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์ด๋‚˜ ์‘๋‹ต์„ ํŠธ๋ž˜ํ‚น ํ•˜์ง€ ์•Špyotato-dev.tistory.com์ด์ „ ๋™์ž‘์ด ์• ๋งคํ–ˆ๋˜ ๋‚˜์˜ useFunnel ๊ณ ์ณ๋ณด๊ธฐ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ํผ๋„ ์Šคํƒญ๋งˆ๋‹ค ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ํ•  ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ–ˆ๋˜ ์ ์ด ์ƒ๊ฐ์ด ๋‚˜์„œ ๋‹ค๋ค„๋ณด๊ณ ์ž ํ•œ๋‹ค. ๊ทธ์ค‘ ์ด์ „์— ์‚ดํŽด๋ดค๋˜ ์„ธ์…˜/๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€ ๋ฐ ์ฟ ํ‚ค์™€ ๊ด€๋ จํ•ด์„œ ์„ ํƒํ•œ ์˜ต์…˜์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด๊ณ ์ž ํ•œ๋‹ค.๐Ÿค” ํƒญ์ด๋‚˜ ํŽ˜์ด์ง€๋ฅผ ๋‹ซ๊ณ  ๋‹ค์‹œ ์ง„์ž…ํ–ˆ์„ ๊ฒฝ์šฐ, ํ•ด๋‹น ์„ ํƒ์‚ฌํ•ญ์ด ์œ ์ง€๋˜์–ด์•ผํ• ๊นŒ? ์‚ญ..
๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€ vs ์„ธ์…˜ ์Šคํ† ๋ฆฌ์ง€ vs ์ฟ ํ‚ค http ํ”„๋กœํ† ์ฝœ์€ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์˜ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์ด ์šฉ์ดํ•˜๋„๋ก ์ค‘์š”ํ•œ ํ•ด์ค€๋‹ค. ๋‹ค๋งŒ http ํ”„๋กœํ† ์ฝœ์€ stateless ํ”„๋กœํ† ์ฝœ์ด๋ผ๋Š” ์ ์—์„œ ์„œ๋ฒ„๋‚˜ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์ด๋‚˜ ์‘๋‹ต์„ ํŠธ๋ž˜ํ‚น ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์ด๋‹ค. ํ•ด๋‹น ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋กœ์ปฌ/์„ธ์…˜ ์Šคํ† ๋ฆฌ์ง€ ๋ฐ ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์„œ๋ฒ„๋“ค ๊ฐ„์˜ ์š”์ฒญ์„ ํŠธ๋ž˜ํ‚น ํ•  ์ˆ˜ ์žˆ๋‹ค.TLDR;ํ•œ๋ˆˆ์— ๋น„๊ตํ•ด๋ณด๊ธฐlocal storagesession storagecookie์ €์žฅ ์šฉ๋Ÿ‰5MB ~ 10MB๋Œ€๋ถ€๋ถ„ 5MB์ตœ๋Œ€ 4KBpersistence๋ธŒ๋ผ์šฐ์ €/ํƒญ์„ ๋‹ซ์•„๋„ ์œ ์ง€, ์ง์ ‘ ๋˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์‚ญ์ œ๋ฅผ ํ•ด์ค˜์•ผ ์ œ๊ฑฐ๋œ๋‹ค.๋ธŒ๋ผ์šฐ์ €/ํƒญ์ด ๋‹ซํžˆ๋ฉด ์ œ๊ฑฐ๋จ์ฟ ํ‚ค ์„ค์ •์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค (session-base ๋˜๋Š” persist)scopeorigin, ๋„๋ฉ”์ธ์ด๋‚˜ ํ”„๋กœํ† ์ฝœ์— ์˜ํ•ด ๊ฐ๊ฐ ์ €์žฅ๋จ..
[ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ] Type error: Re-exporting a type when 'isolatedModules' is enabled requires using 'export type'. 2025.03.12 - [๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป dev] - ๐Ÿฌ React import ์‹œ Wrapper ํŒจํ„ด ํ™œ์šฉํ•ด ๋ณด๊ธฐ ๊ณผ ๊ฐ™์ด importํ•˜๋Š” ๊ฒฝ์šฐ" data-og-host="pyotato-dev.tistory.com" data-og-source-url="https://pyotato-dev.tistory.com/entry/%F0%9F%8D%AC-React-import-%EC%8B%9C-Wrapper-%ED%8C%A8%ED%84%B4-%ED%99%9C%EC%9A%A9%ED%95%B4%EB%B3%B4%EA%B8%B0" data-og-url="https://pyotato-dev.tistory.com/entry/%F0%9F%8D%AC-React-import-%EC%8B%9C-Wrapper-%ED%8C%A8%ED%..
๐Ÿฌ React import ์‹œ Wrapper ํŒจํ„ด ํ™œ์šฉํ•ด๋ณด๊ธฐ ์ตœ๊ทผ์— ๋ฆฌ์•กํŠธ์—์„œ import ์‹œ์— wrapper ํŒจํ„ด์„ ํ™œ์šฉํ–ˆ๋‹ค๋Š” ๊ธ€์„ ์ฝ์—ˆ๋‹ค.lodash๋‚˜ Framer Motion๋ฅผ ์ „์ฒด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‹จ์œ„๋กœ importํ•˜๋Š” ์ƒํ™ฉ์ด ์ข…์ข… ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.์˜ˆ๋ฅผ ๋“ค์–ด, lodash๋ฅผ > ๊ณผ ๊ฐ™์ด importํ•˜๋Š” ๊ฒฝ์šฐ์™€ ๊ฐ™๋‹ค.>import _ from 'lodash' -> imported 71.78KB>import debounce from "lodash/debounce"; -> imported 3.41KBimport merge from 'lodash/merge'; -> imported 16KB๋ฌผ๋ก  ์ „์ฒด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ importํ•˜๊ณ  ์žˆ์ง€๋Š” ์•Š์ง€๋งŒ, ๊ธ€์“ด์ด๊ฐ€ ์–ธ๊ธ‰ํ•œ ๋ฐ”์™€ ๊ฐ™์ด, ์—ฌ๊ธฐ์ €๊ธฐ ํฉ์–ด์ ธ ์žˆ๋Š” ํŒŒ์ผ๋“ค๋งˆ๋‹ค framer-motion๋‚˜ className/bind๋ฅผ importํ•˜๊ณ ..
๐Ÿ‘‹ ๊ตฟ๋ฐ”์ด CRA (Sunsetting Create React App) TLDR;๋ฆฌ์•กํŠธ ์•ฑ์„ ์„ค์น˜ํ•˜๊ธฐ ์œ„ํ•ด CRA๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ณ„์…จ๋‚˜์š”? ์ด์ œ๋Š” CRA๊ฐ€ deprecate ๋ฉ๋‹ˆ๋‹ค.ํ•ด๋‹น ์ด์œ ๋Š” ํฌ๊ฒŒ CRA๋Š” ๋ผ์šฐํŒ…, ๋ฐ์ดํ„ฐ fetching, ์ฝ”๋“œ ์Šคํ”Œ๋ฆฟ์„ ์ž์ฒด์ ์œผ๋กœ ์ง€์›ํ•˜์ง€ ์•Š์•„ ์ถ”๊ฐ€์ ์œผ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜์กดํ•ด์•ผํ–ˆ๋‹ค๋Š” ์ , ์ตœ๊ทผ ๋งŽ์€ ํ”„๋ ˆ์ž„์›Œํฌ๋“ค์ด ํ•ด๋‹น ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ–ˆ๊ณ  ํ•ด๋‹น ๊ธฐ๋Šฅ๋“ค์„ ์œ„ํ•ด CRA๊ด€๋ฆฌ๊ฐ€ ๋ถˆํ•„์š”ํ•ด์กŒ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.ํ”„๋ ˆ์ž„์›Œํฌ๋‚˜ ๋นŒ๋“œ ํˆด๋กœ ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๊ธฐ๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ๋น„๋ก CRA+๋นŒ๋“œ ํˆด๋„ ์„ ํƒ ๊ฐ€๋Šฅํ•œ ์˜ต์…˜์ด์ง€๋งŒ ๋ผ์šฐํŒ…, ๋ฐ์ดํ„ฐ fetching, ์ฝ”๋“œ ์Šคํ”Œ๋ฆฟ ๊ธฐ๋Šฅ์„ “์ž˜” ํ†ตํ•ฉํ•ด๋†“์€ Next.js, React Router, Expo์™€ ๊ฐ™์€ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.์œ„์˜ ํ”„๋ ˆ์ž„์œ„ํฌ๋“ค์€ SSR๊ณผ CSR ์˜ต์…˜ ๋ชจ๋‘ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.SSR์ด SEO๋ฟ๋งŒ..
์„ฑ๋Šฅ - intro https://web.dev/learn/performance Learn Performance  |  web.devThis course is designed for those new to web performance, a vital aspect of the user experience. It covers key web performance concepts and techniques for improving performance.web.dev"์„ฑ๋Šฅ์„ ์ฑ™๊ฒจ์•ผ์ง€"๋ผ๊ณ  ์ƒ๊ฐ์€ ํ–ˆ๊ณ , ์ž‘๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•๋“ค์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ณ  ์—ฌ๊ธฐ์ €๊ธฐ ์‹ค์ฒœํ–ˆ์ง€๋งŒ, ์ด๋ก ์ ์ธ ๊ฒƒ์„ ๋‚ด๊ฐ€ ์ž˜ ์•Œ๊ณ , ์—ฐ๊ฒฐ ์ง€์–ด ์‹ค์ œ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€๋ฅผ ์ƒ๊ฐํ•˜๋ฉด 100% ์ž์‹  ์žˆ๊ฒŒ ๊ทธ๋ ‡๋‹ค๊ณ  ํ•˜๊ธฐ ์–ด๋ ค์›Œ ์•„์‰ฌ์› ๋‹ค.์ด๋ฒˆ์—๋Š” web.dev๋ฅผ ํ†ตํ•ด ์•Œ๊ณ  ์žˆ์—ˆ๋˜ ..