Webpack - newlife-js/Wiki GitHub Wiki

NPM

NPM(Node Package Manager) : JS ์–ธ์–ด๋ฅผ ์œ„ํ•œ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž
https://www.npmjs.com/

* npm ์žฅ์ 

library ๊ฐ„์˜ ์˜์กด์„ฑ, ๋ฒ„์ „ ๊ด€๋ฆฌ๊ฐ€ ์‰ฌ์›€(package.json์—์„œ)

* npm init -y

package.json์„ ์ƒ์„ฑ

* npm install 'ํŒจํ‚ค์ง€๋ช…'

node_modules ํด๋” ์•ˆ์— ์„ค์น˜๋จ
์ „์—ญ ์„ค์น˜(--global) ์‹œ์—๋Š” '%USERPROFILE%\AppData\Roaming\npm\node_modules' ์— ์„ค์น˜๋จ
package.json์— dependencies๊ฐ€ ์ž…๋ ฅ๋จ
--save-dev(-D) -> package.json์— devDependencies๋กœ ์ž…๋ ฅ๋จ

dependencies : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋™์ž‘์— ํ•„์š”ํ•œ ๋ฐฐํฌ์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(jquery, vue ๋“ฑ)
devDependencides : ๊ฐœ๋ฐœ์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(webpack ๋“ฑ)

npm i

package.json์— ์˜์กด์„ฑ ๋งบ์€ ๋ชจ๋“ˆ๋“ค์„ ์„ค์น˜ํ•ด์คŒ


Webpack

webpack : ํ”„๋ŸฐํŠธ์—”๋“œ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ (HTML, CSS, JS, image ๋“ฑ์„ ๋ณ‘ํ•ฉ) ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์œ„ํ•œ ์‚ฌ์ „ ์ปดํŒŒ์ผ๋Ÿฌ
์‹ค์Šต url npm i webpack webpack-cli -D

script ์ž‘์„ฑ ํ›„,
package.json์— ์•„๋ž˜๋ฅผ ์ถ”๊ฐ€ํ•œ ํ›„ npm run build๋กœ ๋นŒ๋“œ๋ฅผ ํ•˜๋ฉด distํด๋”์™€ main.js๊ฐ€ ์ƒ์„ฑ๋จ

"scripts": {
  "build": "webpack --mode=none"
}

npm run build๋ฅผ ์‹คํ–‰ํ•˜๋ฉด "build" : ์— ์žˆ๋Š” ๊ฒƒ๋“ค์ด ์‹คํ–‰๋œ๋‹ค๊ณ  ๋ณด๋ฉด ๋จ
ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ๋ ˆ๋ฒจ์— webpack.config.js ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์„œ entry, output ๋“ฑ์˜ ์˜ต์…˜์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Œ

var path = require('path');

module.exports = {
  mode: 'none', // none์œผ๋กœ ํ•ด์•ผ main.js ํŒŒ์ผ์„ ํ•ด์„ํ•  ์ˆ˜ ์žˆ์Œ -> ๋ฐฐํฌํ• ๋• production์œผ๋กœ
  entry: './src/index.js',
  output: { // webpack์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๋นŒ๋“œ ๊ฒฐ๊ณผ ํŒŒ์ผ
    filename: 'main.js',
    path: path.resolve(__dirname, 'dist')
  }
};

webpack ์žฅ์ 

request ์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Œ(๊ฐœ๋ณ„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งˆ๋‹ค ๋‹ค ์š”์ฒญํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ)
๋ธŒ๋ผ์šฐ์ € ๋ณ„๋กœ http ์š”์ฒญ ์ˆซ์ž๊ฐ€ ์ œํ•œ๋˜์–ด ์žˆ์Œ(ํฌ๋กฌ: 6๊ฐœ)
๊ฐœ๋ฐœ์ž๋„๊ตฌ - Network์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ
gulpํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์„œ ๋Œ๋ฆฌ๋˜ ์ž‘์—…๋“ค์„ ์ž๋™์œผ๋กœ ํ•ด์คŒ

sourcemap

webpack.config.js์— devtool: 'sourec-map' ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด
๊ฐœ๋ฐœ์ž ๋„๊ตฌ์—์„œ source๋Š” ๋ณ‘ํ•ฉ๋˜๊ธฐ ์ „ ์›๋ณธ ํŒŒ์ผ๋“ค๋กœ ๊ตฌ๋ถ„๋˜์–ด ์žˆ๋Š”๊ฑธ ๋ณผ ์ˆ˜ ์žˆ์Œ


Webpack ์ฃผ์š” ์†์„ฑ

entry, output, loader, plugin

1. entry

๋นŒ๋“œํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ตœ์ดˆ ์ง„์ž…์ 

2. output

๋นŒ๋“œ๋œ ๊ฒฐ๊ณผ๋ฌผ์˜ ํŒŒ์ผ ๊ฒฝ๋กœ

3. loader(module)

https://webpack.js.org/loaders/
js๊ฐ€ ์•„๋‹Œ ์›น ์ž์›๋“ค์„ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์†์„ฑ
importํ•œ ์›น ์ž์›์„ ๋นŒ๋“œ ํŒŒ์ผ์— ๋„ฃ์–ด์คŒ
use: loader์˜ ์ˆœ์„œ๋Š” ์˜ค๋ฅธ์ชฝ๋ถ€ํ„ฐ.. ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ๋ฉด build๊ฐ€ ์•ˆ๋จ ์˜ˆ) style-loader, css-loader

module: {
  rules: [
    {
      test: /\.css$/,
      use: ['style-loader', 'css-loader']
      // style-loader : css style์„ <head> ์•ˆ์— inline์œผ๋กœ ์‚ฝ์ž…
      // css-loader : cssํŒŒ์ผ์„ importํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ
    }
  ]
}

4. plugins

https://webpack.js.org/plugins/
์›นํŒฉ์˜ ๊ธฐ๋ณธ์ ์ธ ๋™์ž‘์— ์ถ”๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ์ œ๊ณต
๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ์˜ ํ˜•ํƒœ๋ฅผ ๋ฐ”๊พธ๋Š” ์—ญํ• 

var path = require('path');
var MiniCssExtractPlugin = require("mini-css-extract-plugin");

module.exports = {
  mode: 'none',
  entry: './index.js',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist')
  },
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          { loader: MiniCssExtractPlugin.loader },
          "css-loader"
        ]
      }
    ]
  },
  plugins: [
    new MiniCssExtractPlugin()
    // css๋ฅผ ํ†ตํ•ฉ๋œ .cssํŒŒ์ผ๋กœ extractํ•จ(main.css) -> index.html์— link ๊ฑธ์–ด์ค˜์•ผ ํ•จ
  ],
}

โ€ป html-webpack-plugin tempale:์— ์ง€์ •ํ•œ .html ํŒŒ์ผ์— ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ์„ ํฌํ•จํ•จ


Webpack Dev Server

์ฝ”๋“œ ๋ณ€๊ฒฝ์‹œ๋งˆ๋‹ค ๋นŒ๋“œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š์•„๋„, ์ €์žฅ๋งŒ ํ•˜๋ฉด ์ž๋™์œผ๋กœ ๋นŒ๋“œํ•˜๊ณ  ์ƒˆ๋กœ๊ณ ์นจ ํ•ด์คŒ
๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ์€ ํŒŒ์ผ์ด ์•„๋‹Œ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋จ

"scripts": {
  "dev": "webpack serve",
  "build": "webpack"
}

npm run dev

โš ๏ธ **GitHub.com Fallback** โš ๏ธ