Skip to content

ssi02014/react-dev-env-boilerplate

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

40 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ’ป ๋ฆฌ์•กํŠธ ์ปค์Šคํ…€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ

  • ํ•ด๋‹น ์ €์žฅ์†Œ๋Š” ๋ฆฌ์•กํŠธ ์ปค์Šคํ…€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ ์ €์žฅ์†Œ๋กœ์„œ, react, webpack, babel, eslint ๋“ฑ ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ ํ•  ๋•Œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์…‹ํŒ…ํ•ด์•ผ๋˜๋Š” ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•œ ์ €์žฅ์†Œ์ž…๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ์ ์œผ๋กœ react v18, webpack v5, esbuild-loader v3 ๋“ฑ 2023๋…„ 6์›” ๊ธฐ์ค€ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ๊ตฌ์ถ•๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • README ๋ฌธ์„œ ํ•˜๋‹จ์—๋Š” ์ฐธ๊ณ  ๋‚ด์šฉ์ด๋ผ๋˜๊ฐ€ ๊ฐœ์ธ์ ์œผ๋กœ ๋” ์ถ”๊ฐ€ํ•˜๋ฉด ์ข‹์€ ๋กœ๋”/ํ”Œ๋Ÿฌ๊ทธ์ธ ๋‚ด์šฉ๋„ ์žˆ์œผ๋‹ˆ ์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • ๊ฐœ์„  ํ•  ๋‚ด์šฉ์ด ์žˆ๋‹ค๋ฉด issue ๋˜๋Š” Pull Request๋„ ๋“ฑ๋กํ•ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๐Ÿ“— ์‚ฌ์šฉ ์ ˆ์ฐจ

1. Repo Clone

git clone https://github.com/ssi02014/react-dev-env-boilerplate.git

2. Branch & Checkout & Pull

  • ํ•ด๋‹น ๋ ˆํฌ๋Š” ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ์— ๋งž์ถฐ ๋ธŒ๋žœ์น˜๊ฐ€ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. ๊ธฐํ˜ธ์— ๋งž๊ฒŒ ์ฐธ๊ณ  or ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.
  • ๋งŒ์•ฝ, esbuild-loader ๋ธŒ๋žœ์น˜ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด ์•„๋ž˜์˜ ์ ˆ์ฐจ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.
git branch esbuild-loader

git checkout -m esbuild-loader 

git pull origin esbuild-loader

3. ํŒจํ‚ค์ง€ ์„ค์น˜

  • ํ•ด๋‹น ๋ ˆํฌ๋Š” yarn ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํŒจํ‚ค์ง€๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ yarn์œผ๋กœ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜์ž.
yarn
or
yarn install

๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป master Branch

  • ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ react, babel, typescript, eslint, prettier, jest, React Testing Library ์…‹ํŒ… ๋ธŒ๋žœ์น˜

์…‹ํŒ… ๋ชฉ๋ก

  • react v18
  • typeScript
  • webpack v5
  • babel
  • eslint
  • prettier
  • jest
  • react testing library

๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป esbuild-loader Branch

  • master Branch ์…‹ํŒ…์—์„œ babel-loader๋Œ€์‹  esbuild-loader๋ฅผ ์ ์šฉํ•ด์„œ ๋นŒ๋“œ ํƒ€์ž„์„ ๊ฐ์†Œ์‹œํ‚จ ๋ธŒ๋žœ์น˜

์…‹ํŒ… ๋ชฉ๋ก

  • react v18
  • typeScript
  • webpack v5
  • esbuild-loader
  • eslint
  • prettier

๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป esbuild-jest Branch

  • esbuild-loader Branch ์…‹ํŒ…์—์„œ jest, react testing library ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ์ถ”๊ฐ€ ๋ธŒ๋žœ์น˜
  • ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ ์œ„ํ•ด @babel/preset-typescript, @babel/preset-env, @babel/preset-react ๋ฐ babel ์ถ”๊ฐ€ ์…‹ํŒ…

์…‹ํŒ… ๋ชฉ๋ก

  • react v18
  • typeScript
  • webpack v5
  • esbuild-loader
  • eslint
  • prettier
  • jest
  • react testing library
    • jest๋ฅผ ์œ„ํ•œ babel ์ผ๋ถ€ ์ ์šฉ

๐Ÿš€ ๊ทธ ์™ธ ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ ์ €์žฅ์†Œ

react-npm-deploy-boilerplate

  • react-npm-deploy-boilerplate
  • Design System์™€ ๊ฐ™์€ npm ์˜คํ”ˆ์†Œ์Šค ๋ฐฐํฌ์— ์ตœ์ ํ™” ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ ์ €์žฅ์†Œ
  • React, rollup, Typescript, Storybook ๋“ฑ์œผ๋กœ ๊ตฌ์„ฑ
  • github actions๋ฅผ ์ด์šฉํ•œ ์ž๋™ ๋นŒ๋“œ ๋ฐ ๋ฐฐํฌ ๊ตฌํ˜„
  • Storybook์„ github page๋กœ ๋ฐฐํฌํ•จ์œผ๋กœ์จ ๋ฐ๋ชจ ํŽ˜์ด์ง€๋กœ์„œ ํ™œ์šฉ

React ์ฐจ์„ธ๋Œ€ ๊ฐœ๋ฐœ ํˆด ์ ์šฉ ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ ์ €์žฅ์†Œ

  • react-vite-berry-boilerplate
  • React, TypeScript, Vite, Yarn Berry๋กœ ๊ตฌ์„ฑํ•œ ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ ์ €์žฅ์†Œ
  • Vite๋ฅผ ์ด์šฉํ•œ ๋ฆฌ์•กํŠธ(+ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ) ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ
  • Yarn Berry์˜ Plugโ€™nโ€™Play(PnP)์™€ Zero-Install ์ ์šฉ


๐Ÿ™‹๐Ÿป ์ฐธ๊ณ  ๋ฌธ์„œ

๐Ÿ“„ 1. esbuild-loader?

  • esbuild-loader๋Š” ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋Š” Go์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ๋กœ๋”์ด๋‹ค. ๊ทธ๋ž˜์„œ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ๊ธฐ๋ฐ˜์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋งŒ๋“ค์–ด์ง„ babel๋ณด๋‹ค ์–ธ์–ด๊ฐ€ ๋™์ž‘ํ•˜๋Š” ๋ณธ์งˆ์ ์ธ ์ฐจ์ด๋•Œ๋ฌธ์— ํผํฌ๋จผ์Šค ์ธก๋ฉด์—์„œ ์ฐจ์ด๊ฐ€ ํฌ๋‹ค.
  • kakao esbuild-loader ๋ฌธ์„œ

๊ธฐ์กด babel-loader ๋นŒ๋“œ ํƒ€์ž„


แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-03-12 แ„‹แ…ฉแ„’แ…ฎ 4 58 35


esbuild-loader ๋„์ž… ํ›„ ๋นŒ๋“œ ํƒ€์ž„


แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-03-12 แ„‹แ…ฉแ„’แ…ฎ 4 55 08


๐Ÿ“„ 2. @svgr/webpack

  • @svgr/webpack ํŒจํ‚ค์ง€๋Š” svg๋ฅผ ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ ํ˜•์‹์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ์›นํŒฉ ๋ชจ๋“ˆ์ด๋‹ค.
  • https://react-svgr.com/

์˜ˆ์ œ

import Star from './star.svg'

const Example = () => (
  <div>
    <Star />
  </div>
)
  • @svgr/webpack๋ฅผ ์ ์šฉํ•˜๋ฉด ์œ„ ์˜ˆ์ œ์ฒ˜๋Ÿผ svg๋ฅผ importํ•ด์„œ ์ปดํฌ๋„ŒํŠธ๋กœ ํ˜•์‹์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“„ 3. Font Preload?

  • Create React App(CRA)๋กœ ๋งŒ๋“  ํ”„๋กœ์ ํŠธ๋Š” font๋ฅผ preloadํ•˜๋ ค๋ฉด craco์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•ด์„œ preload-webpack-plugin, webpack-font-preload-plugin์„ ์ ์šฉํ–ˆ์–ด์•ผ ํ–ˆ๋‹ค.
    • TMI: preload-webpack-plugin๋Š” webpack5๋ถ€ํ„ฐ ํ˜ธํ™˜๋˜์ง€ ์•Š์•„์„œ webpack-font-preload-plugin๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ
  • ํ•˜์ง€๋งŒ, ํ•ด๋‹น ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ๋Š” html-loader๊ฐ€ ์ ์šฉ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— preload๋ฅผ ์œ„ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
  • ์‹ค์ œ ์ ์šฉ ๋ฐฉ๋ฒ•์€ ํฐํŠธ ํŒŒ์ผ๋“ค์ด src/assets/fonts ๊ฒฝ๋กœ์— ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ , index.htmlํŒŒ์ผ์„ ์•„๋ž˜์ฒ˜๋Ÿผ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.
<head>
  <!-- head -->
  <link
    rel="preload"
    href="/src/assets/fonts/Pretendard-Medium.subset.woff"
    as="font"
    type="font/woff"
    crossorigin
  />
</head>
  • ํ˜„์žฌ ์ƒํƒœ์—์„œ build ํ•ด๋ณด๊ณ  ํ™•์ธํ•ด๋ณด๋ฉด ์ œ๋Œ€๋กœ๋œ ๊ฒฝ๋กœ๋กœ ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ_2023-04-19_แ„‹แ…ฉแ„’แ…ฎ_7 33 26


๐Ÿ‘ ๊ทธ ์™ธ ์ถ”๊ฐ€ํ•˜๋ฉด ์ข‹์€ ๋กœ๋” ๋ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ

โญ๏ธ 1. SASS(SCSS)

  • Sass๋Š” Syntactically Awesome Style Sheets์˜ ์•ฝ์ž๋กœ, CSS์˜ ํ™•์žฅ๋œ ๋ฌธ๋ฒ•์„ ์ œ๊ณตํ•˜๋Š” CSS ์ „์ฒ˜๋ฆฌ๊ธฐ(preprocessor)๋‹ค.
  • Sass๋Š” ๋นŒ๋“œ ์‹œ์— CSS ํŒŒ์ผ๋กœ ์ปดํŒŒ์ผ๋˜์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ, webpack์—์„œ Sass ํŒŒ์ผ์„ ์ฝ๊ณ , CSS ํŒŒ์ผ๋กœ ์ปดํŒŒ์ผํ•˜์—ฌ ๋ฒˆ๋“ค๋งํ•˜๋ ค๋ฉด sass-loader๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€ ์„ค์น˜

yarn add -D sass sass-loader

webpack ์…‹ํŒ…

  • [MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader'] ์™€ ๊ฐ™์ด ๋ฐฐ์—ด์„ ๋„ฃ์—ˆ๋Š”๋ฐ ์—ฌ๊ธฐ์„œ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜๋‹ค.
  • ์ด๋Š” ๋ฐฐ์—ด ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ถ€ํ„ฐ ๋กœ๋”๊ฐ€ ์ ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ, sass-loader๋ฅผ ํ†ตํ•ด์„œ ๋จผ์ € sassํŒŒ์ผ์„ css๋กœ ์ปดํŒŒ์ผ ํ•œ ํ›„, css-loader๊ฐ€ ์ปดํŒŒ์ผ ๋œ css ํŒŒ์ผ์„ ๋ชจ๋“ˆ๋กœ ์ฝ์–ด๋“ค์ธ ๋‹ค์Œ, MiniCssExtractPlugin.loader ๊ฐ€ ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ์ถ”์ถœ๋œ css ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ๋ฐฐ์—ด ์ˆœ์„œ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์ž‘์„ฑํ•˜์ง€ ๋กœ๋”๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์•„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ..๐Ÿ˜ฑ ์ˆœ์„œ๋ฅผ ๊ผญ ๋งž์ถฐ์ฃผ์ž!
module.exports = {
  module: {
    rules: [
      // ...webpack rules
      {
        test: /\.(sa|sc|c)ss$/i, // scss, sass, css ํŒŒ์ผ ๋งค์นญ
        use: [MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader'], // sass-loader ์ถ”๊ฐ€
      },
    ]
  }
}

scssํŒŒ์ผ ์ƒ์„ฑ ํ›„ ์ ์šฉ

// style.scss
body {
  font-family: Pretendard;
  background-color: rgb(192, 249, 230);
}
// App.tsx
import './style.scss';
import './style2.css';

function App() { 
  // ...
}

export default App;

โญ๏ธ 2. webpack-bundle-analyzer

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ_2022-06-04_แ„‹แ…ฉแ„’แ…ฎ_11 39 30

  • webpack-bundle-analyzer๋Š” webpack ๋ฒˆ๋“ค๋ง ๊ฒฐ๊ณผ๋ฅผ ์‹œ๊ฐํ™”ํ•˜์—ฌ ๋ฒˆ๋“ค๋ง ํฌ๊ธฐ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋„๊ตฌ๋‹ค.
  • webpack-bundle-analyzer๋Š” webpack์œผ๋กœ ๋ฒˆ๋“ค๋ง๋œ ๊ฒฐ๊ณผ๋ฌผ์„ ์‹œ๊ฐ์ ์œผ๋กœ ํŒŒ์•…ํ•˜์—ฌ ๋ฒˆ๋“ค๋ง ํฌ๊ธฐ๋ฅผ ์ค„์ด๋Š” ๋ฐ ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.
  • webpack-bundle-analyzer

ํŒจํ‚ค์ง€ ์„ค์น˜

yarn add -D webpack-bundle-analyzer

webpack ์…‹ํŒ…

const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;

module.exports = {
  plugins: [
    // webpack plugins...

    new BundleAnalyzerPlugin({
      analyzerMode: "static", // ๋ถ„์„ ํŒŒ์ผ html์„ buildํด๋”์— ์ €์žฅ
      reportFilename: 'bundle-report.html', // ๋ถ„์„ ํŒŒ์ผ ๋ณด๊ณ ์„œ ์ด๋ฆ„(์ž์œ ๋กญ๊ฒŒ ์ง€์ •)
      openAnalyzer: false, // ๋ถ„์„ ํŒŒ์ผ์„ ์‹คํ–‰ ์‹œ ์ž๋™์œผ๋กœ ์—ด์ง€ ์•Š๋Š”๋‹ค.
      generateStatsFile: true, // ๋ถ„์„ ํŒŒ์ผ์„ json์œผ๋กœ ์ €์žฅํ•œ๋‹ค.
      statsFilename: "bundle-report.json", // ๋ถ„์„ ํŒŒ์ผ json ํŒŒ์ผ ์ด๋ฆ„ (์ž์œ ๋กญ๊ฒŒ ์ง€์ •)
    })
  ]
}

package.json ์…‹ํŒ…

{
  // ...
  "scripts": {
    // ...
    "preanalyze": "yarn build:prod",
    "analyze": "webpack-bundle-analyzer ./build/bundle-report.json --default-sizes gzip",
  }
}

yarn analyze ์‹คํ–‰

  • yarn analyze ์‹คํ–‰ ์‹œ ๋นŒ๋“œ ํ›„ ๋ถ„์„ ์ง„ํ–‰
yarn analyze