<script>
๋ด์ฅ ๋ธ๋ผ์ฐ์ <script>
์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฌธ์์ ์คํฌ๋ฆฝํธ๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
<script> alert("hi!") </script>
๋ ํผ๋ฐ์ค
<script>
๋ฌธ์์ ์ธ๋ผ์ธ ๋๋ ์ธ๋ถ ์คํฌ๋ฆฝํธ๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด ๋ด์ฅ ๋ธ๋ผ์ฐ์ <script>
์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ์ธ์. <script>
๋ ์ด๋ค ์ปดํฌ๋ํธ์์๋ ๋ ๋๋งํ ์ ์์ผ๋ฉฐ, React๋ ํน์ ๊ฒฝ์ฐ์ ํด๋น DOM ์์๋ฅผ ๋ฌธ์์ <head>
์ ๋ฐฐ์นํ๊ณ ์ค๋ณต๋ ๋์ผ ์คํฌ๋ฆฝํธ๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
<script> alert("hi!") </script>
<script src="script.js" />
์๋ ์์๋ฅผ ์ฐธ๊ณ ํ์ธ์.
Props
<script>
๋ ๋ชจ๋ ๊ณตํต ์ปดํฌ๋ํธ ์์ฑ์ ์ง์ํฉ๋๋ค.
children
๋๋ src
์์ฑ์ ๊ฐ์ ธ์ผ ํฉ๋๋ค.
children
: ๋ฌธ์์ด. ์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ์ ์์ค ์ฝ๋.src
: ๋ฌธ์์ด. ์ธ๋ถ ์คํฌ๋ฆฝํธ์ URL.
์ง์ํ๋ ๋ค๋ฅธ ์์ฑ๋ค:
async
: ๋ถ๋ฆฌ์ธ ๊ฐ. ๋ธ๋ผ์ฐ์ ๊ฐ ๋ฌธ์์ ๋จ์ ๋ถ๋ถ์ ์ฒ๋ฆฌํ ๋๊น์ง ์คํฌ๋ฆฝํธ ์คํ์ ์ฐ๊ธฐํ ์ ์๋๋ก ํฉ๋๋ค. ์ด๋ ์ฑ๋ฅ์ ์ํ ์ฐ์ ์ ์ธ ๋์ ๋ฐฉ์์ ๋๋ค.crossOrigin
: ๋ฌธ์์ด. ์ฌ์ฉํ CORS ์ ์ฑ ์ ๋๋ค. ๊ฐ๋ฅํ ๊ฐ์anonymous
์use-credentials
์ ๋๋ค.fetchPriority
: ๋ฌธ์์ด. ์ฌ๋ฌ ์คํฌ๋ฆฝํธ๋ฅผ ๋์์ ๊ฐ์ ธ์ฌ ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์คํฌ๋ฆฝํธ๋ฅผ ์ฐ์ ์์๋ก ์์ ์ง์ ํ ์ ์๋๋ก ํฉ๋๋ค."high"
,"low"
, ๋๋"auto"
(๊ธฐ๋ณธ๊ฐ)์ผ ์ ์์ต๋๋ค.integrity
: ๋ฌธ์์ด. ์คํฌ๋ฆฝํธ์ ์ํธํ ํด์๋ก, ์ง์์ฑ์ ๊ฒ์ฆํฉ๋๋ค.noModule
: ๋ถ๋ฆฌ์ธ ๊ฐ. ES ๋ชจ๋์ ์ง์ํ๋ ๋ธ๋ผ์ฐ์ ์์ ์คํฌ๋ฆฝํธ๋ฅผ ๋นํ์ฑํํฉ๋๋ค. ES ๋ชจ๋์ ์ง์ํ์ง ์๋ ๋ธ๋ผ์ฐ์ ์ ๋ํ ๋์ฒด ์คํฌ๋ฆฝํธ๋ฅผ ํ์ฉํฉ๋๋ค.nonce
: ๋ฌธ์์ด. ์๊ฒฉํ ์ฝํ ์ธ ๋ณด์ ์ ์ฑ ์ ์ฌ์ฉํ ๋ ๋ฆฌ์์ค๋ฅผ ํ์ฉํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์ํธํ๋ nonce์ ๋๋ค.referrer
: ๋ฌธ์์ด. ์คํฌ๋ฆฝํธ๋ฅผ ๊ฐ์ ธ์ค๊ณ ์คํฌ๋ฆฝํธ๊ฐ ๋ค์ ๊ฐ์ ธ์จ ๋ฆฌ์์ค๋ฅผ ๊ฐ์ ธ์ฌ ๋ ๋ณด๋ผ Referer ํค๋๋ฅผ ์ง์ ํฉ๋๋ค.type
: ๋ฌธ์์ด. ์คํฌ๋ฆฝํธ๊ฐ ์ ํต์ ์ธ ์คํฌ๋ฆฝํธ, ES ๋ชจ๋ ๋๋ import ๋งต์ธ์ง๋ฅผ ๋ํ๋ ๋๋ค.
React์ ์คํฌ๋ฆฝํธ ํน์ ์ฒ๋ฆฌ๋ฅผ ๋นํ์ฑํํ๋ ์์ฑ๋ค:
onError
: ํจ์. ์คํฌ๋ฆฝํธ์ ๋ก๋ฉ์ ์คํจํ์์ ๋ ํธ์ถ๋ฉ๋๋ค.onLoad
: ํจ์. ์คํฌ๋ฆฝํธ์ ๋ก๋ฉ์ ์๋ฃํ์์ ๋ ํธ์ถ๋ฉ๋๋ค.
React์์ ๊ถ์ฅํ์ง ์๋ ์์ฑ๋ค:
blocking
: ๋ฌธ์์ด."render"
๋ก ์ค์ ํ๋ฉด ํ์ด์ง๊ฐ ์คํฌ๋ฆฝํธ์ํธ๋ฅผ ๋ก๋ํ ๋๊น์ง ๋ธ๋ผ์ฐ์ ์๊ฒ ํ์ด์ง๋ฅผ ๋ ๋๋งํ์ง ์๋๋ก ์ง์ํฉ๋๋ค. React๋ Suspense๋ฅผ ์ฌ์ฉํ์ฌ ๋ ์ธ๋ฐํ ์ ์ด๋ฅผ ์ ๊ณตํฉ๋๋ค.defer
: ๋ฌธ์์ด. ๋ฌธ์๊ฐ ๋ก๋ฉ๋ ๋๊น์ง ๋ธ๋ผ์ฐ์ ๊ฐ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ์ง ๋ชปํ๋๋ก ํฉ๋๋ค. ์คํธ๋ฆฌ๋ฐ ์๋ฒ์ ๋ ๋๋ง๋ ์ปดํฌ๋ํธ์ ํธํ๋์ง ์์ต๋๋ค. ๋์async
์์ฑ์ ์ฌ์ฉํ์ธ์.
ํน๋ณํ ๋ ๋๋ง ๋์
React๋ <script>
์ปดํฌ๋ํธ๋ฅผ ๋ฌธ์์ <head>
๋ก ์ด๋์ํค๊ณ , ์ค๋ณต๋ ๋์ผ ์คํฌ๋ฆฝํธ๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
์ด ๋์์ ์ฌ์ฉํ๋ ค๋ฉด src
์ async={true}
์์ฑ์ ์ ๊ณตํ์ธ์. React๋ src
๊ฐ ๋์ผํ ๊ฒฝ์ฐ์๋ง ์ค๋ณต๋ ์คํฌ๋ฆฝํธ๋ฅผ ์ ๊ฑฐํฉ๋๋ค. ์คํฌ๋ฆฝํธ๋ฅผ ์์ ํ๊ฒ ์ด๋ํ๋ ค๋ฉด async
์์ฑ์ด ๋ฐ๋์ true
์ฌ์ผ ํฉ๋๋ค.
์ด ํน๋ณํ ์ฒ๋ฆฌ์๋ ๋ ๊ฐ์ง ์ฃผ์ ์ฌํญ์ด ์์ต๋๋ค.
- React๋ ์คํฌ๋ฆฝํธ๋ฅผ ๋ ๋๋งํ ํ์ ์์ฑ ๋ณ๊ฒฝ์ ๋ฌด์ํฉ๋๋ค. (๊ฐ๋ฐ ํ๊ฒฝ์์๋ ์ด๋ฌํ ๊ฒฝ์ฐ์ ๊ฒฝ๊ณ ๊ฐ ๋ฐ์ํฉ๋๋ค.)
- React๋ ์ปดํฌ๋ํธ๋ฅผ ๋ง์ดํธ ํด์ ํ ํ์๋ DOM์ ์คํฌ๋ฆฝํธ๋ฅผ ๋จ๊ธธ ์ ์์ต๋๋ค. (์คํฌ๋ฆฝํธ๋ DOM์ ์ฝ์ ๋ ๋ ํ ๋ฒ๋ง ์คํ๋๋ฏ๋ก ์ด๊ฒ์ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค.)
์ฌ์ฉ๋ฒ
์ธ๋ถ ์คํฌ๋ฆฝํธ ๋ ๋๋ง
ํน์ ์คํฌ๋ฆฝํธ์ ์์กดํ์ฌ ์ปดํฌ๋ํธ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ํ์ํด์ผ ํ๋ค๋ฉด, ์ปดํฌ๋ํธ ๋ด์์ <script>
๋ฅผ ๋ ๋๋งํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์คํฌ๋ฆฝํธ ๋ก๋ฉ์ด ์๋ฃ๋๊ธฐ ์ ์ ์ปดํฌ๋ํธ๊ฐ ์ปค๋ฐ๋ ์ ์์ต๋๋ค.
load
์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ์คํฌ๋ฆฝํธ ๋ด์ฉ์ ๋ฐ๋ผ ์์ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด onLoad
prop ์ ์ด์ฉํ ์ ์์ต๋๋ค.
React๋ ๋์ผํ src
๋ฅผ ๊ฐ์ง ์ค๋ณต๋ ์คํฌ๋ฆฝํธ๋ฅผ ์ ๊ฑฐํ์ฌ ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๋๋ผ๋ ๊ทธ ์ค ํ๋๋ง DOM์ ์ฝ์
ํฉ๋๋ค.
import ShowRenderedHTML from './ShowRenderedHTML.js'; function Map({lat, long}) { return ( <> <script async src="map-api.js" onLoad={() => console.log('script loaded')} /> <div id="map" data-lat={lat} data-long={long} /> </> ); } export default function Page() { return ( <ShowRenderedHTML> <Map /> </ShowRenderedHTML> ); }
์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ ๋ ๋๋ง
์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ๋ฅผ ํฌํจํ๋ ค๋ฉด <script>
์ปดํฌ๋ํธ๋ฅผ ์์์ผ๋ก ์คํฌ๋ฆฝํธ ์์ค ์ฝ๋์ ํจ๊ป ๋ ๋๋งํ์ธ์. ์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ๋ ์ค๋ณต ์ ๊ฑฐ๋๊ฑฐ๋ ๋ฌธ์์ <head>
๋ก ์ด๋ํ์ง ์์ต๋๋ค.
import ShowRenderedHTML from './ShowRenderedHTML.js'; function Tracking() { return ( <script> ga('send', 'pageview'); </script> ); } export default function Page() { return ( <ShowRenderedHTML> <h1>My Website</h1> <Tracking /> <p>Welcome</p> </ShowRenderedHTML> ); }