๐Ÿ“† 22.09.30 - ์ฒซ react, html5 ๊ตฌ์กฐ, vite?

๋ฒ„๋“คยท2022๋…„ 10์›” 5์ผ
0

โœจToday I Learn (TIL)

๋ชฉ๋ก ๋ณด๊ธฐ
1/57
post-thumbnail

์ง€๋‚œ ์ด์•ผ๊ธฐโ€ฆ ๐Ÿ’ค


**ํ•ญํ•ด 9๊ธฐ 2์ฃผ์ฐจ์˜ ๋งˆ๋ฌด๋ฆฌ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ…Œ์ŠคํŠธ๋ฅผ ๋งˆ์น˜๊ณ  ์ฃผํŠน๊ธฐ ์ฃผ์ฐจ์— ๋“ค์–ด์„œ๊ฒŒ ๋˜์—ˆ๋‹ค. 
๋ณธ๊ฒฉ์ ์œผ๋กœ react๋ฅผ ๋ฐฐ์šฐ๊ฒŒ ๋˜์–ด ์†”์งํžˆ ๋งํ•ด, ๋งŽ์ด ๋“ค๋– ์žˆ๋Š” ์ƒํƒœ์ด๋‹ค. 
ํฅ๋ฏธ๊ฐ€ ๋งˆ๊ตฌ๋งˆ๊ตฌ ์ƒ˜์†Ÿ๋Š” ๊น€์— ๋Šฆ๊ฒŒ๋‚˜๋งˆ, TIL๋ฅผ ์จ๋ณด๋ ค๊ณ  ํ•œ๋‹ค~**

1. React ์‹œ์ž‘ํ•˜๊ธฐ


React ์‹คํ–‰ ํ•„์š” ์š”๊ฑด ๋ฐ ์ˆœ์„œ

  1. Node.js ์„ค์น˜ & yarn ์„ค์น˜

    ์ฒ˜์Œ์— Node ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์—์„œ Node.js๋ฅผ ๋ฒ„์ ผ์„ ์„ค์น˜ํ•œ๋‹ค. ์ด์ „์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ Node ํ”Œ๋žซํผ์—์„œ ์‚ฌ์šฉํ–ˆ๊ธฐ์— ์•„๋งˆ ์„ค์น˜๊ฐ€ ๋˜์–ด์žˆ์„ ๊ฒƒ์ด๋‹ค.

    • ๋งŒ์•ฝ Node๊ฐ€ ๊น”๋ฆฐ์ง€ ์•„๋‹Œ์ง€ ๊ถ๊ธˆํ•˜๋‹ค๋ฉด? terminal ํ˜น์€ powershell ์—์„œ node -v ๋ฅผ ์ณ๋ณธ๋‹ค. node -v ๋กœ node ๋ฒ„์ „์„ ํ™•์ธํ•œ๋‹ค.

    ์ด๋กœ ์ธํ•ด NPM (Node Package Manager)๊ฐ€ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค. ์ด npm ์„ ํ†ตํ•˜์—ฌ ์—ฌ๋Ÿฌ ํŒจํ‚ค์ง€๋ฅผ ๋‹ค์šด๋ฐ›์•„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด npm ๋ง๊ณ  ๋‹ค๋ฅธ package manager ๋„ ์„ค์น˜๋ฅผ ํ•ด์•ผํ•œ๋‹ค. ๊ทธ๊ฒƒ์€ ๋ฐ”๋กœ yarn!

    ์„ค์น˜ ๋ฐฉ๋ฒ•์€ npm install -g yarn

    • ๋งŒ์•ฝ Yarn์ด ๊น”๋ฆฐ์ง€ ์•„๋‹Œ์ง€ ๊ถ๊ธˆํ•˜๋‹ค๋ฉด? terminal ํ˜น์€ powershell ์—์„œ yarn -v ๋ฅผ ์ณ๋ณธ๋‹ค. yarn -v ๋กœ yarn ๋ฒ„์ „์„ ํ™•์ธํ•œ๋‹ค.

    ์ด yarn ์„ ํ†ตํ•ด npm ์œผ๋กœ ์„ค์น˜๊ฐ€ ํž˜๋“  ํŒจํ‚ค์ง€๋“ค์„ ๋” ์ˆ˜์›”ํ•˜๊ฒŒ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    yarn add [ํŒจํ‚ค์ง€ ์ด๋ฆ„] ์œผ๋กœ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

  2. CRA (Create React-App)

React ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“œ๋ ค๋ฉด, ํ”„๋กœ์ ๋‹น

ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ์ด ์™„๋ฃŒ๋˜์—ˆ๋‹ค๊ณ  ํ•˜๋ฉด, cd [ํ”„๋กœ์ ํŠธ ๋ช…] ์œผ๋กœ ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๋ฉด dev server ๋ฐ build ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

npm start ๋กœ ๋ฐฐํฌ ์ „์˜ ๊ฐœ๋ฐœ ์„œ๋ฒ„๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฏธ๋ฆฌ ๋ณด๋Š”๊ฒŒ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.


2. Vite

vite๋ž€?

react์— ๋Œ€ํ•ด ์‚ฌ์ „์กฐ์‚ฌ๋ฅผ ํ•˜๋˜ ๊ฐ€์šด๋ฐ โ€˜viteโ€™ ๋ผ๋Š” ํ”„๋ก ํŠธ์—”๋“œ ํˆด์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.
Vue ์ฐฝ์‹œ์ž์ธ ์—๋ฐ˜ ์œ ๊ฐ€ ๋งŒ๋“ค์—ˆ์œผ๋ฉฐ, Vue, React, Svelte์˜ ๋นŒ๋“œ ๋„๊ตฌ ์—ญํ• ์„ ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

vite๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๋ฐ๋ธŒ ์„œ๋ฒ„๋กœ webpack์„ ๋Œ€์ฒดํ•˜์—ฌ ๋ฒˆ๋“ค๋ง ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค.

Bundling (๋ฒˆ๋“ค๋ง)

requir.js ์™€ ๊ฐ™์€ ๋ชจ๋“ˆ ๋กœ๋”๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๋ชจ๋“ˆํ™”๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ–ˆ๋˜ ESM ์‹œ์ ˆ ์ด์ „.. ๊ทธ๋Ÿฌ๋‚˜ ESM ๋ถ€ํ„ฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด์— ๋ชจ๋“ˆํ™” ๋ฌธ๋ฒ• (import, export)์ด ๋“ค์–ด์˜ค๊ฒŒ ๋œ๋‹ค.
์œ„์˜ ๋ฌธ๋ฒ•์„ ์ด์š”ํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒŒ์ผ์„ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์ฃผ๊ฑฐ๋‚˜ ์˜๋ฏธ ์žˆ๋Š” ๋‹จ์œ„๋กœ ๋ฌถ์–ด์ฃผ๋Š” ํ–‰์œ„๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ ๊ทธ๊ฒƒ์„ ๋ฒˆ๋“ค๋ง์ด๋ผ๊ณ  ํ•œ๋‹ค

๊ทธ๋ž˜์„œ webpack,rollup, parcel ๋“ฑ๊ณผ ๊ฐ™์€ ๋ชจ๋“ˆ ๋ฒˆ๋“ˆ๋Ÿฌ๋Š” ์œ„ ๊ฐ™์€ ๋ฒˆ๋“ค๋ง ์ž‘์—…์„ ๋„์™€์ฃผ๋Š” ํˆด์ธ๋ฐ ๋Œ€๋ถ€๋ถ„ webpack์ด ๊ทธ ์ƒํƒœ๊ณ„๋ฅผ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ๋‹ค.

vite ํŠน์ง•

  • webpack dev server ๋Œ€๋น„ 20~30 ๋ฐฐ ๋น ๋ฅด๊ธฐ์˜ ์‹คํ–‰ ์‹œ๊ฐ„์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
    webpack ์„œ๋ฒ„๋Š” ์ฒ˜์Œ local ์„œ๋ฒ„๋ฅผ ํ‚ฌ ๋•Œ, ๊ด€๋ จ ๋ชจ๋“ˆ๋“ค์„ ๋ฒˆ๋“ค๋งํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ์— ์ ์žฌํ•˜๋Š” ์‹œ๊ฐ„์ด ๋‹ค์†Œ ํ•„์š”ํ•˜๋‹ค. => vite๋Š” ๋ฒˆ๋“ค๋งํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ์— ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•จ๊ณผ ๋™์‹œ์— ์„œ๋ฒ„๊ฐ€ ๋ฐ”๋กœ ๊ตฌ๋™

  • build๋ฅผ ์œ„ํ•œ ์ œ๊ณต build ์˜ต์…˜๋“ค์ด ๋งŽ๋‹ค.
    vite build production์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฒˆ๋“ค๋ง ํ•˜์ง€ ์•Š๊ณ  ๋กœ์ปฌ ๊ฐœ๋ฐœ ์„œ๋ฒ„์˜ ESM๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค. => ์„œ๋น„์Šค ๊ทœ๋ชจ๊ฐ€ ๋„ˆ๋ฌด ์ปค์ง€๋ฉด ๋ฒˆ๋“ค๋ง ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ด๋“์ผ ์ˆ˜๋„ ์žˆ๋‹ค => Rollup ์‚ฌ์šฉ

์•„๋ž˜๋Š” ๋ฒˆ๋“ค๋ง์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•˜๋Š” ์ฝ”๋“œ ๋ถ€๋ถ„์ด๋‹ค.

// vite.config.js
module.exports = defineConfig({
  build: {
    rollupOptions: {
      // https://rollupjs.org/guide/en/#big-list-of-options
    }
  }
})
 

3. Learn from ํ•ญํ•ด 99 S.A ๊ณผ์ œ

์ฒ˜์Œ์œผ๋กœ ๋งŒ๋“ค์–ด๋ณด๋Š” React ํ”„๋กœ์ ํŠธโ€ฆโœจ๋‹ค

์ฃผํŠน๊ธฐ ์ฃผ์ฐจ ์‹œ์ž‘ํ•˜์ž๋งˆ์ž ํ•˜๋ฃจ์•ˆ์— LoginForm ์„ ๋งŒ๋“ค๋ผ๋Š” ๊ณผ์ œ๋ฅผ ๋ฐ›๊ฒŒ ๋˜์—ˆ๋‹ค. 
๊ทธ๋Ÿฐ๋ฐ ๊ทธ ๊ณผ์ •์•ˆ์— React ๋ฅผ ์„ค์น˜ํ•˜๋ผ๋Š” ๋ง์ด ์žˆ์–ด, โ€˜Ar.. ๋ฆฌ์•กํŠธ ๋ฐฐ์šฐ์ง€๋„ ์•Š์•˜๋Š”๋ฐ, 
์ด๊ฑธ๋กœ ๋งŒ๋“ค์–ด์•ผ๋˜๋Š”๊ตฌ๋‚˜ ์˜ค๋Š˜ ์•ˆ์—โ€ฆ!โ€™ ๋ผ๊ณ  ์ƒ๊ฐํ•ด์„œ, ๊ตฌ๊ธ€๋ง ๋์— ์–ด์ฐŒ์ €์ฐŒ ๋งŒ๋“ค๊ธด ํ–ˆ๋Š”๋ฐ, 
~~์•Œ๊ณ ๋ณด๋‹ˆ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ•˜๋Š๋ผ html ๊นŒ๋จน์—ˆ์„๊นŒ๋ด html ๋กœ ํ•˜๋ผ๋Š” ๊ฑฐ์˜€๋‹ค..๐Ÿ˜‚~~

ํ ํ .. ์ผ๋‹จ ์„œ๋‘๋Š” ์ด๋ ‡๊ณ , ๋‹ค๋ฅธ ์ธ์›๋“ค์— ๋น„ํ•ด ๋ป˜์ง“์„ ํ–ˆ๊ธดํ–ˆ์ง€๋งŒ, ๋‚˜๋ฆ„๋Œ€๋กœ ์–ป์€ ์ ์ด ๋งŽ์•„์„œ ์ข‹๋‹ค.

HTML5์˜ ์ˆจ๊ฒจ์ง„ ํƒœ๊ทธ ์š”์†Œ - ํผ ๊ฒ€์ฆ

์ˆจ๊ฒจ์ง„..์ด๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ ๋ณด๋‹จ ์‚ฌ์‹ค ๋‚ด๊ฐ€ ๊ณต๋ถ€๋ฅผ ๋œ ํ•œ ๊ฒƒ์ด์—ˆ๋‹ค.

submit ์—์„œ input ํƒœ๊ทธ๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์•ˆ๋˜์–ด ์žˆ์œผ๋ฉด ์•Œ๋ฆผ ํ‘œ์‹œ

submit ์—์„œ input ํƒœ๊ทธ๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์•ˆ๋˜์–ด ์žˆ์œผ๋ฉด ์•Œ๋ฆผ ํ‘œ์‹œ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด๋ผ ์ฒ˜์Œ์—” function์„ ์ƒ์„ฑํ•˜์—ฌ dom์„ ์ด์šฉํ•ด value ๊ฐ’์ด โ€œ โ€œ ์ผ๋•Œ, ์—๋Ÿฌ๋ฅผ ์ถœ๋ ฅํ•˜๋ ค๊ณ  ํ–ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋‹ต์€ ๊ฐ€๊นŒ์šด ๊ณณ์— ์žˆ์—ˆ๋‹ค. ๋ฐ”๋กœ required

const App = () => {
  return (
    <form
      action="https://ko.reactjs.org/docs/add-react-to-a-website.html#add-react-in-one-minute"
      className="submitform">
      <p>First Name :</p>
      <input
        type="text"
        name="First Name"
        className="input bg-white input-bordered input-accent w-full max-w-xs"
        required
      />

์œ„๋Š” ์ฝ”๋“œ์˜ ์ผ๋ถ€์ด๋‹ค. <input type="submit"> ์€ form ํƒœ๊ทธ ๋‚ด์—์„œ ๋ฐ›์€ ๊ฐ’์„ ๋„˜๊ฒจ์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๋Š”๋ฐ ์ด๋•Œ, html5์—์„œ ์ง€์›ํ•˜๋Š” input ํƒœ๊ทธ ๋‚ด์˜ required๋ผ๋Š” ์†์„ฑ์„ ์ด์šฉํ•˜๋ฉด ๊ฒ€์ฆ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

์›๋ž˜ ๋Œ€๋ถ€๋ถ„์˜ Browser๋Š” ์ž…๋ ฅ๋ฐ›์€ ๊ฐ’์„ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๊ฐœ๋ฐœ์ž๋“ค์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” API๋ฅผ ์ œ๊ณตํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

html5์˜ ๊ฒฝ์šฐ ๋ฐ˜๋“œ์‹œ ์ž…๋ ฅํ•ด์•ผ๋˜๋Š” ์ž…๋ ฅ์š”์†Œ์— required ์†์„ฑ์„ ๋ถ€์—ฌํ•ด ๊ฒ€์ฆ ๋กœ์ง์„ ์‹คํ–‰ ๊ฐ€๋Šฅ์ผ€ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ž…๋ ฅ๋ฐ›์ง€ ์•Š์€ input ๊ฐ’์ด ๋‚˜์˜ค๊ฒŒ ๋˜๋ฉด submit์ด ์‹คํŒจํ•˜๊ฒŒ ๋˜๋Š” ๊ตฌ์กฐ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.

์ด๋Ÿฌํ•œ required ์ฒ˜๋Ÿผ html5์˜ ์ž…๋ ฅ ์š”์†Œ๋Š” ์ด 7๊ฐ€์ง€์˜ ๊ฒ€์ฆ ์†์„ฑ (validation attributes)์„ ์ œ๊ณตํ•œ๋‹ค.

  • required : ํ•„์ˆ˜
  • minlength / maxlength : ์ตœ์†Œ / ์ตœ๋Œ€ ๊ธธ์ด
  • type : ํƒ€์ž… (ex. email)
  • min / max : ์ตœ์†Œ / ์ตœ๋Œ€ ์ •์ˆ˜
  • pattern : ํŒจํ„ด(RegExp)

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

๊ทธ๋ž˜๋„ ์›๋ฆฌ๋ฅผ ์•Œ์•„๋‘๋ฉด ๋ญ๋“  ์ข‹์œผ๋‹ˆ ์ˆ™์ง€ํ•˜๋ ค๊ณ  ์„œ์ˆ ํ–ˆ๋‹ค.

reference
HTML5 ํผ ๊ฒ€์ฆ์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด ๋ณด์ž
https://joshua1988.github.io/vue-camp/vite/intro.html#%E1%84%87%E1%85%A5%E1%86%AB%E1%84%83%E1%85%B3%E1%86%AF%E1%84%85%E1%85%B5%E1%86%BC

profile
ํƒœ์–ด๋‚œ ๊น€์— ๋งŽ์€ ๊ฒฝํ—˜์„ ํ•˜๋ ค๊ณ  ์•„๋“ฑ๋ฐ”๋“ฑ ์• ์“ฐ๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž

0๊ฐœ์˜ ๋Œ“๊ธ€