-
Notifications
You must be signed in to change notification settings - Fork 0
Convert react to web component
nhistory edited this page Jan 10, 2025
·
1 revision
ํ์ฌ๊น์ง ์งํ์ํฉ ๊ณต์ (2025.01.10)
- ํ๋ก์ ํธ ํ์์ฑ: DaleStudy์์ ๋์์ธ ์์คํ ์ ์ฉ์ด ํ์ํ ์น ์ปดํฌ๋ํธ ํ๋ก์ ํธ๊ฐ ์กด์ฌ
- ๋ฏธ๋ ํธํ์ฑ: ๋ฆฌ์กํธ ๊ธฐ๋ฐ ๋์์ธ ์์คํ ์ ๋ค๋ฅธ ํ๋ ์์ํฌ์์๋ ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ๋ณํ ํ์
r2wc ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ํ ์ด์
- ์ค๋ ์ง์: 2019๋ ์ต์ด ๋ฆด๋ฆฌ์ฆ, React 19๊น์ง ์ง์
- Shadow DOM ์ ์ด ๊ฐ๋ฅ: PandaCSS ์คํ์ผ ์ ์ฉ ์ ๋ฌธ์ ํด๊ฒฐ ๊ฐ๋ฅ์ฑ
- PandaCSS๋ ๋ณ๋์ CSSํ์ผ์ ๋ง๋ค์ง ์๊ณ ์ปดํฌ๋ํธ ํ์ผ ์์์ ์ง์ ์คํ์ผ์ ์ ์ํ๋ ๋ฐฉ์์ ์ฌ์ฉ
- ์น ์ปดํฌ๋ํธ๋ Shadow DOM์ ์ฌ์ฉํจ์ผ๋ก์ ์บก์ํ๋ฅผ ํตํด ๋งํฌ์ ๊ตฌ์กฐ, ์คํ์ผ, ๋์์ ์จ๊ธฐ๊ณ ํ์ด์ง์ ๋ค๋ฅธ ์ฝ๋๋ก๋ถํฐ์ ๋ถ๋ฆฌํ์ฌ ๊ฐ๊ธฐ ๋ค๋ฅธ ๋ถ๋ถ๋ค์ด ์ถฉ๋ํ์ง ์๊ฒ ํ๊ณ , ์ฝ๋๊ฐ ๊น๋ํ๊ฒ ์ ์ง๋ ์ ์๊ฒ ํจ
- ์ด๋ฌํ Shadow DOM์ ํน์ฑ ๋๋ฌธ์ r2wc๋ฅผ ์ฌ์ฉํด์ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ ธ์ค๋๋ผ๋ PandaCSS์ ์คํ์ผ ์์ฑ๋ค์ ์ํฌํธ ๋์ง ์์
์ฝ๋ ์์
- Shadow DOM์ ํ์ฑํํ์ง ์์ ๊ฒฝ์ฐ
import r2wc from "@r2wc/react-to-web-component";
const WcButton = r2wc(Button, {
props: {
children: "string",
},
});
customElements.define("wc-button", WcButton);
์์ ๊ฐ์ด <Button>
์ปดํฌ๋ํธ๋ฅผ ์น ์ปดํฌ๋ํธ๋ก ๋ณํํ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ์์ ์๋์ ๊ฐ์ด <wc-button>
์ ์ธ๋ถ ์ฌํญ์ ํ์ธํ ์ ์๋ค.
๋ํ PandaCSS์ ์คํ์ผ ์์ฑ๋ค๋ ์ ์ ์ฉ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
- Shadow DOM์ ํ์ฑํ ํ ๊ฒฝ์ฐ
import r2wc from "@r2wc/react-to-web-component";
const WcButton = r2wc(Button, {
shadow: "open", // Shadow DOM is opened
props: {
children: "string",
},
});
customElements.define("wc-button", WcButton);
์์ ๊ฐ์ด Shadow DOM์ ํ์ฑํ ์ํค๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ์ Shadow Root๊ฐ ์ถ๊ฐ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
Shadow DOM์ ์บก์ํ, ์คํ์ผ ๊ฒฉ๋ฆฌ ํน์ฑ ๋๋ฌธ์ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ์ ์คํ์ผ์ด ๋ ์ด์ ์ ์ฉ๋์ง ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
- ์น ์ปดํฌ๋ํธ๋ฅผ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ์ ๋น์ทํ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด์๋
<slot>
์ ์ฌ์ฉํด์ผ ํจ
<wc-button>Click Me<wc-button>
- ํ์ง๋ง ์์์ ๊ธฐ์ ํ ๋ฐ์ ๊ฐ์ด PandaCSS ์คํ์ผ ์ ์ฉ ๋๋ฌธ์ Shadow DOM์ ๋นํ์ฑํ ํ๊ฒ ๋๋ฉด
<slot>
์ ์ฌ์ฉํ ์ ์์ - r2wc ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์๋ props ์์์ ๋ณ์๋ฅผ ์ ์ํ๊ณ ๋ฆฌ์กํธ์ ๋ณ์์ ์ ์ฉ์ํฌ ์ ์์. ๋ง์ฝ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ์
children
์ ํ ์คํธ๋ฅผ ๋ฃ๊ณ ์ถ๋ค๋ฉด props์์ children ๋ณ์๋ฅผ ์ ์ํ๊ณ<wc-button children="Click Me">
์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ ์ํด ์ค์ผ ํจ