๋ด์ฅ ๋ธ๋ผ์ฐ์ <link> ์ปดํฌ๋ํธ๋ ์คํ์ผ์ํธ์ ๊ฐ์ ์ธ๋ถ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๋งํฌ ๋ฉํ๋ฐ์ดํฐ๋ก ๋ฌธ์๋ฅผ ์ฃผ์ ์ฒ๋ฆฌํ ์ ์๊ฒ ํด์ค๋๋ค.
<link rel="icon" href="favicon.ico" />๋ ํผ๋ฐ์ค
<link>
์คํ์ผ์ํธ, ๊ธ๊ผด, ์์ด์ฝ๊ณผ ๊ฐ์ ์ธ๋ถ ๋ฆฌ์์ค๋ฅผ ๋งํฌํ๊ฑฐ๋ ๋งํฌ ๋ฉํ๋ฐ์ดํฐ๋ก ๋ฌธ์๋ฅผ ์ฃผ์ ์ฒ๋ฆฌํ๋ ค๋ฉด, ๋ด์ฅ ๋ธ๋ผ์ฐ์ <link> ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ์ธ์. ์ด๋ค ์ปดํฌ๋ํธ์์๋ <link>๋ฅผ ๋ ๋๋งํ ์ ์์ผ๋ฉฐ, React๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ํด๋น DOM ์์๋ฅผ <head>์ ๋ฐฐ์นํฉ๋๋ค.
<link rel="icon" href="favicon.ico" />์๋ ์์๋ฅผ ์ฐธ๊ณ ํ์ธ์.
Props
<link>๋ ๋ชจ๋ ๊ณตํต ์๋ฆฌ๋จผํธ Props๋ฅผ ์ง์ํฉ๋๋ค.
rel: ๋ฌธ์์ด ํ์ , ํ์, ๋ฆฌ์์ค์์ ๊ด๊ณ๋ฅผ ์ง์ ํฉ๋๋ค. React๋ ๋ค๋ฅธ ๋งํฌ์๋ ๋ฌ๋ฆฌrel="stylesheet"๋งํฌ๋ฅผ ํน๋ณํ๊ฒ ์ฒ๋ฆฌํฉ๋๋ค.
๋ค์ ์์ฑ๋ค์ 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"์ธ ๊ฒฝ์ฐ์ ์ ์ฉ๋ฉ๋๋ค.
sizes: ๋ฌธ์์ด ํ์ . ์์ด์ฝ์ ํฌ๊ธฐ๋ฅผ ์ง์ ํฉ๋๋ค.
๋ค์ ์์ฑ๋ค์ ๋ชจ๋ ๊ฒฝ์ฐ์ ์ ์ฉ๋ฉ๋๋ค.
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์ ์ด ์คํ์ผ์ํธ๋ฅผ ๋ค๋ฅธ ์คํ์ผ์ํธ์ ๋น๊ตํ์ฌ ์ด๋์ ๋ฐฐ์นํด์ผ ํ๋์ง ์๋ ค์ค๋๋ค. ๋์ ์ฐ์ ์์์ ์คํ์ผ์ํธ๋ ๋ฎ์ ์ฐ์ ์์์ ์คํ์ผ์ํธ๋ฅผ ๋ฎ์ด์ธ ์ ์์ต๋๋ค.
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>