๐งถ React์ ์์์ CLSX
clsx
์์ classnames
๋๋ React์ ์ฌ์ฉํ๋ ๊ฒ์ ์ต๊ทผ Tailwind CSS๊ณผ ๊ฐ์ ์ ํธ๋ฆฌํฐ ์ฐ์ CSS ํ๋ ์์ํฌ์์ ์ถ์ธ๊ฐ ๋์์ต๋๋ค. ์ด ํ๋ ์์ํฌ์์๋ ๋ง์ ํด๋์ค๋ฅผ ์์ฑํด์ผ ํ๋ฉฐ ๋๋ก๋ ์กฐ๊ฑด๋ฌธ๋ ํจ๊ป ์์ฑํด์ผ ํฉ๋๋ค.Vue๊ณผ ๊ฐ์ ํ๋ ์์ํฌ์์ ์๋ค๋ฉด ์ด Class Binding ๊ธฐ๋ฅ์ด ์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
์ด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์์๋ React ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํจ์นํ์ฌ ํ์ํ ๋๋ง๋ค ๊ฐ์ ธ์ค๊ธฐ
clsx
๋ฅผ ์ฌ์ฉํ์ง ์๊ณ React์์๋ ๊ธฐ๋ฅ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.โข๏ธ This is just for learning purposes. Use at your own risk
์๋ก์ด React ์ฑ ๋ง๋ค๊ธฐ
yarn create react-app implicit-clsx
cd implicit-clsx
clsx ์ค์น
yarn add clsx
๋ฐ์ ์ ๊ฑฐ
yarn remove react
raw-react ์ด๋ฆ์ผ๋ก ๋ฐ์ ์ค์น(์ถ๊ฐ ์ ๋ณด)
yarn add raw-react@npm:react
์์ ๋ฐ์์์ ๋ด๋ณด๋ผ ์์ฒด React ๋ง๋ค๊ธฐ
๋ด ๋ฐ์/index.js
module.exports = require('raw-react')
my-react/jsx-runtime.js(์ ๋ณด)
module.exports = require('raw-react/jsx-runtime')
my-react/jsx-dev-runtime.js(์ ๋ณด)
module.exports = require('raw-react/jsx-dev-runtime')
๋ฐ์ ํจํค์ง๋ก my-react ์ค์น(์์ธํ ์ ๋ณด)
yarn add react@file:my-react
JSX ๋ฐํ์ ํจ์น
์ด์ JSX Runtime์ ํจ์นํ์ฌ
className
๋ฅผ ํ์ธํ๊ฒ ์ต๋๋ค. ํ๋ ์ผ์ด ์จ๋ค ๐my-react/jsx-dev-runtime.js
module.exports = require('raw-react/jsx-dev-runtime')
const clsx = require('clsx').default
const jsxDEV = module.exports.jsxDEV
module.exports.jsxDEV = function() {
if (typeof arguments[0] === 'string' && arguments[1].className) {
arguments[1].className = clsx(arguments[1].className)
}
return jsxDEV.apply(undefined, arguments)
}
์ด์ ๋ด๊ฐ ์ฌ๊ธฐ์ ์ด ํก์ค์์ค์ ์ค๋ช ํ ์๊ฐ์ ๋๋ค ๐คฃ ๋ช ๊ฐ์ง๋ง ์ค๋ช ํ๊ณ ๋ค๋ฅธ ๋ชจ๋ ๊ฒ์ ๋ถ๋ช ํ๋ค๊ณ ์๊ฐํฉ๋๋ค
arguments
arguments๋ ํด๋น ํจ์์ ์ ๋ฌ๋ ์ธ์์ ๊ฐ์ ํฌํจํ๋ ํจ์ ๋ด์์ ์ก์ธ์คํ ์ ์๋ ๋ฐฐ์ด๊ณผ ๊ฐ์ ๊ฐ์ฒด์
๋๋ค. apply
apply() ๋ฉ์๋๋ ์ฃผ์ด์ง this ๊ฐ๊ณผ ๋ฐฐ์ด(๋๋ ๋ฐฐ์ด๊ณผ ์ ์ฌํ ๊ฐ์ฒด)๋ก ์ ๊ณต๋ ์ธ์๋ฅผ ์ฌ์ฉํ์ฌ ํจ์๋ฅผ ํธ์ถํฉ๋๋ค. ๊ธฐ๋ฅ ์๋ช
jsxDEV
์ type, props, key
์
๋๋ค. ๋ฐ๋ผ์ arguments[0]
๋ type
์ด๊ณ arguments[1]
๋ props
์
๋๋ค.react-dom
์์ ํธ์คํธ ์์๋ ๋ฌธ์์ด๋ง ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ ํ์ด ๋ฌธ์์ด์ธ์ง ํ์ธํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ผ๋ถ ํจ์ ๋๋ ํด๋์ค ๊ตฌ์ฑ ์์์์ ๋ณ๊ฒฝclassName
์ ์ํ์ง ์์ต๋๋ค.๋ ๋ฒ์งธ๋ก
className
์ํ์ด ์๋์ง ํ์ธํ๊ณ clsx
ํธ์ถ๋ก ํจ์นํฉ๋๋ค.ํจ์์ ๋ง์ง๋ง ์ค์์ ๋ชจ๋ ๊ฒ์ ๋ค์ดํฐ๋ธ๋ก ์ ๋ฌํฉ๋๋ค
jsxDEV
.To have this work also on build, you will need to apply this patch also to
jsx
andjsxs
inmy-react/jsx-runtime.js
see repo link at the end
์ ๋ฐ์ดํธํ๋ ค๋ฉด ๋ฐ์ ํจํค์ง๋ก my-react๋ฅผ ๋ค์ ์ค์นํ์ธ์.
yarn add react@file:my-react
App.js๋ฅผ ๋ณ๊ฒฝํ์ฌ ๋ณ๊ฒฝ ์ฌํญ ํ์ธ
์ค์ ๋ฌธ์์ด๋ก ๋จ์ผ
className
๋ก ๋ฐ๊ฟ๋๋ค.<div className="App">
์ผ๋ฐ์ ์ผ๋ก ์ ๋ฌํ ์ ์๋ ๋์
clsx
<div className={["App1", "App1", { "App2": true }]}>
์ฑ์ ์์ํ๊ณ ๋ธ๋ผ์ฐ์ ์์ ์ฒดํฌ์ธํ์
yarn start
์์ ์https://github.com/iamandrewluca/implicit-clsx
TypeScript ๋ฒ์ ์ ๊ฐ์ง๊ณ ๋์์ง๋ง ์ ํ ๋ถ์ผ์น๋ก ์ธํด ์๋ํ์ง ๋ชปํ์ต๋๋ค. ๋ ๋ง์ ์กฐ์ฌ๊ฐ ํ์ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋๋ฌ์ต๋๋ค! ๋ด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ์ฝ์ด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
ํ์ง ์ฌ์ง ์์ฑ์: Ash from Modern Afflatus on Unsplash
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐งถ React์ ์์์ CLSX), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/iamandrewluca/implicit-clsx-in-react-2212ํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค