react-snap โจ๐ง๐จ์ผ๋ก React ์ฌ๋ผ์ง๋ ํ์ ์ํ
์ํํํ!
๋ชจ๋ ์ ์ ๋น๋ํํ ํ์ด์ง์ ๋ํด ๋งค์ฐ ์ฝ๊ฒ ์ํํ ์ ์์ต๋๋ค. ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค!
SSR & ๋ฆฌ์กํธ์ค๋ ๐
์๋ฒ์ธก ๋ ๋๋ง(SSR)์ ์๋ก์ด ๊ฐ๋ ์ด ์๋๋๋ค. ์น ์ฌ์ดํธ, ํนํ ํธ๋ํฝ์ด ๋ง์ ์น ์ฌ์ดํธ๋ ํ์ด์ง ๋ก๋ ์ฑ๋ฅ์ ์ต์ ํํ๊ธฐ ์ํด ์๋ ๋์ ์ด ์์ ์ ์ํํด ์์ต๋๋ค. ๋น ๋ฅธ ์ฝ๊ธฐ ๊ฒฝํ์ด ๊ฐ์ฅ ์ค์ํ๊ธฐ ๋๋ฌธ์ GMG/The Onion์ ์์ ๋ ์ด๊ฒ์ ํญ์ ์ต์ ์ ์ ์์์ต๋๋ค.
React-land์ SSR์ ์ผ๋ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ์์ ์ ์๋ฏธํฉ๋๋ค(react-snapreadme์์ ๊ฐ์ ธ์ด):
import { hydrate, render } from "react-dom";
const rootElement = document.getElementById("root");
if (rootElement.hasChildNodes()) {
hydrate(<App />, rootElement);
} else {
render(<App />, rootElement);
}
์๋ฒ๋ ์ด๊ธฐ
render
๋ฅผ ์ํํ ๋ค์ ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ฅผ ๊ฐ์งํ๊ณ ๊ทธ๋ฅ ํ ์ ์์ต๋๋คhydrate
. ๊ทธ๋ฌ๋ ๋๋๋ก ๋๋ ์ํ์ง ์๊ณ hydrate
๋์ ๋๋ฅผ ๊ฑฐ๊ธฐ์ ์๊ฒ ํ ์ฝ๋๋ฅผ ์์ ํ ํฌ๊ธฐํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค.์ด ์ข๊ฒ๋ "์ ๋ก ๊ตฌ์ฑ ํ๋ ์์ํฌ์ ๊ตฌ์ ๋ฐ์ง ์๋ ์ ์ ์ฌ์ ๋ ๋๋ง"๋๊ตฌ๊ฐ ์ด๋ฅผ ์ง์ํฉ๋๋ค! react-snap์ puppeteer(ํค๋๋ฆฌ์ค Chrome)๋ฅผ ์ฌ์ฉํ์ฌ ํ์ด์ง๋ฅผ ๊ฐ์์ผ๋ก ๋ ๋๋งํ ๋ค์ ๋ช ๊ฐ์ง ์ถ๊ฐ ์ต์ ํ๋ฅผ ์ํํฉ๋๋ค.
๋น๋ ์คํฌ๋ฆฝํธ(์ด๋ฆ์๋ ๋ถ๊ตฌํ๊ณ React๋ฟ๋ง ์๋๋ผ)๊ฐ ์๋ ๋ชจ๋ ํ๋ก์ ํธ์ ํจํค์ง๋ฅผ ์ถ๊ฐํ๊ณ
postbuild
์คํฌ๋ฆฝํธ๋ก ์ถ๊ฐํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ์ฑํ๋ฉ๋๋ค."scripts": {
"postbuild": "react-snap"
}
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ์ฐ๋ฆฌ์๊ฒ ์ ๋ฐ์ ๊ธธ์ ๊ฐ์ ธ๋ค์ค๋๋ค. ์ด๋ฅผ ๋ฌด์์ฐ์ผ๋ก ๋ง๋ค๋ ค๋ฉด ๋ช ๊ฐ์ง ๋ค๋ฅธ ํญ๋ชฉflags๋ ํ์ํฉ๋๋ค.
"reactSnap": {
"inlineCss": true,
"removeBlobs": true,
"removeScriptTags": true,
"removeStyleTags": true
}
Note:
inlineCss
is still an experimental feature and doesn't currently work because of a service worker issue. There's a patched version that includes a fix.
์ด์
build
๋ฅผ ์คํํ ํ react-snap ๋ฐ minimalcss๋ ๊ฐ์ DOM์ ์ค์ DOM์ผ๋ก ๋ฐ๊พธ๊ณ ๋ชจ๋ ์์ฐ์ ์ ๊ฑฐํ ๋ค์ ํ๋ฒํ ๊ธฐ์กด HTML์ ๋ฐํํฉ๋๋ค!์ด๊ฒ์ด ๋ฉ์ง ์ด์ ๐ฎ
๊ฐ๋ ์๊ณ ์ฝง๋ฌผ๋ง ์์ต๋๋ค.
๋ชจ๋ ์ฌ์ฉ ์ฌ๋ก์ ํด๋น๋์ง ์์
๋ถ๋ช ํ ์ด ์ ๊ทผ ๋ฐฉ์์ ํ์ด์ง์์ ์ํธ ์์ฉ์ด ํ์ํ ๋ ๋ฌด๋์ง๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ์ ์ ์ธ ์ฝ๊ธฐ ์ ์ฉ ํ์ด์ง(์: ๋ธ๋ก๊ทธ ๊ธฐ์ฌ)๋ฅผ ๋ ๋๋งํ๊ณ ๋ค๋ฅธ ๋ถํ๋ฆผ์ด ํ์ํ์ง ์์ ๋ ๋น์ ๋ฐํฉ๋๋ค.
์ด๊ฒ์ CI์ ํจ๊ป ์ ์ฉํ ํ๋ก์ ํธ๋ฅผ ๊ณต์ ํ ๋ ๋ค๋ฅธ ๊ฒ์๋ฌผ์ ๊ธฐ๋ํด์ฃผ์ธ์!
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(react-snap โจ๐ง๐จ์ผ๋ก React ์ฌ๋ผ์ง๋ ํ์ ์ํ), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/bryce/perform-a-react-disappearing-act-with-react-snap-1eo3ํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค