인프런 - 프론트엔드 개발환경의 이해와 실습-03

업데이트:

플러그인

로더가 각 파일을 처리하는 반면 플러그인은 번들된 결과물을 처리

  • 자바스크립트 난독화
  • 특정 텍스트 추출
// my-webpack-plugin
class MyWebpackPlugin {
    apply(compiler) {
        compiler.plugin('emit', (compilation, callback) => {
            const source = compilation.assets['main.js'].source(); // 번들링된 main.js 소스코드 가져오는 코드
            compilation.assets['main.js'].source = () => {
                const banner = [
                    '/**',
                    ' * 이것은 BannerPlugin이 처리한 결과입니다.',
                    ' * Build Date: 2020-01-01',
                    '*/'
                ].join('\n');
                return banner + '\n\n' + source; // 원본소스코드에 주석문 추가
            }

            callback();
        })
    }
}

module.exports = MyWebpackPlugin;
// webpack.config.js
const MyWebpackPlugin = require('./my-webpack-pluigin');

module.exports = {
    ...
    plugins: [
        new MyWebpackPlugin(),
    ]
}
$ npm run build
// dist/main.js

/**,
* 이것은 BannerPlugin이 처리한 결과입니다.,
* Build Date: 2020-01-01,
*/

...

자주사용하는 플러그인

  • BannerPlugin
  • DefinePlugin
  • HtmlWebpackPlugin
  • CleanWebpackPlugin
  • MiniCssExtraPlugin

BannerPlugin (webpack 기본제공 플러그인)

결과물에 빌드 정보나 커밋 버전같은걸 추가 할 수 있다.

// webpack.config.js
mobule.exports = {
    ....
    plugins: [
        new webpack.BannerPlugin({
            banner: '이것은 배너입니다.'
        })
    ]
}

$ npm run build
// dist/main.js
/* 이것은 배너입니다. */ <===== 추가됨

DefinePlugin (webpack 기본제공 플러그인)

같은소스를 두 환경에서 배포하기위해 환경의존적인 정보를 소스가 아닌곳에서 관리할 수 있도록 해주는 플러그인

// webpack.config.js
mobule.exports = {
    mode: 'development',
    ....
    plugins: [
        new webpack.DefinePlugin({
            TEST1: '1+1',
            TEST2: JSON.stringify('1+1'),
            'api.domain': JSON.stringify('http://dev.api.domain.com')
        })
    ]
}

// app.js
console.log(process.env.NODE_ENV) // "development"
console.log(process.env.TEST1) // "2"
console.log(process.env.TEST2) // "1+1"
console.log(api.domain) // http://dev.api.domain.com

HtmlWebpackPlugin

Html 파일을 후처리하는데 사용한다. 빌드 타임의 값을 넣거나 코드를 입력할 수 있다.

$ npm i -D html-webpack-plugin
// webpack.config.js
const HtmlWebpackPLugin = require('html-webpack-plugin')

mobule.exports = {
    mode: 'development',
    ....
    plugins: [
        new HtmlWebpackPLugin({
            template: './src/index.html',
            templateParameters: {
                env: process.env.NODE_ENV === 'development' ? '(개발용)' : '' // html 파일 내부에 변수로 추가하여 사용이 가능
            },
            minify: process.env.NODE_ENV === 'production' ? {
                collapseWhitespace: true, // 빈칸제거
                removeCpmments: true, // 주석제거
            } : false
        })
    ]
}

// 실행
$ NODE_ENV=development npm run build
<!-- dist/index.html -->
<script type="text/javascript" src="main.js"></script> <!-- <=== 자동으로 생성 -->

CleanWebpackPlugin

빌드 이전 결과물을 제거하는 플러그인. 빌드결과물은 아웃풋경로에 모이는데 과거 파일이 남아있을수있어 전체 제거후 다시 빌드한 결과물을 가질 수 있도록 하는 플러그인

$ npm i -D clean-webpack-plugin
// webpack.config.js
const { CleanWebpackPlugin } = require('clean-webpack-plugin') // default export 가 아니라 {} 로 감싸줘야함

mobule.exports = {
    mode: 'development',
    ....
    plugins: [
        new CleanWebpackPlugin()
    ]
}

MiniCssExtraPlugin

스타일시트가 많아지면서 하나의 자바스크립트 코드로 만드는것은 부담일 수 있다. 변들결과에서 스타일시트의 코드만 뽑아서 별도의 CSS 파일로 만들어 역할에 따라 분리하는게 좋다. 브라우저에서 큰 파일 하나보다는 작은파일 여러개를 동시에 다운받는게 더 낫기 떄문에 개발환경은 상관없어도 프로덕션환경에서는 분리해서 빌드되도록 하는것이 효과적이다. 이 플러그인은 CSS 를 별도로 뽑아내는 플러그인이다.

$ npm i -D mini-css-extract-plugin
// webpack.config.js
const MiniCssExtractPlugin = require('mini-css-extract-plugin') 

mobule.exports = {
    mode: 'development',
    ....
    module: {
        rules: [
            {
                test: /\.css$/,
                use: [
                    process.env.NODE_ENV === 'production'
                    ? MiniCssExtractPlugin.loader
                    : 'style-loader',
                    'css-loader'
                ]
            }
        ]
    }
    ...
    plugins: [
        process.env.NODE_ENV === 'production' 
        ? [new MiniCssExtractPlugin({ filename: '[name].css' })] 
        : [],
    ]
}

댓글남기기