Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/doong-jo/webpack-starting-from-ground
π Webpack, μ΄κ²λ§μ μκ³ κ°μ
https://github.com/doong-jo/webpack-starting-from-ground
react webpack
Last synced: about 2 months ago
JSON representation
π Webpack, μ΄κ²λ§μ μκ³ κ°μ
- Host: GitHub
- URL: https://github.com/doong-jo/webpack-starting-from-ground
- Owner: doong-jo
- Created: 2020-01-04T04:19:00.000Z (almost 5 years ago)
- Default Branch: master
- Last Pushed: 2023-01-05T04:58:18.000Z (almost 2 years ago)
- Last Synced: 2024-10-12T02:49:47.272Z (2 months ago)
- Topics: react, webpack
- Language: JavaScript
- Homepage: https://velog.io/@sdong001/Webpack-%EC%9D%B4%EA%B2%83%EB%A7%8C%EC%9D%80-%EC%95%8C%EA%B3%A0-%EA%B0%80%EC%9E%90
- Size: 1.68 MB
- Stars: 4
- Watchers: 0
- Forks: 0
- Open Issues: 24
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# [Webpack, μ΄κ²λ§μ μκ³ κ°μ](https://velog.io/@sdong001/Webpack-%EC%9D%B4%EA%B2%83%EB%A7%8C%EC%9D%80-%EC%95%8C%EA%B3%A0-%EA%B0%80%EC%9E%90)
## μ΄κ²λ§μ μμμΌ νμ§ μμκΉ
Webpackμ μΉ μ΄ν리μΌμ΄μ μ κ°λ°ν λ κ°μ₯ μΈκΈ° μλ λ²λ€λ¬μ λλ€. React μ±μ λΉλν΄μ£Όλ λκ΅¬λ‘ μκ°νκ³ CRAμ Webpack μ€μ μ κ·Έλλ‘ μ¬μ©νκΈ° 보λ€λ μ΄κ²μ΄ μ΄λ»κ² λμνλμ§, ν΅μ¬ μ리λ 무μμΈμ§ μ΄ν΄ν΄μΌ νμ§ μμκΉ? λΌλ μκ°μμ κΈμ μ κ²λμμ΅λλ€. νμ§λ§ Webpackμμ μ¬μ©νλ λͺ¨λ νλ¬κ·ΈμΈκ³Ό λ²λ€λ¬, μ΅μ ν μ΅μ μ 곡λΆνκΈ° 보λ€λ Webpackμ λμμ리μ ν΅μ¬ μμλ€μ μ΄ν΄νκ³ μν©μ λ§κ² νμν κ²λ€μ νμ΅νλ κ²μ΄ ν¨μ¨μ μ΄λΌκ³ μκ°ν©λλ€. κ·Έλμ **μ΄ κΈμμλ Webpackμ κΉμ΄μλ λ΄μ©λ³΄λ€ μκ² 'μ΄κ²λ§μ μμμΌ νμ§ μμκΉ' λΌκ³ μκ°λλ λ΄μ©μ μ μ΄λ΄€μ΅λλ€.**
## Webpackμ λν΄μ
![webpack](https://user-images.githubusercontent.com/35218826/59730847-eb233b00-927e-11e9-9788-408e699c9e58.png)
[μΆμ²](https://medium.com/@paul.allies/webpack-managing-javascript-and-css-dependencies-3b4913f49c58)Webpackμ λͺ¨λ μλ°μ€ν¬λ¦½νΈ μ ν리μΌμ΄μ μ μν΄ μ¬μ©λλ μ μ λͺ¨λ λ²λ€λ¬μ λλ€. μ¬κΈ°μ λ²λ€λ¬λ μ¬λ¬ ν¨ν€μ§, κ΄λ ¨λ νμΌλ€μ νλλ‘ λ¬Άμ΄μ£Όλ λꡬλΌκ³ μκ°ν μ μμ΅λλ€. λ΄λΆμ μΌλ‘λ νλ‘μ νΈμ νμν μμ κ°μ μμ‘΄μ± κ·Έλνλ₯Ό μ°Έκ³ νμ¬ νλ μ΄μμ λ²λ€λ‘ λ§λ€μ΄λ λλ€.
### Bundleκ³Ό Chunk
![](https://res.cloudinary.com/practicaldev/image/fetch/s--4_Wazx_7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ukz25x0zjhsu9docg5ob.png)
[μΆμ²](https://dev.to/websavi/how-to-code-split-redux-store-to-further-improve-your-apps-performance-4gg9)
#### Bundle
> Webpackμμλ μλ°μ€ν¬λ¦½νΈλ₯Ό ν¬ν¨νμ¬ μ¬λ¬ 리μμ€λ€μ μ°κ²°ν(Concentarte) κ²°κ³Όλ¬Όμ λλ€. Bundleμ μ¬λ¬ κ°μ Chunkλ‘ κ΅¬μ±λ©λλ€.
#### Chunk
> λͺ¨λ μ½λλ₯Ό νλμ κ±°λν νμΌ(Bundle)λ‘ λ§λ€μ§ μκΈ° μν΄μ μ¬λ¬κ°μ ChunkλΌλ λ¨μλ‘ λλλλ€. μ½λκ° μ΄λ»κ² λλλμ§μ λν λ°©λ²λ μμλ‘ κ΅¬μ±ν μ μμ΅λλ€.
### μ Webpackμ μ¨μΌν κΉ
μ°λ¦¬κ° μ Webpackμ μ¬μ©ν΄μΌ νλμ§ μ΄ν΄νκΈ° μν΄μλ κ·Έ μ΄μ μΉμμ μλ°μ€ν¬λ¦½νΈλ₯Ό μ¬μ©ν λ λ²λ€λ¬λ μ΄λ λμ§ μ΄ν΄λ΄μΌ ν©λλ€.
λ κ°μ§ λ°©λ²μ΄ μμλλ° νλλ λ무 λ§μ μ€ν¬λ¦½νΈλ₯Ό λΆλ¬μ€λ κ²μ΄μμ΅λλ€. μ΄ λ°©λ²μ λ€νΈμν¬ λ³λͺ©μ μΌμΌμΌ°κ³ μμ² μ§μ°μ λ¬Έμ κ° μμμ΅λλ€. λλ²μ§Έ λ°©λ²μ λͺ¨λ μ½λλ₯Ό ν¬ν¨νκ³ μλ νλμ ν° `.js` νμΌμ μ¬μ©νλ κ²μ΄μλλ°, μ€μ½ν, ν¬κΈ°, κ°λ μ±, μ μ§λ³΄μμ±μ λν μ΄μ λ‘ λ¬Έμ κ° λ§μμ΅λλ€.
#### Webpackμ ν΅μ¬ μ리, ν΄κ²°μ± [IIFE, Imeadiately invoked function expressions (μ¦μ μ€ν ν¨μ νν)](https://developer.mozilla.org/ko/docs/Glossary/IIFE)
> IIFEλ μ€ν¬λ¦½νΈ νμΌμ νλμ IIFEλ₯Ό μ¬μ©ν¨μΌλ‘μ¨ ν° νλ‘μ νΈμμ μ€μ½ν μ΄μλ₯Ό ν΄κ²°ν μ μμ΅λλ€. λ°λΌμ IIFEλ₯Ό μ¬μ©ν¨μΌλ‘μ¨ μ€μ½ν μΆ©λμ λν΄ κ±±μ ν νμ μμ΄ μμ νκ² μ½λλ₯Ό λ²λ€λ§ν μ μμ΅λλ€.
Webpackμ IIFEλ₯Ό μ¬μ©νλ©° κ·Έ λ°μ μ¬μ©νλ λꡬλ‘μ¨λ Make, Gulp, Grund, Brocooli or Brunchκ° μμ΅λλ€. μ΄ λꡬλ€λ μλ €μ§κ³Ό κ°μ΄ λ²λ€λ¬(λλ ν μ€ν¬ λ¬λ)λ‘μ¨ νλ‘μ νΈ νμΌλ€μ λͺ¨λ λ²λ€λ§ν΄μ€λλ€. νμ§λ§ λ€λ₯Έ λꡬλ€κ³Ό λ€λ₯΄κ² Webpackμ [dependency graph](https://Webpack.js.org/concepts/dependency-graph/)λ₯Ό μμ±νμ¬ λΉλμμΌμ£Όλ λꡬλ‘μ¨ ν¬κ³ 볡μ‘ν 리μμ€κ° μλ νλ‘μ νΈμμλ Webpackμ μ¬μ©νλ κ²μ΄ μ’μ΅λλ€. (Grunt, Gulpλ μ€λ‘μ§ λ¦¬μμ€μ λν ν΄λ‘ μ¬μ©λλ©° dependency graph κ°λ μ΄ μμ) λν λΉμ·ν Browsifyμ λΉκ΅νλ€λ©΄ μλλ©΄μμ μ’ λ μ°μν©λλ€.
Webpackμ μ¬μ©νμ§ μκ³ λ²λ€λ§μ νλ€κ³ κ°μ ν΄λ³Έλ€λ©΄, νλμ νμΌμ λ³κ²½νλ€λ κ²μ (λ²λ€μ μλ‘ λ§λ€μ΄μΌνλ―λ‘)μ 체λ₯Ό λ€μ λΉλνλ€λ κ²μ λλ€. μ΄λ₯Ό ν΄κ²°νκΈ° μν΄ λ²λ€λ§μ μ½κ²νλ €λ©΄ νμΌλ€ κ°μ μ€ν¬λ¦½νΈλ₯Ό μ¬μ¬μ©ν΄μΌν©λλ€. νμ§λ§ μ΄λ₯Ό μ΅μ ννμ¬ λΉλνλ κ²μ μ΄λ ΅μ΅λλ€. λν μ½λλ₯Ό μμ±ν λ€μ κ·Έ μ½λκ° μ€ν¬λ¦½νΈμμ μ€μ λ‘ μ¬μ©λλμ§ μλμ§ μ΄λ»κ² μ μ μμκΉμ?
μλ₯Ό λ€μ΄ lodashμμ λ¨μΌν¨μ λ§ μ¬μ©νλλΌλ lodash μ 체 μ½λλ₯Ό μΆκ°ν λ€μ ν¨κ» λ²λ€λ§ν΄μΌν©λλ€. μ΄λ¬ν μ½λμ μ’ μμ±μ μ΄λ»κ² ν΄κ²°ν κΉμ? μ½λμ λ‘λ©μ§μ°μ 컀μ§λ κ²μ λ§μμΌνλ©° μ΄λ₯Ό ν΄κ²°νκΈ° μν΄μ κ°λ°μμ λ§μ μμμ μ΄ νμν©λλ€.
μ΄λ¬ν μν©μ ν΄κ²°νκΈ° μν λ°©λ²μΌλ‘ Webpackμ μ¬μ©νμ¬ κ°λ°μκ° μ§μ νκΈ° μ΄λ €μ΄ **λ²λ€λ§μ μ±λ₯κ³Ό μ΅μ νλ₯Ό λΉκ΅μ μ½κ² κ°μ ν μ μμ΅λλ€.** λν κ°λ ₯ν κΈ°λ₯ μ€ νλμΈ [μ½λ μ€ν리ν ](https://webpack.js.org/guides/code-splitting/)μ μ΄μ©νμ¬ **νμν λͺ¨λλ§ λ‘λνμ¬ μμ² μ§μ°μ μ€μΌ μ μμ΅λλ€.**
### Webpackμ ν΅μ¬μμ
μλλ Webpackμ coreλΌκ³ ν μ μλ μμλ€μ λλ€. μ΄ μμλ€μ μ½λμ ν¨κ» μ΄ν΄λ³΄κ² μ΅λλ€.
- Entry
- Output
- Loaders
- Plugins
- Mode#### create-react-app webpack(μ΄ν 'CRA') μ€μ λ―μ΄λ³΄κΈ°
CRAλ Reactλ‘ κ°λ°ν λ κ°μ₯ μ μ©ν 보μΌλ¬νλ μ΄νΈμ λλ€. μ΄ CRA μ€μ μλ Reactλ₯Ό ꡬμ±νλλ° νμν Webpack μ€μ λ€μ΄ κΈ°λ³ΈμΌλ‘ μμ±λμ΄ μμ΅λλ€. μ΄ μ€μ λ€μ 보며 Reactμμ Webpackμ μ΄λ»κ² μ€μ νλμ§ μ΄ν΄λ³΄κ² μ΅λλ€.μΌλ°μ μΌλ‘ CRAλ₯Ό ν΅ν΄ React νκ²½ ꡬμ±μνλ©΄ Webpack κ΄λ ¨ μ€μ λ€μ΄ μ¨κ²¨μ Έμλλ° μ΄λ₯Ό κΊΌλ΄μ΄ κ°λ°μκ° μ§μ μμ ν μ μλλ‘ ν΄μΌν©λλ€.
1. CRAλ₯Ό ν΅ν React ν경ꡬμ±
```sh
npx create-react-app myapp
```2. `eject`λ₯Ό ν΅ν΄ Webpack μ€μ μ μΈλΆλ‘ κΊΌλ΄κΈ°
```sh
npm run eject# λλ yarn
yarn eject
```μ΄λ κ² `eject` μ€ν¬λ¦½νΈλ₯Ό ν΅ν΄ μ€μ μ κΊΌλΌ μ μμΌλ©° `config`μ `script` λλ ν°λ¦¬κ° μμ±λλλ° `config/webpack.config.js` μμ Webpack νκ²½μ€μ μ λ³Ό μ μμ΅λλ€.
μ΄ μμλ€μ CRAμμμ `webpack.config.js` μ½λμμ λͺ¨λ μ€μ μ μ΄ν΄λ³΄μ§ μκ³ ν΅μ¬μ μΈ λΆλΆλ§ νλμ© μ΄ν΄λ³΄λλ‘ νκ² μ΅λλ€.
#### 1. Entry / Output
![entry](https://getdrip.s3.amazonaws.com/uploads/image_upload/image/325131/embeddable_a721c3b5-1335-4b71-aeca-cd4d436f554b.png)
entryλ buildingμ μμμ μ΄λΌκ³ λ³Ό μ μμΌλ©°, outputμ buidling λ νμΌμ κ²°κ³Όλ₯Ό μ 곡ν©λλ€.
```js
entry: [
// dev λͺ¨λλ©΄ Hot reload(νμΌμ λ³κ²½μ¬ν μλ λ°μ) μ€μ μ μΆκ°
isEnvDevelopment && require.resolve('react-dev-utils/webpackHotDevClient'),// src/index.js
paths.appIndexJs
].filter(Boolean), // trueκ°μΈ κ²°κ³Όλ§ λ°ν
``````js
output: {
// build path, filename μ§μ
path: isEnvProduction ? paths.appBuild : undefined,
filename: isEnvProduction
? 'static/js/[name].[contenthash:8].js' // ν΄μ κ°μ λ£μμΌλ‘μ¨ λ‘컬μμ μΊμ±μ μ λν μ μμ΅λλ€.
: isEnvDevelopment && 'static/js/bundle.js',
// more...
},
```#### 2. Loaders
loaderλ λ²λ€λ§ν νμΌμ λν κ·μΉμ μ νκ³ μ€ννλ μν μ λ΄λΉν©λλ€. μλμ μ½λλ λͺ¨λμ΄ λ μ μλ νμΌλ€μ `babel-loader`λ₯Ό ν΅ν΄ μ½μ΄λ€μ΄λ κ²μ λ³Ό μ μμ΅λλ€.
```js
loaders: [
{
test: /\.(js|mjs|jsx|ts|tsx)$/,
include: paths.appSrc,
loader: require.resolve("babel-loader")
// ...
}
];
```리μμ€ νμΌλ€ λν loaderλ₯Ό μ€μ ν μ μμ΅λλ€.
```js
loaders: [
{
test: /\.(js|mjs|jsx|ts|tsx)$/,
include: paths.appSrc,
loader: require.resolve("babel-loader")
// ...
},
{
test: [/\.bmp$/, /\.gif$/, /\.jpe?g$/, /\.png$/],
loader: require.resolve("url-loader")
}
];
```#### 3.Plugins
νλ¬κ·ΈμΈμ λ²λ€ μ΅μ ν, νκ²½ λ³μ μ£Όμ κ³Ό κ°μ μμ λ€μ μνν μ μμΌλ©° μ΄μΈμλ λ€μν κΈ°λ₯λ€μ΄ μ‘΄μ¬ν©λλλ€. μλ μ½λμμλ `HtmlWebPackPluglin`μ μ¬μ©νμ¬ `filename`μ κ°μΌλ‘ μ§μ λ νμΌμμ `` νκ·Έλ₯Ό μ£Όμ ν©λλ€.
```js
plugins: [
new HtmlWebpackPlugin(
Object.assign(
{},
{
inject: true,
template: paths.appHtml // ./src/index.html
},
isEnvProduction
? {
minify: {
removeComments: true
//...
}
}
: undefined
)
)
// more ...
];
```#### 4.Mode
webpackμ ꡬλμν¬ modeλ₯Ό μ§μ ν΄μ€ μ μμ΅λλ€. `development`, `production`, `none` μΈκ°μ§κ° μλλ° κ°κ°μ μ€μ μ λ°λΌ webpackμ λ΄μ₯λ μ΅μ νλ₯Ό μ΄λ€ λ°©μμΌλ‘ ν μ§ μ§μ ν μ μμ΅λλ€. [webpackμ mode λ¬Έμ](https://webpack.js.org/configuration/mode/)λ₯Ό μ°Έκ³ νμ¬ μ΄λ€ μ΅μ νκ° μ€μ λλμ§ μμΈνκ² μ μ μμ΅λλ€. μ΄λ₯Ό λ°νμΌλ‘ μμλ‘ `optimization` μμ±μ μ΅μ ν μ΅μ μ μΆκ°ν μ μμ΅λλ€.
```js
mode: isEnvProduction ? 'production' : isEnvDevelopment && 'development',
```## μ§μ Bundleμ μ΅μ ννλ €λ©΄? webpack-bundle-analyzer
λ²λ€μ ꡬμ±μ¬νμ νλ²μ λ³Ό μ μλ λꡬμ λλ€. μ΄λ₯Ό νμ©νμ¬ μ΄λ€ ꡬμ±μ΄ bundleμ ν¬κΈ°λ₯Ό μΌλ§λ μ°¨μ§νλμ§ νμΈν μ μκ³ μ΄λ₯Ό ν΅ν΄μ Webpack μ€μ μ μμ νκ±°λ λΌμ΄λΈλ¬λ¦¬ κ΅μ²΄λ κ³ λ €ν΄λ³Ό μ μμ΅λλ€.
[webpack-bundle-analyzer](https://github.com/webpack-contrib/webpack-bundle-analyzer)
![](https://cloud.githubusercontent.com/assets/302213/20628702/93f72404-b338-11e6-92d4-9a365550a701.gif)
## μκ°
Reactλ‘ κ°λ°νλ©° λΉλμ λν΄μλ ν¬κ² κ΄μ¬μ κ°μ§μ§ μμμλλ° κ΄μ¬μ κ°μ§κ³ μκ°κ³Ό λ Έλ ₯μ λ€μΌμλ‘ μ±λ₯μ ν₯μμν¬ μ μλ€λ κ²μ μμμ΅λλ€. λν SPAλ₯Ό κ°λ°ν λ λΉλ λꡬλ₯Ό λ§μ΄ μ¬μ©νκ² λλλ° μ΄λ₯Ό μ μ΄ν΄νμ§ λͺ»ν μ± κ°λ°νλ 건 λ§μΉ μΉ΄λ©λΌμ 쑰리κ°μ λ μ¦λ₯Ό μ μ΄ν΄νκ³ μλ μ¬μ§κ°κ° μΌλ°μΈλ³΄λ€ μ¬μ§μ μ μ°λ κ²κ³Ό λ§μ°¬κ°μ§ μλκΉ μκ°μ΄ λ€μμ΅λλ€. λΉλ λꡬλ ν¨κ» μ΄ν΄νλ€λ©΄ μ’μ μ±λ₯μ λΌ μ μμ κ² κ°μ΅λλ€.
[μΈλ€μΌ μΆμ²](https://www.toptal.com/react/webpack-react-tutorial-pt-1)