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

React ๊ธฐ๋ฐ˜ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์ข…์ข… ๋ฆฌ์†Œ์Šค ๋กœ๋”ฉ์„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ, ์ด API๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

preinit์€ ์Šคํƒ€์ผ์‹œํŠธ๋‚˜ ์™ธ๋ถ€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ฏธ๋ฆฌ ๊ฐ€์ ธ์˜ค๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

preinit("https://example.com/script.js", {as: "script"});

๋ ˆํผ๋Ÿฐ์Šค

preinit(href, options)

์Šคํฌ๋ฆฝํŠธ๋‚˜ ์Šคํƒ€์ผ์‹œํŠธ๋ฅผ preinit ํ•˜๋ ค๋ฉด react-dom์—์„œ preinitํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์„ธ์š”.

import { preinit } from 'react-dom';

function AppRoot() {
preinit("https://example.com/script.js", {as: "script"});
// ...
}

์•„๋ž˜ ์˜ˆ์‹œ์—์„œ ๋” ๋ณด๊ธฐ.

preinit ํ•จ์ˆ˜๋Š” ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ์ฃผ์–ด์ง„ ๋ฆฌ์†Œ์Šค๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•˜๋ผ๋Š” ํžŒํŠธ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์‹œ๊ฐ„ ์ ˆ์•ฝ์— ๋„์›€์„ ์ค๋‹ˆ๋‹ค. preinitํ•œ ์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹ค์šด๋กœ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์ฆ‰์‹œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์Šคํƒ€์ผ์‹œํŠธ๋Š” ๋ฌธ์„œ์— ์‚ฝ์ž…๋˜์–ด ๊ณง๋ฐ”๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

  • href: ๋ฌธ์ž์—ด. ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•  ๋ฆฌ์†Œ์Šค์˜ URL์ž…๋‹ˆ๋‹ค.
  • options: ๊ฐ์ฒด. ๋‹ค์Œ ์†์„ฑ๋“ค์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • as: ํ•„์ˆ˜ ๋ฌธ์ž์—ด. ๋ฆฌ์†Œ์Šค์˜ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ๊ฐ’์€ script์™€ style์ž…๋‹ˆ๋‹ค.
    • precedence: ๋ฌธ์ž์—ด. ์Šคํƒ€์ผ์‹œํŠธ์— ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์Šคํƒ€์ผ์‹œํŠธ์™€์˜ ์‚ฝ์ž… ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ์Šคํƒ€์ผ์‹œํŠธ๊ฐ€ ๋‚ฎ์€ ๊ฒƒ์„ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ๊ฐ’์€ reset, low, medium, high์ž…๋‹ˆ๋‹ค.
    • crossOrigin: ๋ฌธ์ž์—ด. ์‚ฌ์šฉํ•  CORS ์ •์ฑ…์ž…๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ๊ฐ’์€ anonymous ์™€ use-credentials์ž…๋‹ˆ๋‹ค.
    • integrity: ๋ฌธ์ž์—ด. ๋ฆฌ์†Œ์Šค์˜ ๋ฌด๊ฒฐ์„ฑ์„ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•œ ์•”ํ˜ธํ™” ํ•ด์‹œ์ž…๋‹ˆ๋‹ค.
    • nonce: ๋ฌธ์ž์—ด. ์—„๊ฒฉํ•œ ์ฝ˜ํ…์ธ  ๋ณด์•ˆ ์ •์ฑ…์„ ์‚ฌ์šฉํ•  ๋•Œ, ๋ฆฌ์†Œ์Šค๋ฅผ ํ—ˆ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์•”ํ˜ธํ™”๋œ nonce to allow the resource์ž…๋‹ˆ๋‹ค.
    • fetchPriority: ๋ฌธ์ž์—ด. ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ƒ๋Œ€์ ์ธ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ๊ฐ’์€ auto (๊ธฐ๋ณธ๊ฐ’), high, low์ž…๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

preinit์€ ์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฃผ์˜ ์‚ฌํ•ญ

  • ๋™์ผํ•œ href๋กœ preinit์„ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœํ•ด๋„, ํ•œ ๋ฒˆ ํ˜ธ์ถœํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ํšจ๊ณผ๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ, Effect ๋‚ด๋ถ€์—์„œ, ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์•ˆ์—์„œ ๋“ฑ ์–ด๋–ค ์ƒํ™ฉ์—์„œ๋“  preinit์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง ๋˜๋Š” ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ๋Š”, ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜๋ฉด์„œ ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง์—์„œ ์‹œ์ž‘๋œ ๋น„๋™๊ธฐ ์ปจํ…์ŠคํŠธ ๋‚ด์—์„œ๋งŒ preinit ํ˜ธ์ถœ์ด ํšจ๊ณผ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ๊ทธ ์™ธ์˜ ํ˜ธ์ถœ์€ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ๋ฒ•

๋ Œ๋”๋ง ์‹œ preinit ํ•˜๊ธฐ

ํŠน์ • ์ปดํฌ๋„ŒํŠธ๋‚˜ ๊ทธ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํŠน์ • ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๊ณ , ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๊ฐ€ ๋‹ค์šด๋กœ๋“œ๋˜์ž๋งˆ์ž ๋ฐ”๋กœ ์‹คํ–‰๋˜๊ฑฐ๋‚˜ ์ ์šฉ๋˜๋Š” ๊ฒƒ์ด ๊ดœ์ฐฎ๋‹ค๋ฉด, ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ preinit์„ ํ˜ธ์ถœํ•˜์„ธ์š”.

preinit ์‚ฌ์šฉ ์˜ˆ์‹œ

์˜ˆ์‹œ 1 of 2:
์™ธ๋ถ€ ์Šคํฌ๋ฆฝํŠธ preinit ํ•˜๊ธฐ

import { preinit } from 'react-dom';

function AppRoot() {
preinit("https://example.com/script.js", {as: "script"});
return ...;
}

์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๋˜ ์ฆ‰์‹œ ์‹คํ–‰ํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด preload๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ESM ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•˜๋ ค๋ฉด preinitModule์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋‚ด์—์„œ preinit ํ•˜๊ธฐ

์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค๊ฐ€ ํ•„์š”ํ•œ ํŽ˜์ด์ง€๋‚˜ ์ƒํƒœ๋กœ ์ „ํ™˜ํ•˜๊ธฐ ์ „์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์—์„œ preinit์„ ํ˜ธ์ถœํ•˜์„ธ์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ƒˆ ํŽ˜์ด์ง€๋‚˜ ์ƒํƒœ ๋ Œ๋”๋ง ์‹œ์ ๋ณด๋‹ค ๋” ์ผ์ฐ ๋ฆฌ์†Œ์Šค ๋‹ค์šด๋กœ๋“œ๊ฐ€ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

import { preinit } from 'react-dom';

function CallToAction() {
const onClick = () => {
preinit("https://example.com/wizardStyles.css", {as: "style"});
startWizard();
}
return (
<button onClick={onClick}>Start Wizard</button>
);
}