Webpack

개념

모던 자바스크립트 어플리케이션을 위한 스태틱 모듈 번들러 (static module bundler for modern JavaScript applications) 프로젝트에서 필요한 모든 모듈을 의존성 그래프를 만들어 매핑 -> 하나, 혹은 그 이상의 번들 생성

핵심 개념

엔트리 Entry

  • 의존성 그래프의 시작점을 웹팩에서는 엔트리(entry)라고 한다.
module.exports = {
  entry: {
    main: './src/main.js',
  }
}

아웃풋 Output

  • 엔트리에 설정한 자바스크립트 파일을 시작으로 의존되어 있는 모든 모듈을 하나로 묶을 것이다. 번들된 결과물을 처리할 위치는 output에 기록한다.
module.exports = {
  output: {
    filename: 'bundle.js',
    path: './dist'
  }
}

<body>
  <script src="./dist/bundle.js"></script>
</body>

로더 Loaders

  • 자바스크립트 파일 뿐만 아니라 이미지, 폰트, 스타일시트도 전부 모듈로 관리한다. 그러나 웹팩은 자바스크립트 밖에 모른다. 비 자바스크립트 파일을 웹팩이 이해하게끔 변경해야하는데 로더가 그런 역할을 한다
test에 로딩할 파일을 지정하고
use에 적용할 로더를 설정한다

ES6 -> ES5
module.exports = {
  module: {
    rules: [{
      test: /\.js$/,
      exclude: 'node_modules',
      use: {
        loader: 'babel-loader',
        options: {
          presets: ['env']
        }
      }
    }]
  }
}

플러그인 Plugins

  • UglifyJsPlugin
자바스크립트 결과물을 난독화 처리
module.exports = {
  plugins: [
    new webpack.optimize.UglifyJsPlugin(),
  ]
}

  • ExtractTextPlugin
텍스트 추출
module.exports = {
  module: {
    rules: [{
      test: /\.scss$/,
      use: ['style-loader', 'css-loader', 'sass-loader']
    }]
  }
};

주요 CLI 및 기능

  • npm i -g webpack-cli
  • webpack app/index.js –output dist/bundle.js –mode development

webpack.config.js

  • webpack
module.exports = {
  module: {
    rules: [{
      test: /\.js$/,
      exclude: 'node_modules',
      use: {
        loader: 'babel-loader',
        options: {
          presets: ['env']
        }
      }
    }]
  }
}

npm i --save-dev babel-loader babel-core babel-preset-env
  • css-loader, style-loader
module.exports = {
  module: {
    rules: [{
      test: /\.css$/,
      use: ['style-loader', 'css-loader']
    }]
  }
};

bundel.js

-

Babel

개념

Babel은 ECMAScript 2015+ 코드를 이전 JavaScript 엔진에서 실행할 수있는 이전 버전과 호환되는 JavaScript 버전으로 변환하는 데 주로 사용되는 무료 오픈 소스 JavaScript 컴파일러입니다.

Babel @babel/cli : 7.7.0 @babel/core : 7.7.2 @babel/preset-env : 7.7.1 @babel/plugin-proposal-class-properties : 7.7.0 @babel/polyfill : 7.7.4