기타

[WEBPACK] babel 을 웹팩으로 통합

보겸삼촌 2020. 2. 25. 00:31

실무환경에서는 바벨을 직접 사용하기보다 웹팩으로 통합해서 사용하는 것이 일반적

따라서, 로더(loader) 형태로 제공함

 

 

1. babel loader 설치

  [terminal] npm install babel-loader -D

 

2. webpack 설정 수정

  2.1. babel loader 추가

           {

                test: /\.js$/,

                exclude: /node_modules/,

                loader: 'babel-loader',

            }

/**
 * /root/webpack.config.js
 */

const path = require('path');
const CustomPlugin = require('./customplugin');
const webpack = require('webpack');
const banner = require('./banner.js')
const HtmlWebpackPlugin = require('html-webpack-plugin');
const {CleanWebpackPlugin} = require('clean-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');

module.exports = {
    mode: 'development',
    entry: {
        main: './src/app.js'
    },
    output: {
        filename: '[name].js',
        path: path.resolve('./dist'),
    },
    module: {
        rules: [
            { 
                test: /\.(scss|css)$/, 
                use: [
                    process.env.NODE_ENV === 'production'
                    ? MiniCssExtractPlugin.loader  //배포 환경
                    : 'style-loader', 'css-loader'  //개발 환경
                ]
            },
            { 
                test: /\.(jpg|png|gif|svg)$/, 
                loader: 'url-loader', 
                options:{
                    publicPath: './dist/',          //prefix를 output 경로로 지정
                    name: '[name].[ext]?[hash]',    //파일명 형식
                    //publicPath: file-loader가 처리하는 파일을 모듈로 사용할 때, 경로 앞에 추가되는 문자열
                    //name: loader가 파일을 output에 복사할 때 사용하는 파일 이름
                    limit:10000  //10kb 미만 파일만 data url로 처리
                }
            },
            {
                test: /\.js$/,
                exclude: /node_modules/,
                loader: 'babel-loader',
            }
        ]
    },
    plugins: [
        /**
         * 1. BannerPlugin()
         */
        // new CustomPlugin(),
        // new webpack.BannerPlugin({
        //     // 생성자 함수에 전달하는 옵션 객체의 banner 속성에 문자열을 전달
        //     // banner: '배너 내용입니다. 빌드 정보나 커밋버전 등을 추가할 수 있습니다.',
        // }),

        /** 배너 정보가 많으면 별도 파일로 분리해도 좋음.
             *  1. banner.js 파일을 생성해서 배너 정보를 담음
             *  2. 설정파일 상단에 const banner = require('./banner.js); 선언
             *  3. plugins 속성에 new webpack.BannerPlugin(banner);
             */
        new webpack.BannerPlugin(banner),

        /**
         * 2. DefinePlugin()
         * 
         * //노드 환경정보인 process.env.NODE_ENV는 기본적으로 있는 설정값
         */
        new webpack.DefinePlugin({
            VERSION: JSON.stringify('v.1.2.3'),
            MAX_COUNT: JSON.stringify(999),
            'api.domain': JSON.stringify('http://127.0.0.1'),
        }),

        /**
         * 3. Html-Webpack-Plugin
         */
        new HtmlWebpackPlugin({
            template: './src/index.html',   //템플릿 경로 지정
            templateParameters:{
                //템플릿에 주입할 파라미터 변수 지정
                env: process.env.NODE_ENV === 'development' ? '(개발용)' : '',
                //NODE_ENV=development이면 타이틀(개발용)
                //NODE_ENV=production이면 타이틀로 출력 됨
            },
            //운영환경에서는 파일을 압축하고 불필요한 주석 제거 필요
            minify: process.env.NODE_ENV === 'production' ? {
                collapseWhitespace: true,       //빈칸 제거
                removeComments: true,           //주석 제거
            }: false,
            //정적 파일을 불러올 때 쿼리문자열에 webpack 해시 값을 추가
            // hash: true,
        }),

        /**
         * 4. CleanWebpackPlugin()
         * 
         *  ./dist에서 불필요한 것들을 제거하고 다시 build ehlehfhr gka
         */
        new CleanWebpackPlugin(),

        /**
         * 5. MiniCssContractPlugin()
         * 
         * 보통 개발환경에서는 사용하지 않고, 운영환경에서 사용함
         */
            //filename에 설정한 값으로 output 경로에 css 파일이 생성될 것
        ...(
            process.env.NODE_ENV === 'production'
            ? [ new MiniCssExtractPlugin({filename: `[name].css`})]
            : []
        ),

        // TODO: HtmlTemplatePlugin : 동적으로 html 파일을 생성하라
        // TODO: BannerPlugin: 결과물에 빌드 시간을 출력
    ]
}

 

  2.2. babel.config.js 생성

// /root/babel.config.js 

module.exports = {
    presets: [
    [
        '@babel/preset-env',
        {
            targets: {
                chrome: '79', // 크롬 79까지 지원하는 코드를 만든다
                ie: '8',
            },
            useBuiltIns: 'usage',
            corejs: {           //폴리필 버전 지정
                version: 2
            }
        }
    ]
]
}

  

  2.3. corejs version 2 설치

    [terminal] npm install core-js@2 -D

 

 

  2.4. 실행

     [terminal] npm run build

 

'기타' 카테고리의 다른 글

Insert sample img, 샘플 이미지 삽입  (0) 2020.05.29
[BABEL] 개념과 등장배경  (0) 2020.02.25
[PHP] php Artisan 명령어  (0) 2020.02.24
[WEBPACK] 플러그인(Plugin)  (0) 2020.02.24
[WEBPACK] 로더의 종류, 적용 순서  (0) 2020.02.24