210907 ๊ฐœ๋ฐœ๊ธฐ๋ก: webpack ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ณต๋ถ€์ค‘

2021. 9. 8. 00:30ใ†๐Ÿ“” TIL

  • ํšŒ์‚ฌ ํ”„๋กœ์ ํŠธ ๊ฐœ๋ฐœํ™˜๊ฒฝ ์„ธํŒ…ํ•˜๋ผ๋Š” ๋ง์— ํ˜ธ๋‹ค๋‹ฅ ์ธํ”„๋Ÿฐ์—์„œ ์›นํŒฉ ๊ฐ•์˜๋ฅผ ๊ตฌ๋งคํ–ˆ๋‹ค.
  • ๊ทธ์ „๊นŒ์ง€๋Š” ๊ฐœ๋ฐœํ™˜๊ฒฝ, webpack ๊ฐ™์€ ๋ง์ด ๋‚ฏ์„ค๊ณ  ๋‚˜๋ž‘์€ ๊ฑฐ๋ฆฌ๊ฐ€ ๋จผ ๊ฐœ๋…์ด๋ผ ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, ๊ณต๋ถ€ํ•˜๋ฉด ํ•  ์ˆ˜๋ก ๋” ๋ฐฐ์›Œ์•ผ ํ•œ๋‹ค๊ณ  ๋Š๊ผˆ๋‹ค.

๋กœ๋”์™€ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ์ฐจ์ด

  • ๋กœ๋”๊ฐ€ ํŒŒ์ผ ๋‹จ์œ„๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ˜๋ฉด,
  • ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๋ฒˆ๋“ค๋œ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๋ฌผ์„ ๋Œ€์ƒ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  • ์˜ˆ์ œ์—์„œ ์ƒ์„ฑ๋œ ๊ฒฐ๊ณผ๋ฌผ์ด main.js ํ•˜๋‚˜์ด๊ธฐ ๋•Œ๋ฌธ์— ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํ•œ ๋ฒˆ๋งŒ ๋™์ž‘ํ•œ ๊ฒƒ์ด๋ผ ์ถ”์ธกํ•  ์ˆ˜ ์žˆ๋‹ค.

์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ

bannerPlugin

  • main.js ์˜ ์ตœ์ƒ๋‹จ์— ์ถœ๋ ฅ๋  ๋‚ด์šฉ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค(like banner)
const childProcess = require('child_process'); // git ๋ช…๋ น์–ด๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.

plugins: [
    new webpack.BannerPlugin({
        // banner: "์ด๊ฒƒ์€ ๋ฐฐ๋„ˆ์ž…๋‹ˆ๋‹ค."  // ์ด ๋‚ด์šฉ์ด main.js ์˜ ์ตœ์ƒ๋‹จ์— ์ถœ๋ ฅ๋œ๋‹ค.
        // git ๋ช…๋ น์–ด๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋”ฐ.(execSync())
        banner: `
            Build Date: ${new Date().toLocaleString()}
            Commit Version: ${childProcess.execSync('git rev-parse --short HEAD')}
            Author :  ${childProcess.execSync('git config user.name')}
            `
    }),
]

definePlugin

  • ๊ฐœ๋ฐœํ™˜๊ฒฝ๊ณผ ์šด์˜ํ™˜๊ฒฝ์„ ๋‚˜๋ˆ„์–ด ๊ฐœ๋ฐœํ•  ๋•Œ, ํ™˜๊ฒฝ์— ๋”ฐ๋ผ api ์ฃผ์†Œ๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

  • ์ด๋Ÿฐ ๊ฒฝ์šฐ์—” ๋ฐฐํฌํ•  ๋•Œ๋งˆ๋‹ค ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ํœด๋จผ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

  • api ์ฃผ์†Œ์ฒ˜๋Ÿผ ํ™˜๊ฒฝ ์˜์กด์  ์ •๋ณด๋Š” ์†Œ์Šค์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๊ณณ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

  • ๋นŒ๋“œ ํƒ€์ž„์— ๊ฒฐ์ •๋˜๋Š” ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‹จ์— ์ฃผ์ž…ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

  • ๋นŒ๋“œ ํƒ€์ž„์— ๊ฒฐ์ •๋œ ๊ฐ’์„ ์–ดํ”Œ๋ฆฌ์ด์…˜์— ์ „๋‹ฌํ•  ๋•Œ๋Š” ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์ž.

plugins:[
    ...
        new webpack.DefinePlugin({
            // TWO: '1+1' // number ์ถœ๋ ฅ
            TWO: JSON.stringify('1+1'), // ๋ฌธ์ž์—ด ์ถœ๋ ฅ
            'api.domain': JSON.stringify('http://dev.api.domain.com') // ๊ฐ์ฒด์ฒ˜๋Ÿผ ๋งŒ๋“ค์–ด ์ถœ๋ ฅ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.
        })
]

HtmlWebpackPlugin (third-party plugin)

  • HTML ํŒŒ์ผ์„ ํ›„์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค. ๋นŒ๋“œ ํƒ€์ž„์˜ ๊ฐ’์„ ๋„ฃ๊ฑฐ๋‚˜ ์ฝ”๋“œ๋ฅผ ์••์ถ•ํ• ์ˆ˜ ์žˆ๋‹ค.
  • index.html ์˜ ํƒ€์ดํ‹€ ๋ถ€๋ถ„์— ejs ๋ฌธ๋ฒ•์„ ์ด์šฉํ•˜๋Š”๋ฐ <%= env %> ๋Š” ์ „๋‹ฌ๋ฐ›์€ env ๋ณ€์ˆ˜ ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.
plugins:[
    ...
        new HtmlWebpackPlugin({
            template: "./src/index.html",
            templateParameters: {
                env: process.env.NODE_ENV === "development" ? "(๊ฐœ๋ฐœ์šฉ)" : "(์šด์˜)"
            },
            // ๊ฐœ๋ฐœํ™˜๊ฒฝ์—์„  ์ž‘๋™ํ•˜์ง€ ์•Š๋„๋ก ์‚ผํ•ญ ์—ฐ์‚ฐ ๊ฑธ์–ด๋‘”๋‹ค.
            minify: process.env.NODE_ENV === "production" ? {
                collapseWhitespace: true,
                // ๊ณต๋ฐฑ ์ œ๊ฑฐ => dist/index.html์ด ๊ณต๋ฐฑ ์ œ๊ฑฐ๋˜๊ธฐ์— ํ•œ์ค„๋กœ ์ •๋ฆฌ๋˜๋ฒ„๋ฆฐ๋‹ค. 
                // => ์ด๋Ÿฐ๊ฑด ์šด์˜์—์„œ๋งŒ ์„ค์ •ํ•ด์ฃผ๋ฉด ์ข‹๋‹ค. (๊ฐœ๋ฐœ๊ธฐ์—์„  ํ•œ์ค„๋กœ ๋ผ์žˆ์œผ๋ฉด ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์–ด๋ ค์šฐ๋‹ˆ)
                removeComments: true // ์ฃผ์„ ์ œ๊ฑฐ
            } : false
        })
]

CleanWebpackPlugin (third-party plugin)

  • ๋นŒ๋“œ์ „, ์ด์ „ ๊ฒฐ๊ณผ๋ฌผ(๋Œ€์ฒด๋กœ dist ํด๋”)์„ ์‚ญ์ œํ•˜๊ณ , ๋‹ค์‹œ ๋นŒ๋“œ ํด๋”๋ฅผ ์ƒ์„ฑํ•ด์ค€๋‹ค(๋นŒ๋“œ ํด๋”์˜ ๊ฐฑ์‹ )
plugins:[
        ...
        new CleanWebpackPlugin(),
]

minicssExtractPlugin (third-party plugin)

  • ๋ธŒ๋ผ์šฐ์ €์—์„œ ํฐ ํŒŒ์ผ ํ•˜๋‚˜๋ฅผ ๋กœ๋”ฉํ•˜๋Š” ๊ฒƒ์€ ๋ถ€๋‹ด์Šค๋Ÿฝ๋‹ค.

  • ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ž‘์€ ํŒŒ์ผ์„ ๋™์‹œ์— ๋‹ค์šด๋กœ๋“œ ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋น ๋ฅด๋‹ค(=> css ํŒŒ์ผ์„ ์—ฌ๋Ÿฌ๊ฐœ ๋งŒ๋“ค์–ด ์—ญํ•  ์— ๋”ฐ๋ผ ๋ถ„๋ฆฌ)

  • javascript ์—์„œ css ๋ฅผ ๋ฝ‘์•„๋‚ด๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐœ๋ฐœํ™˜๊ฒฝ์—์„  ๊ตณ์ด ์‚ฌ์šฉํ•  ํ•„์š”์—†๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ.

  • ๊ฐœ๋ฐœํ™˜๊ฒฝ์—์„  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ ํ•˜๋‚˜๋กœ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ์ด ๋” ๋น ๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  • ์ •๋ฆฌํ•˜์ž๋ฉด, ์Šคํƒ€์ผ์‹œํŠธ๋Š” ๋นŒ๋“œ๊ณผ์ •์—์„œ javascript ํŒŒ์ผ๋กœ ์ปดํŒŒ์ผ๋˜๋Š”๋ฐ,
    ์Šคํƒ€์ผ์‹œํŠธ๊ฐ€ ๋งŽ์•„์ง€๋ฉด ํ•˜๋‚˜์˜ javascript ํŒŒ์ผ์˜ ํฌ๊ธฐ๊ฐ€ ๋น„๋Œ€ํ•ด์ง„๋‹ค.

  • ์ด๋Ÿฐ ์ƒํ™ฉ์„ ๋ฉดํ•˜๊ณ ์ž, ๋ฒˆ๋“ค ๊ฒฐ๊ณผ์—์„œ ์Šคํƒ€์ผ์‹œํŠธ ์ฝ”๋“œ๋งŒ ๋ฝ‘์•„ ๋ณ„๋„์˜ css ํŒŒ์ผ๋กœ ๋งŒ๋“ค์–ด ์—ญํ• ์— ๋”ฐ๋ผ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ.

plugins:[
    ...(process.env.NODE_ENV === 'production'
        ? [new MiniCssExtractPlugin({filename: '[name].css'})]
        : [])
]

์ •๋ฆฌ

์—”ํŠธ๋ฆฌํฌ์ธํŠธ๋ฅผ ์‹œ์ž‘์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์—ˆ๋Š” ๋ชจ๋“  ๋ชจ๋“ˆ์„ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์„œ ๊ฒฐ๊ณผ๋ฌผ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์›นํŒฉ์˜ ์—ญํ• ์ด๋‹ค.
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ชจ๋“ˆ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์Šคํƒ€์ผ์‹œํŠธ, ์ด๋ฏธ์ง€ ํŒŒ์ผ๊นŒ์ง€๋„ ๋ชจ๋“ˆ๋กœ ์ œ๊ณตํ•ด ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ผ๊ด€์ ์œผ๋กœ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค.