nuuco / webpack-study-nomal-app

๐Ÿš€ ์›นํŒฉ(webpack) ์„ค์ • ๋ฐ ๋ฒˆ๋“ค๋ง ์—ฐ์Šตํ•ด๋ณด๊ธฐ

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

์›นํŒฉ(Webpack) ๋ฒˆ๋“ค๋ง ์—ฐ์Šต

๐Ÿ‘‰ ๋ฆฌ์•กํŠธ ์•ฑ ์›นํŒฉ ๋ฒˆ๋“ค๋ง ์—ฐ์Šต ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“Œ Webpack ์„ ์ ์šฉํ•ด๋ณด์ž

  1. package.json ๋งŒ๋“ค๊ธฐ

    • ์šฐ์„  ๋‹ค์Œ ๋ช…๋ น์–ด๋กœ ๊ธฐ๋ณธ ์„ค์ •๋œ package.json ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์ค€๋‹ค.
    $ npm init -y

  1. webpack ์„ค์น˜ํ•˜๊ธฐ

    • ์›นํŒฉ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด webpack ๊ณผ webpack-cli ๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•œ๋‹ค.
      โ€ป ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋งŒ ํ•„์š”ํ•œ ๋ชจ๋“ˆ์ด๋ฏ€๋กœ -D (๋˜๋Š” โ€”save-dev) ๋กœ ์„ค์น˜
    $ npm install -D webpack webpack-cli

  1. webpack.config.js ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ

    • ์›นํŒฉ ์„ค์ • ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์ค€๋‹ค. ๋ฒˆ๋“ค ํŒŒ์ผ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ entry, output ๋‘ ์†์„ฑ์ด ํ•„์š”ํ•˜๋‹ค.

      • entry : ๋ฒˆ๋“ค๋ง ์‹œ์ž‘ ํŒŒ์ผ ์œ„์น˜
      • output : ๋ฒˆ๋“ค๋ง ๊ฒฐ๊ณผ๋ฌผ
    • ์ด๋•Œ ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด path ๋ชจ๋“ˆ์„ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

      โ€ป path.resolve(โ€™๊ฒฝ๋กœ1โ€™, โ€˜๊ฒฝ๋กœ2โ€™โ€ฆ) ๋Š” ์ธ์ž๋กœ ๋ฐ›์€ ๊ฒฝ๋กœ๋ฅผ ํ•ฉ์ณ์ค€๋‹ค. โ†’ ๊ฒฝ๋กœ1/๊ฒฝ๋กœ2

    //webpack.config.js
    const path = require('path');
    
    module.exports = {
      entry: './src/index.js',
      output: {
        path: path.resolve(__dirname, 'dist'), // './dist'์˜ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ๋ฆฌํ„ด
        filename: 'app.bundle.js',
      },
    };

  1. webpack ์Šคํฌ๋ฆฝํŠธ ์„ธํŒ…

    • npx webpack ๋ช…๋ น์–ด๋กœ ์›นํŒฉ์„ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌ๋ฉด entry ํŒŒ์ผ์—์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ๋ฒˆ๋“ค๋งํ•œ ๊ฒฐ๊ณผ๋ฅผ output ์— ์ง€์ •ํ•œ ํŒŒ์ผ๋กœ ๋งŒ๋“ค์–ด ์ค€๋‹ค.
    • ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž์™€ ํ˜‘์—…ํ•  ๋•Œ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์ŠคํŠธ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ๊ฒŒ ์ข‹๋‹ค.
    //package.json
    "scripts": {
    	"build": "webpack", // here
        "test": "echo \"Error: no test specified\" && exit 1"
      },

  1. ์˜์กด์„ฑ ๋ชจ๋“ˆ js ํŒŒ์ผ์— ๋„ฃ์–ด์ฃผ๊ธฐ
    • js ํŒŒ์ผ์— require ๋กœ ํ•„์š”ํ•œ ํŒŒ์ผ์„ ๋„ฃ์–ด์ค€๋‹ค. (์™ธ๋ถ€ํŒŒ์ผ, ์ด๋ฏธ์ง€, css ๋“ฑ๋“ฑโ€ฆ)

    • ํ•„์š”ํ•œ ๋ชจ๋“ˆ์„ js ํŒŒ์ผ ์•ˆ์—์„œ require ๋กœ ๊ฐ€์ ธ์™€์•ผ ์›นํŒฉ์ด ํ•„์š”ํ•œ ํŒŒ์ผ๋กœ ์ธ์‹ํ•ด ๋ฒˆ๋“ค๋งํ• ๋•Œ ๊ฐ™์ด ๋ฌถ์–ด์ค€๋‹ค. (js ํŒŒ์ผ์ด๋ผ๋ฉด module.exports ๋กœ ๋‚ด๋ณด๋‚ด์ฃผ๋Š” ๊ฒƒ ์žŠ์ง€ ๋ง์ž.)

      //./src/script.js
      require('./style.css');
      const { agoraStatesDiscussions } = require('./data.js');
      ...
      
      //./src/data.js
      module.exports.agoraStatesDiscussions = {...};

  1. ๋กœ๋”(loader) ๋กœ ๋‹ค๋ฅธ ์œ ํ˜• ํŒŒ์ผ ์ „์ฒ˜๋ฆฌ ํ•ด์ฃผ๊ธฐ
    • ์›นํŒฉ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ js ์™€ JSON ๋งŒ ์ดํ•ดํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋‹ค๋ฅธ ํŒŒ์ผ์„ ๋„ฃ์–ด์ค€ ๊ฒฝ์šฐ ๋กœ๋”(loader) ๋กœ ์ „์ฒ˜๋ฆฌ ํ•ด์ค˜์•ผํ•œ๋‹ค.

      โ€ป css ํŒŒ์ผ์„ js ํŒŒ์ผ์— ๋„ฃ์–ด์ค€ ๊ฒฝ์šฐ, ์›นํŒฉ์ด ํŒŒ์ผ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ด ์—๋Ÿฌ ๋ฐœ์ƒ

    • ์‚ฌ์šฉํ•˜๋Š” ํŒŒ์ผ(๋ชจ๋“ˆ) ์ข…๋ฅ˜์— ๋”ฐ๋ผ ์ ํ•ฉํ•œ ๋กœ๋”๋ฅผ ์„ค์น˜ํ•œ ๋’ค, webpack.config.js ํŒŒ์ผ์˜ module ์†์„ฑ ์•ˆ์— ์ž‘์„ฑํ•ด์ค€๋‹ค.

    • ๐Ÿ’ป ์˜ˆ๋ฅผ ๋“ค์–ด, css ํŒŒ์ผ์„ ๋ฒˆ๋“คํŒŒ์ผ(js)์— ์ ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด

      1. css-loader ์™€ style-loader ๋ฅผ ์„ค์น˜ํ•œ๋‹ค.

        โ€ป css-loader ๋Š” css ํŒŒ์ผ์„ json ์œผ๋กœ ๋ณ€ํ™˜์‹œ์ผœ์ฃผ๊ณ , style-loader ๋Š” ์ด json ์„ style ํƒœ๊ทธ ์•ˆ์— ๋„ฃ๊ณ  html ๋ฌธ์„œ์— ์‚ฝ์ž…ํ•ด์ค€๋‹ค. ์ฆ‰, style-loader ๊ฐ€ ์—†์œผ๋ฉด css ๊ฐ€ ๋ฐ˜์˜๋˜์ง€ ์•Š๋Š”๋‹ค.

        $ npm i -D css-loader style-loader
      2. webpack ์„ค์ • ํŒŒ์ผ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถ”๊ฐ€ํ•œ๋‹ค.

        module.exports = {
        	...
          module: {
            rules: [
              {
                test: /\.css$/,
                use: ["style-loader", "css-loader"],
        				//์ด๋•Œ, ์˜ค๋ฅธ์ชฝ๋ถ€ํ„ฐ ๋กœ๋”๊ฐ€ ์ ์šฉ๋˜๋ฏ€๋กœ css-loader๊ฐ€ ๋งจ ์˜ค๋ฅธ์ชฝ์ด์–ด์•ผํ•œ๋‹ค.
                exclude: /node_modules/,
              }
            ],
          },
        };
      3. ์›นํŒฉ์„ ์‹คํ–‰์‹œํ‚ค๋ฉด ์ด๋ ‡๊ฒŒ ๋ฒˆ๋“ค ํŒŒ์ผ(js)์— css ๊ฐ€ ๋ฌธ์ž์—ด๋กœ ๋“ค์–ด๊ฐ€ ์žˆ๊ณ , ์‹คํ–‰ํ•œ html ๋ฌธ์„œ์— <style> ํƒœ๊ทธ๊ฐ€ ์‚ฝ์ž…๋˜์–ด ์žˆ๋‹ค.(์‹ค์ œ ํŒŒ์ผ์—” ์—†๊ณ , ์‹คํ–‰์‹œ DOM ์— ์‚ฝ์ž…๋˜์–ด ์žˆ๋‹ค.)


  1. ํ”Œ๋Ÿฌ๊ทธ์ธ(plugin) ์‚ฌ์šฉํ•˜๊ธฐ
    • ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•ด์„œ ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๐Ÿ’ป ์›นํŒฉ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ js ํŒŒ์ผํ•˜๋‚˜๋งŒ ๋ฒˆ๋“ค ํŒŒ์ผ๋กœ ๋งŒ๋“ค๊ธฐ์— html ๋ฌธ์„œ๋Š” ๋ฒˆ๋“ค ํด๋”์— ๋”ฐ๋กœ ์ƒ์„ฑํ•ด์ค˜์•ผํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ html-webpack-plugin ์„ ์‚ฌ์šฉํ•˜๋ฉด html ๋„ ๋ฒˆ๋“ค ํด๋”์— ์ž๋™ ์ƒ์„ฑํ•ด์ค€๋‹ค.
      1. ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜

        $ npm i -D html-webpack-plugin
      2. webpack ์„ค์ • ํŒŒ์ผ์— ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋ถˆ๋Ÿฌ์˜ค๊ณ , plugins ์†์„ฑ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถ”๊ฐ€ํ•œ๋‹ค.

        const path = require('path');
        //์„ค์น˜ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๋ฐ˜๋“œ์‹œ ๋ถˆ๋Ÿฌ์™€์•ผํ•œ๋‹ค.
        const HtmlWebpackPlugin = require('html-webpack-plugin');
        
        module.exports = {
          ...
          plugins: [new HtmlWebpackPlugin({
            template: path.resolve(__dirname, "src", "index.html")
            //๋ฒˆ๋“ค ํด๋”์— ์ƒ์„ฑํ•ด์ค€ ๊ธฐ์กด html ๋ฌธ์„œ ์œ„์น˜
          })]
        };
      3. ์›นํŒฉ์„ ์‹คํ–‰ํ•˜๋ฉด ๋ฒˆ๋“ค ํด๋”์— html ๋ฌธ์„œ๊ฐ€ ์ƒ๊ธฐ๊ณ  ์ž๋™์œผ๋กœ ๋ฒˆ๋“ค๋ง๋œ js ๋ฌธ์„œ๊ฐ€ script ํƒœ๊ทธ๋กœ ๋“ค์–ด๊ฐ€ ์žˆ๋‹ค.


  1. ์ถ”๊ฐ€ ์„ค์ •ํ•˜๊ธฐ - target, mode, output.clean ๋“ฑ

    • target: ["web", "es5"] :
      web ์šฉ es5 ๋ฌธ๋ฒ•์œผ๋กœ ์ปดํŒŒ์ผ(๋ฒˆ๋“ค๋ง) ํ•˜๊ฒ ๋‹ค. โ†’ ES6๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅ โ†’ ๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์„ฑ โฌ†๏ธ
    • mode: "production" :
      ๋ฐฐํฌ ๋ชจ๋“œ๋กœ ์„ค์ • โ†’ ์ฝ”๋“œ๊ฐ€ ์ถ•์•ฝํ™” ๋˜์–ด ์žˆ๋‹ค. ๊ฐœ๋ฐœ๋ชจ๋“œ๋Š” โ€œdevelopmentโ€ โ†’ ์ฝ”๋“œ ์ฝ๊ธฐ & ์—๋Ÿฌ ์ฐพ๊ธฐ ์ˆ˜์›”
    • output.clean: true :
      ์ƒˆ ๋ฒˆ๋“ค๋ง ์‹œ, ๊ธฐ์กด์— ์žˆ๋˜ ๋ฒˆ๋“ค ํŒŒ์ผ์„ ์ง€์šด๋‹ค.
    //webpack.config.js
    
    const path = require('path');
    const HtmlWebpackPlugin = require('html-webpack-plugin')
    
    module.exports = {
      target: ["web", "es5"],
      mode: "production",
      entry: './src/script.js',
      output: {
        path: path.resolve(__dirname, 'dist'), // './dist'์˜ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ๋ฆฌํ„ด
        filename: 'app.bundle.js',
        clean: true,
      },
      module: {
        rules: [
          {
            test: /\.css$/,
            use: ["style-loader", "css-loader"],
            exclude: /node_modules/,
          }
        ],
      },
      plugins: [new HtmlWebpackPlugin({
        template: path.resolve(__dirname, "src", "index.html")
      })]
    };

About

๐Ÿš€ ์›นํŒฉ(webpack) ์„ค์ • ๋ฐ ๋ฒˆ๋“ค๋ง ์—ฐ์Šตํ•ด๋ณด๊ธฐ


Languages

Language:JavaScript 52.4%Language:CSS 33.1%Language:HTML 14.5%