preinitModule
preinitModule์ ESM ๋ชจ๋์ ๋ฏธ๋ฆฌ ๊ฐ์ ธ์ค๊ณ ํ๊ฐ(evaluate)ํ ์ ์๊ฒ ํด์ค๋๋ค.
preinitModule("https://example.com/module.js", {as: "script"});๋ ํผ๋ฐ์ค
preinitModule(href, options)
ESM ๋ชจ๋์ ์ฌ์ ์ preinitํ๋ ค๋ฉด, react-dom ํจํค์ง์์ preinitModule ํจ์๋ฅผ ํธ์ถํ์ธ์.
import { preinitModule } from 'react-dom';
function AppRoot() {
preinitModule("https://example.com/module.js", {as: "script"});
// ...
}์๋ ์์๋ฅผ ๋ ์ฐธ๊ณ ํ์ธ์.
preinitModule ํจ์๋ ๋ธ๋ผ์ฐ์ ์ ํด๋น ๋ชจ๋์ ๋ค์ด๋ก๋ํ๊ณ ์คํํ ์ ์๋ค๋ ํํธ๋ฅผ ์ ๊ณตํ๋ฏ๋ก, ๋ก๋ฉ ์๊ฐ์ ๋จ์ถํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. preinit๋ ๋ชจ๋์ ๋ค์ด๋ก๋๊ฐ ์๋ฃ๋๋ ์ฆ์ ์คํ๋ฉ๋๋ค.
๋งค๊ฐ๋ณ์
href: ๋ฌธ์์ด์ ๋๋ค. ๋ค์ด๋ก๋ํ๊ณ ์คํํ ๋ชจ๋์ URL์ ๋๋ค.options: ๊ฐ์ฒด์ ๋๋ค. ๋ค์ ์์ฑ์ ํฌํจํฉ๋๋ค:as: ํ์ ๋ฌธ์์ด์ ๋๋ค. ๋ฐ๋์'script'์ฌ์ผ ํฉ๋๋ค.crossOrigin: ๋ฌธ์์ด์ ๋๋ค. ์ฌ์ฉํ CORS policy์ ์ง์ ํฉ๋๋ค. ๊ฐ๋ฅํ ๊ฐ์anonymous๋๋use-credentials์ ๋๋ค.integrity: ๋ฌธ์์ด์ ๋๋ค. ๋ชจ๋์ ์ํธํ์ ํด์๋ก, ๋ฌด๊ฒฐ์ฑ์ ๊ฒ์ฆํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.nonce: ๋ฌธ์์ด์ ๋๋ค. ์๊ฒฉํ Content Security Policy๋ฅผ ์ฌ์ฉํ ๋ ๋ชจ๋์ ํ์ฉํ๊ธฐ ์ํ ์ํธํ์ nonce์ ๋๋ค.
๋ฐํ๊ฐ
preinitModule์ ๊ฐ์ ๋ฐํํ์ง ์์ต๋๋ค.
์ฃผ์ ์ฌํญ
- ๋์ผํ
href๋กpreinitModule์ ์ฌ๋ฌ ๋ฒ ํธ์ถํด๋, ํ ๋ฒ ํธ์ถํ ๊ฒ๊ณผ ๋์ผํ ํจ๊ณผ๋ง ๋ฐ์ํฉ๋๋ค. - ๋ธ๋ผ์ฐ์ ์์๋ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ ๋, ์ดํํธ ์์์, ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ฑ ์ด๋ค ์ํฉ์์๋
preinitModule์ ํธ์ถํ ์ ์์ต๋๋ค. - ์๋ฒ ์ธก ๋ ๋๋ง์ด๋ Server Components๋ฅผ ๋ ๋๋งํ ๋๋,
preinitModule๋ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๋ ์ค์ด๊ฑฐ๋ ๋ ๋๋ง์์ ํ์๋ ๋น๋๊ธฐ ์ปจํ ์คํธ ๋ด์์ ํธ์ถํ ๊ฒฝ์ฐ์๋ง ํจ๊ณผ๊ฐ ์์ต๋๋ค. ๊ทธ ์ธ์ ํธ์ถ์ ๋ฌด์๋ฉ๋๋ค.
์ฌ์ฉ๋ฒ
๋ ๋๋ง ์ค ์ฌ์ ๋ก๋ฉํ๊ธฐ
ํน์ ๋ชจ๋์ด ํ์ฌ ์ปดํฌ๋ํธ๋ ์์ ์ปดํฌ๋ํธ์์ ์ฌ์ฉ๋ ๊ฒ์์ ์๊ณ ์๊ณ , ํด๋น ๋ชจ๋์ด ๋ค์ด๋ก๋ ์ฆ์ ํ๊ฐ๋์ด ํจ๊ณผ๋ฅผ ๋ฐํํด๋ ๊ด์ฐฎ๋ค๋ฉด, ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ ๋ preinitModule์ ํธ์ถํ์ธ์.
import { preinitModule } from 'react-dom';
function AppRoot() {
preinitModule("https://example.com/module.js", {as: "script"});
return ...;
}๋ชจ๋์ ๋ค์ด๋ก๋ํ๋ ์ฆ์ ์คํํ์ง ์์ผ๋ ค๋ฉด preloadModule์ ์ฌ์ฉํ์ธ์. ESM ๋ชจ๋์ด ์๋ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ ์ด๊ธฐํํ๋ ค๋ฉด preinit์ ์ฌ์ฉํ์ธ์.
์ด๋ฒคํธ ํธ๋ค๋ฌ์์ ์ฌ์ ๋ก๋ฉํ๊ธฐ
์ด๋ฒคํธ ํธ๋ค๋ฌ์์ ๋ชจ๋์ด ํ์ํด์ง ํ์ด์ง๋ ์ํ๋ก ์ ํํ๊ธฐ ์ ์ preinitModule์ ํธ์ถํ์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ์๋ก์ด ํ์ด์ง๋ ์ํ๋ฅผ ๋ ๋๋งํ ๋๋ณด๋ค ๋ ์ผ์ฐ ๋ก๋ฉ์ ์์ํ ์ ์์ต๋๋ค.
import { preinitModule } from 'react-dom';
function CallToAction() {
const onClick = () => {
preinitModule("https://example.com/module.js", {as: "script"});
startWizard();
}
return (
<button onClick={onClick}>Start Wizard</button>
);
}