3. Minification & Mangling

  • ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์ „์†ก๋˜๋Š” resource์–‘์ด ์ปค์ง€๋ฉด ์‚ฌ์šฉ์ž๋“ค์—๊ฒŒ ์ „๋‹ฌ๋˜๋Š” ์ปจํ…์ธ  ๋„์ฐฉ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง.

    ๊ทธ๋ž˜์„œ, ์ตœ์ข…์ ์œผ๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „๋‹ฌ๋˜๋Š” ๋ฆฌ์†Œ์Šค๋“ค์˜ ํ˜•ํƒœ๋Š” ๋ถˆํ•„์š”ํ•œ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•œ ์ตœ์ ํ™”๋œ ์ƒํƒœ๊ฐ€ ๋˜์–ด์•ผํ•˜๋Š”๋ฐ, ์†Œ์Šค์ฝ”๋“œ์™€ ๋ฆฌ์†Œ์Šค๋“ค์„ ์ตœ์ ํ™”ํ•  ๋•Œ ์–ด๋–ป๊ฒŒ ํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ธฐ.

  • ๋ชจ๋“œ๊ฐ’์ด production์ธ ๊ฒฝ์šฐ, ์†Œ์Šค์ฝ”๋“œ๊ฐ€ ์••์ถ•๋œ ์ƒํƒœ๋ฅผ ํ™•์ธํ–ˆ์—ˆ๋Š”๋ฐ mode๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ง์ ‘ ์ตœ์ ํ™”ํ•จ์œผ๋กœ์จ js๋ฟ๋งŒ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ์ž์›๋“ค๋„ ์–ด๋–ป๊ฒŒ ์ตœ์ ํ™” ์‹œํ‚ค๋Š”์ง€ ์•Œ์•„๋ณด์ž.

  • ์ฝ”๋“œ์˜ ํ˜•ํƒœ๋ฅผ ์••์ถ•

  • ์••์ถ•๊ณผ์ •์—์„œ ์ผ์–ด๋‚˜๋Š” ์ผ

    • Minification

      • ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋™์ž‘ํ•˜๋Š” ๊ณผ์ •์— ๊ด€์—ฌํ•˜์ง€ ์•Š๋Š” ์š”์†Œ ์ œ๊ฑฐ(์ฃผ์„, console.log,..) - ์šฉ๋Ÿ‰์ด ์ค„์–ด๋“ฌ

      • ํ‘œํ˜„์„ ๊ฐ„๊ฒฐํ™” (๋“ค์—ฌ์“ฐ๊ธฐ ๋˜๋Š” ๋„์–ด์“ฐ๊ธฐ ๊ณต๋ฐฑ์„ ์ตœ๋Œ€ํ•œ ์งง๊ฒŒ, ๋ถ„๊ธฐ๋ฌธ์„ ๋ธ”๋Ÿญํ˜•์‹ ๋Œ€์‹  ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋กœ ํ‘œํ˜„ ๋“ฑ)

    • Minification: ํ‘œํ˜„์˜ ๋‚œ๋…ํ™”(uglify)

      • ๋ณ€์ˆ˜, ํ•จ์ˆ˜ ํด๋ž˜์Šค ์ด๋ฆ„๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ํ‘œํ˜„์„ ์•ŒํŒŒ๋ฒณ ํ•œ๋‘๊ธ€์ž๋กœ ์น˜ํ™˜.

      • ์™ธ๋ถ€์—์„œ ์ฝ”๋“œ๋ฅผ ๋ดค์„๋•Œ ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ฌ, ์šฉ๋Ÿ‰์ค„์ž„

  • ์œ„์™€๊ฐ™์€ ๊ณผ์ •์„ ๊ฑฐ์น˜๋ฉด, ์†Œ์Šค์ฝ”๋“œ๊ฐ€ ์••์ถ•๋œ ํ˜•ํƒœ๋กœ ๋‚˜์˜ค๊ฒŒ ๋˜๋Š”๋ฐ ๋„คํŠธ์›Œํฌ์— ์ด ์ตœ์ ํ™”๋œ ๋ฆฌ์†Œ์Šค๊ฐ€ ์ „๋‹ฌ์ด ๋˜๊ณ  ์ตœ์ ํ™”๋œ ๋ฆฌ์†Œ์Šค๋“ค์ด ์บ์‹ฑ์œผ๋กœ ์ €์žฅ๋˜๋ฉด ์‚ฌ์šฉ์ž๋“ค์ด App์„ ์‚ฌ์šฉํ•  ๋•Œ ๋” ๋น ๋ฅด๊ฒŒ ๋™์ž‘์‹œํ‚ฌ ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

  • ์‹ค์Šต

    • HTML Markup ์ตœ์ ํ™”

      • html-webpack-plugin์„ค์ •์—์„œ ์ œ๊ณต๋˜๋Š” key์ค‘ minify์ด๋ผ๋Š” key๊ฐ€ ์ œ๊ณต๋จ.

      • mark up ์ด ์ƒ์„ฑ๋ ๋•Œ mark up ์ปจํ…์ธ ๊ฐ€ ์ตœ์ ํ™”๋˜๋Š” ๊ณผ์ •์„ ํ•จ๊ป˜ ์ง„ํ–‰ํ•จ

      • ๊ฐ์ฒดํ˜•ํƒœ๋กœ ์ง€์ •ํ•ด์„œ ์„ ํƒ์ ์œผ๋กœ (์ผ๋ถ€๋งŒ) ์ตœ์ ํ™”๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

      • html-webpack-plugin readme.md ๋ฌธ์„œ ํ™•์ธ. (minify๊ฒ€์ƒ‰ ์ƒ์„ธ ๋งํฌ ํด๋ฆญ)

      • ์‹ค์Šต์—์„œ๋Š” ๊ณต๋ฐฑ์„ ์ค„์ด๋Š”๊ฒƒ, doctype์„ ์งง๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ, type attribute ์ œ๊ฑฐ ์‚ฌ์šฉ

      • plugin ์— minify key์™€ ์˜ต์…˜ ์ถ”๊ฐ€

        minify:{
                  collapseWhitespace: true,
                  useShortDoctype: true,
                  removeScriptTypeAttributes: true, //script์— type attribute ์ œ๊ฑฐ
              },
      • ๋นŒ๋“œ ํ›„, ๊ฒฐ๊ณผํ™•์ธ

    • CSS ์ตœ์ ํ™”

      • cssํŒŒ์ผํฌ๊ธฐ ์••์ถ•(css-nano compressor)

      • ์Šคํƒ€์ผ์„ ๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ ์ œ๊ณต

      • css-nano๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด css๋ฅผ ์ตœ์†Œํ™” ํ•œ ๊ฒฐ๊ณผ๋ฌผ์„ ์–ป์„ ์ˆ˜ ์žˆ๊ณ , ์••์ถ•๋ฅ  ์ •๋ณด๋„ ํ™•์ธ์ด ๊ฐ€๋Šฅ

      • css-nano module์„ค์น˜ํ•˜๊ธฐ

        npm i -D cssnano
      • optimize-css-assets-webpack-plugin ์„ค์น˜

        npm i -D optimize-css-assets-webpack-plugin
      • webpack plugins ์„ค์ •

        plugins: [
          new OptimizeCssAssetsPlugin({
            assetNameRegExp: /\.css$/g,
            cssProcessor: require('cssnano'),
            cssProcessorPluginOptions: {
              preset: ['default', { discardComments: { removeAll: true } }],
            },
            canPrint: true,
          }),
        ];
      • plugin์€ ์™ธ๋ถ€ ๋ชจ๋“ˆ์ด๋ฏ€๋กœ ๋ถˆ๋Ÿฌ์™€์•ผํ•จ

        const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin');
      • build๊ฒฐ๊ณผ (dist/~~.cssํ™•์ธํ•ด๋ณด๊ธฐ) => ์••์ถ• ์ž˜ ๋˜์—ˆ๋‹ค!

    • JS์ตœ์ ํ™”

      • css์ฒ˜๋Ÿผ js compressor ์‚ฌ์šฉ

      • ๋Œ€ํ‘œ

        • uglify.js

        • babel-minify

        • terser

      • ์›นํŒฉ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฑ„ํƒํ•˜๋Š” terser ์‚ฌ์šฉํ•ด๋ณผ ๊ฒƒ

      • ์›นํŒฉ์˜ ์˜์กด์„ฑ์— ํฌํ•จ๋œ ๋ชจ๋“ˆ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„๋กœ terser๋ฅผ ์„ค์น˜ํ•  ํ•„์š”๋Š” ์—†๊ณ , optimizationํ‚ค์— ์ž‘์„ฑ ํ•ด์ฃผ๋ฉด๋œ๋‹ค.

        • optimization ๋‚ด๋ถ€์— minimize๋ผ๋Š” ํ‚ค๋ฅผ true๋ฅผ ํ•˜๋ฉด, ์›นํŒฉ ๋‚ด๋ถ€์—์„œ terser๋ฅผ ์‹คํ–‰์‹œ์ผœ ์••์ถ• ์ง„ํ–‰.

        • minimizer ํ‚ค์—์„œ ์–ด๋–ค compressor๋ฅผ ์‚ฌ์šฉํ• ์ง€ ๋ณ„๋„๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Œ.(uglify, babel-mini)

        • terser๋ฅผ ์ž‘์„ฑํ•œ ์ด์œ ?: terser customizeํ•˜๊ธฐ ์œ„ํ•ด์„œ

        • minimize๋งŒ true๋กœ ํ•ด๋‘๋ฉด ๊ธฐ๋ณธ๋™์ž‘๋งŒ ํ•˜๊ธฐ ๋•Œ๋ฌธ.

          • ๋น ๋ฅด๊ฒŒ cache๋˜๋„๋ก ์„ค์ •ํ•จ(๋นŒ๋“œ ๋˜๋Š” ์‹œ๊ฐ„ ์ค„์ž„)

      • ํ˜น์‹œ terserํ™•์ธํ•˜๊ณ  ์‹ถ์œผ๋ฉด, node_modulesํ™•์ธ! (webpack์„ค์น˜ํ• ๋•Œ ๊ฐ™์ด ์„ค์น˜๋˜์—ˆ์Œ)

      • terser-webpack-plugin ์„ค์น˜(์™ธ๋ถ€ ํ”Œ๋Ÿฌ๊ทธ์ธ)

         npm i terser-webpack-plugin -D
      • webpack.config.js ์ˆ˜์ •

        modules.exports = {
          optimizations: {
            minimize: true,
            minimizer: [
              new TesrserWebpackPlugin({
                cache: true,
              }),
            ],
          },
        };

Last updated