๋‚ด์žฅ ๋ธŒ๋ผ์šฐ์ € <link> ์ปดํฌ๋„ŒํŠธ๋Š” ์Šคํƒ€์ผ์‹œํŠธ์™€ ๊ฐ™์€ ์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋งํฌ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋กœ ๋ฌธ์„œ๋ฅผ ์ฃผ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

<link rel="icon" href="favicon.ico" />

๋ ˆํผ๋Ÿฐ์Šค

์Šคํƒ€์ผ์‹œํŠธ, ๊ธ€๊ผด, ์•„์ด์ฝ˜๊ณผ ๊ฐ™์€ ์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค๋ฅผ ๋งํฌํ•˜๊ฑฐ๋‚˜ ๋งํฌ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋กœ ๋ฌธ์„œ๋ฅผ ์ฃผ์„ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด, ๋‚ด์žฅ ๋ธŒ๋ผ์šฐ์ € <link> ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜์„ธ์š”. ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ์—์„œ๋“  <link>๋ฅผ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, React๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ํ•ด๋‹น DOM ์š”์†Œ๋ฅผ <head>์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.

<link rel="icon" href="favicon.ico" />

์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

Props

<link>๋Š” ๋ชจ๋“  ๊ณตํ†ต ์—˜๋ฆฌ๋จผํŠธ Props๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์†์„ฑ๋“ค์€ rel="stylesheet"์ธ ๊ฒฝ์šฐ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

  • precedence: ๋ฌธ์ž์—ด ํƒ€์ž…. <link> DOM ๋…ธ๋“œ๋ฅผ ๋ฌธ์„œ์˜ <head> ๋‚ด ๋‹ค๋ฅธ ์š”์†Œ์™€ ๋น„๊ตํ•˜์—ฌ ์ˆœ์œ„๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์–ด๋–ค ์Šคํƒ€์ผ์‹œํŠธ๊ฐ€ ๋‹ค๋ฅธ ์Šคํƒ€์ผ์‹œํŠธ๋ฅผ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’์€ ์šฐ์„ ์ˆœ์œ„์— ๋”ฐ๋ผ "reset", "low", "medium", "high"๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง„ ์Šคํƒ€์ผ์‹œํŠธ๋Š” <link> ๋˜๋Š” ์ธ๋ผ์ธ <style> ํƒœ๊ทธ ๋˜๋Š” preload๋‚˜ preinit ํ•จ์ˆ˜๋กœ ๋กœ๋“œ๋˜์—ˆ๋Š”์ง€์— ๊ด€๊ณ„์—†์ด ํ•จ๊ป˜ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • media: ๋ฌธ์ž์—ด ํƒ€์ž…. ์Šคํƒ€์ผ์‹œํŠธ๋ฅผ ํŠน์ • ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ์— ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.
  • title: ๋ฌธ์ž์—ด ํƒ€์ž…. ๋Œ€์ฒด ์Šคํƒ€์ผ์‹œํŠธ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์†์„ฑ๋“ค์€ rel=stylesheet์ธ ๊ฒฝ์šฐ์— ์ ์šฉ๋˜์ง€๋งŒ, React์˜ ์Šคํƒ€์ผ์‹œํŠธ์— ๋Œ€ํ•œ ํŠน๋ณ„ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

  • disabled: ๋ถˆ๋ฆฌ์–ธ ํƒ€์ž…. ์Šคํƒ€์ผ์‹œํŠธ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • onError: ํ•จ์ˆ˜. ์Šคํƒ€์ผ์‹œํŠธ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ์— ์‹คํŒจํ–ˆ์„ ๋•Œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
  • onLoad: ํ•จ์ˆ˜. ์Šคํƒ€์ผ์‹œํŠธ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์„ ๋•Œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์†์„ฑ๋“ค์€ rel="preload" ๋‚˜ rel="modulepreload"์ธ ๊ฒฝ์šฐ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

  • as: ๋ฌธ์ž์—ด ํƒ€์ž…. ๋ฆฌ์†Œ์Šค์˜ ์œ ํ˜•์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ๊ฐ’์€ audio, document, embed, fetch, font, image, object, script, style, track, video, worker์ž…๋‹ˆ๋‹ค.
  • imageSrcSet: ๋ฌธ์ž์—ด ํƒ€์ž…. as="image"์ธ ๊ฒฝ์šฐ์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€ ์†Œ์Šค์˜ ์ง‘ํ•ฉ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • imageSizes: ๋ฌธ์ž์—ด ํƒ€์ž…. as="image"์ธ ๊ฒฝ์šฐ์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์†์„ฑ๋“ค์€ rel="icon"์ด๋‚˜ rel="apple-touch-icon"์ธ ๊ฒฝ์šฐ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์†์„ฑ๋“ค์€ ๋ชจ๋“  ๊ฒฝ์šฐ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

  • href: ๋ฌธ์ž์—ด ํƒ€์ž…. ์—ฐ๊ฒฐ๋œ ๋ฆฌ์†Œ์Šค์˜ URL์ž…๋‹ˆ๋‹ค.
  • crossOrigin: ๋ฌธ์ž์—ด ํƒ€์ž…. ์‚ฌ์šฉํ•  CORS ์ •์ฑ…. ๊ฐ€๋Šฅํ•œ ๊ฐ’์€ anonymous์™€ use-credentials์ž…๋‹ˆ๋‹ค. as๊ฐ€ "fetch"๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.
  • referrerPolicy: ๋ฌธ์ž์—ด ํƒ€์ž…. ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ ๋ณด๋‚ผ Referrer ํ—ค๋”๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ๊ฐ’์€ no-referrer-when-downgrade (๊ธฐ๋ณธ๊ฐ’), no-referrer, origin, origin-when-cross-origin, unsafe-url์ž…๋‹ˆ๋‹ค.
  • fetchPriority: ๋ฌธ์ž์—ด ํƒ€์ž…. ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ๊ฐ’์€ auto (๊ธฐ๋ณธ๊ฐ’), high, low์ž…๋‹ˆ๋‹ค.
  • hrefLang: ๋ฌธ์ž์—ด ํƒ€์ž…. ์—ฐ๊ฒฐ๋œ ๋ฆฌ์†Œ์Šค์˜ ์–ธ์–ด์ž…๋‹ˆ๋‹ค.
  • integrity: ๋ฌธ์ž์—ด ํƒ€์ž…. ๋ฆฌ์†Œ์Šค์˜ ์•”ํ˜ธ ํ•ด์‹œ๋กœ ์ง„์œ„๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • type: ๋ฌธ์ž์—ด ํƒ€์ž…. ์—ฐ๊ฒฐ๋œ ๋ฆฌ์†Œ์Šค์˜ MIME ์œ ํ˜•์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ React ์†์„ฑ๋“ค์€ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • blocking: ๋ฌธ์ž์—ด ํƒ€์ž…. "render"๋กœ ์„ค์ •ํ•˜๋ฉด ์Šคํƒ€์ผ์‹œํŠธ๊ฐ€ ๋กœ๋“œ๋  ๋•Œ๊นŒ์ง€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•˜์ง€ ์•Š๋„๋ก ์ง€์‹œํ•ฉ๋‹ˆ๋‹ค. React๋Š” Suspense๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋” ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŠน๋ณ„ํ•œ ๋ Œ๋”๋ง ๋™์ž‘

React๋Š” <link> ์ปดํฌ๋„ŒํŠธ์— ํ•ด๋‹นํ•˜๋Š” DOM ์š”์†Œ๋ฅผ React ํŠธ๋ฆฌ์˜ ์–ด๋””์— ๋ Œ๋”๋งํ•˜๋“  ์ƒ๊ด€์—†์ด ํ•ญ์ƒ ๋ฌธ์„œ์˜ <head>์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค. <head>๋Š” DOM ๋‚ด์—์„œ <link>๊ฐ€ ์œ„์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ์œ„์น˜์ด์ง€๋งŒ, ํŠน์ • ํŽ˜์ด์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ <link> ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž์ฒด์ ์œผ๋กœ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ํŽธ๋ฆฌํ•˜๊ณ  ๊ตฌ์„ฑ์ด ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—๋Š” ๋ช‡ ๊ฐ€์ง€ ์˜ˆ์™ธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • <link>์— rel="stylesheet" ์†์„ฑ์ด ์žˆ๋Š” ๊ฒฝ์šฐ, ์ด ํŠน๋ณ„ํ•œ ๋™์ž‘์„ ์œ„ํ•ด ๋ฐ˜๋“œ์‹œ precedence ์†์„ฑ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฌธ์„œ ๋‚ด ์Šคํƒ€์ผ์‹œํŠธ์˜ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. React๋Š” ๋‹ค๋ฅธ ์Šคํƒ€์ผ์‹œํŠธ์™€์˜ ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด precedence ์†์„ฑ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. precedence ์†์„ฑ์ด ์ƒ๋žต๋œ ๊ฒฝ์šฐ ํŠน๋ณ„ํ•œ ๋™์ž‘์ด ์—†์Šต๋‹ˆ๋‹ค.
  • <link>์— itemProp ์†์„ฑ์ด ์žˆ๋Š” ๊ฒฝ์šฐ, ํŠน๋ณ„ํ•œ ๋™์ž‘์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด ์†์„ฑ์€ ๋ฌธ์„œ ์ „์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ํŽ˜์ด์ง€์˜ ํŠน์ • ๋ถ€๋ถ„์— ๋Œ€ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • <link>์— onLoad๋˜๋Š” onError ์†์„ฑ์ด ์žˆ๋Š” ๊ฒฝ์šฐ, ์—ฐ๊ฒฐ๋œ ๋ฆฌ์†Œ์Šค์˜ ๋กœ๋”ฉ์„ React ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์ˆ˜๋™์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์Šคํƒ€์ผ์‹œํŠธ์— ๋Œ€ํ•œ ํŠน๋ณ„ํ•œ ๋™์ž‘

๋˜ํ•œ, <link>๊ฐ€ ์Šคํƒ€์ผ์‹œํŠธ๋กœ ์—ฐ๊ฒฐ๋œ ๊ฒฝ์šฐ (์ฆ‰, ์†์„ฑ์— rel="stylesheet"๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ) React๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํŠน๋ณ„ํ•˜๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

  • ์Šคํƒ€์ผ์‹œํŠธ๊ฐ€ ๋กœ๋“œ๋˜๋Š” ๋™์•ˆ <link>๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” ์ผ์‹œ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.
  • ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋™์ผํ•œ ์Šคํƒ€์ผ์‹œํŠธ์— ๋Œ€ํ•œ ๋งํฌ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒฝ์šฐ, React๋Š” ์ค‘๋ณต๋œ ๋งํฌ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  DOM์— ๋‹จ์ผ ๋งํฌ๋งŒ ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋งํฌ๋Š” href ์†์„ฑ์ด ๋™์ผํ•˜๋ฉด ๊ฐ™์€ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค.

์œ„ ํŠน๋ณ„ํ•œ ๋™์ž‘์—๋Š” ๋‘ ๊ฐ€์ง€ ์˜ˆ์™ธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋งํฌ์— precedence ์†์„ฑ์ด ์—†์œผ๋ฉด ํŠน๋ณ„ํ•œ ๋™์ž‘์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ฌธ์„œ ๋‚ด ์Šคํƒ€์ผ์‹œํŠธ์˜ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— React๋Š” ๋‹ค๋ฅธ ์Šคํƒ€์ผ์‹œํŠธ์™€์˜ ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด precedence ์†์„ฑ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • onLoad, onError, disabled ์†์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ ํŠน๋ณ„ํ•œ ๋™์ž‘์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์†์„ฑ๋“ค์€ ์Šคํƒ€์ผ์‹œํŠธ ๋กœ๋”ฉ์„ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์ˆ˜๋™์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์œ„ ํŠน๋ณ„ํ•œ ์ฒ˜๋ฆฌ์—๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์˜ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋งํฌ๊ฐ€ ๋ Œ๋”๋ง ๋œ ํ›„์— React๊ฐ€ ์†์„ฑ ๋ณ€๊ฒฝ์„ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค. (๊ฐœ๋ฐœ ์ค‘์— ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.)
  • ๋งํฌ๋ฅผ ๋ Œ๋”๋งํ•œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ ํ•ด์ œ๋œ ํ›„์—๋„ React๋Š” ๋งํฌ๋ฅผ DOM์— ๋‚จ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ๋ฒ•

์•„์ด์ฝ˜, ์ •๊ทœํ™”๋œ URL, ํ•‘๋ฐฑPingback๊ณผ ๊ฐ™์€ ๊ด€๋ จ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๋งํฌ๋กœ ๋ฌธ์„œ์— ์ฃผ์„์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. React๋Š” ์ด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ React ํŠธ๋ฆฌ์˜ ์–ด๋””์— ๋ Œ๋”๋ง ๋˜๋“  ์ƒ๊ด€์—†์ด ๋ฌธ์„œ์˜ <head>์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.

import ShowRenderedHTML from './ShowRenderedHTML.js';

export default function BlogPage() {
  return (
    <ShowRenderedHTML>
      <link rel="icon" href="favicon.ico" />
      <link rel="pingback" href="http://www.example.com/xmlrpc.php" />
      <h1>My Blog</h1>
      <p>...</p>
    </ShowRenderedHTML>
  );
}

์Šคํƒ€์ผ์‹œํŠธ ์—ฐ๊ฒฐํ•˜๊ธฐ

์ปดํฌ๋„ŒํŠธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ‘œ์‹œ๋˜๊ธฐ ์œ„ํ•ด ํŠน์ • ์Šคํƒ€์ผ์‹œํŠธ์— ์˜์กดํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ์Šคํƒ€์ผ์‹œํŠธ์— ๋Œ€ํ•œ ๋งํฌ๋ฅผ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํƒ€์ผ์‹œํŠธ๊ฐ€ ๋กœ๋“œ๋˜๋Š” ๋™์•ˆ ์ปดํฌ๋„ŒํŠธ๋Š” ์ผ์‹œ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. precedence ์†์„ฑ์„ ์ œ๊ณตํ•ด์•ผ ํ•˜๋ฉฐ ์ด๋Š” React์— ์ด ์Šคํƒ€์ผ์‹œํŠธ๋ฅผ ๋‹ค๋ฅธ ์Šคํƒ€์ผ์‹œํŠธ์™€ ๋น„๊ตํ•˜์—ฌ ์–ด๋””์— ๋ฐฐ์น˜ํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ๋†’์€ ์šฐ์„ ์ˆœ์œ„์˜ ์Šคํƒ€์ผ์‹œํŠธ๋Š” ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„์˜ ์Šคํƒ€์ผ์‹œํŠธ๋ฅผ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค!

์Šคํƒ€์ผ์‹œํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ preinit ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋‹จ์ˆœํžˆ <link> ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์Šคํƒ€์ผ์‹œํŠธ๋ฅผ ๋” ๋นจ๋ฆฌ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด HTTP Early Hints ์‘๋‹ต์„ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

import ShowRenderedHTML from './ShowRenderedHTML.js';

export default function SiteMapPage() {
  return (
    <ShowRenderedHTML>
      <link rel="stylesheet" href="sitemap.css" precedence="medium" />
      <p>...</p>
    </ShowRenderedHTML>
  );
}

์Šคํƒ€์ผ์‹œํŠธ ์šฐ์„ ์ˆœ์œ„ ์ œ์–ดํ•˜๊ธฐ

์Šคํƒ€์ผ์‹œํŠธ๋Š” ์„œ๋กœ ์ถฉ๋Œํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ๊ฒฝ์šฐ ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ฌธ์„œ์—์„œ ๋‚˜์ค‘์— ์˜ค๋Š” ์Šคํƒ€์ผ์‹œํŠธ๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. React๋Š” precedence ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํƒ€์ผ์‹œํŠธ์˜ ์ˆœ์„œ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์‹œ์—์„œ๋Š” ์„ธ ๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์Šคํƒ€์ผ์‹œํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜๋ฉฐ, ๋™์ผํ•œ precedence ๊ฐ’์„ ๊ฐ€์ง„ ์Šคํƒ€์ผ์‹œํŠธ๋Š” <head>์—์„œ ํ•จ๊ป˜ ๊ทธ๋ฃนํ™”๋ฉ๋‹ˆ๋‹ค.

import ShowRenderedHTML from './ShowRenderedHTML.js';

export default function HomePage() {
  return (
    <ShowRenderedHTML>
      <FirstComponent />
      <SecondComponent />
      <ThirdComponent/>
      ...
    </ShowRenderedHTML>
  );
}

function FirstComponent() {
  return <link rel="stylesheet" href="first.css" precedence="first" />;
}

function SecondComponent() {
  return <link rel="stylesheet" href="second.css" precedence="second" />;
}

function ThirdComponent() {
  return <link rel="stylesheet" href="third.css" precedence="first" />;
}

Note the precedence values themselves are arbitrary and their naming is up to you. React will infer that precedence values it discovers first are โ€œlowerโ€ and precedence values it discovers later are โ€œhigherโ€.

์ค‘๋ณต์ด ์ œ๊ฑฐ๋œ ์Šคํƒ€์ผ์‹œํŠธ ๋ Œ๋”๋ง

์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋™์ผํ•œ ์Šคํƒ€์ผ์‹œํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜๋ฉด React๋Š” ๋ฌธ์„œ์˜ <head>์— ๋‹จ์ผ <link>๋งŒ ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.

import ShowRenderedHTML from './ShowRenderedHTML.js';

export default function HomePage() {
  return (
    <ShowRenderedHTML>
      <Component />
      <Component />
      ...
    </ShowRenderedHTML>
  );
}

function Component() {
  return <link rel="stylesheet" href="styles.css" precedence="medium" />;
}

itemProp ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ <link> ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฌธ์„œ ๋‚ด ํŠน์ • ํ•ญ๋ชฉ์— ๊ด€๋ จ ๋ฆฌ์†Œ์Šค ๋งํฌ๋กœ ์ฃผ์„์„ ๋‹ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ React๋Š” ์ด๋Ÿฌํ•œ ์ฃผ์„์„ ๋ฌธ์„œ์˜ <head>์— ๋ฐฐ์น˜ํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ React ์ปดํฌ๋„ŒํŠธ์™€ ๊ฐ™์ด ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.

<section itemScope>
<h3>Annotating specific items</h3>
<link itemProp="author" href="http://example.com/" />
<p>...</p>
</section>