Bundler/Webpack

Webpack

IT Blue 2021. 7. 5. 05:36

 

프로젝트 설치

 

$ npm init -y
$ npm i -D webpack webpack-cli webpack-dev-server@next

설치가 완료되면
package.json 내부에 생성됨
"devDependencies": {
    "webpack": 설치된 버전이 명시,
    "webpack-cli": 설치된 버전이 명시,
    "webpack-dev-server": 설치된 버전이 명시  
}

 

프로젝트 실행

 

## 세팅 ##
package.json 내부에 "scripts" 수정

"scripts": {
    "dev": "webpack-dev-server --mode development",
    "build": "webpack --mode production"
}

## 구성 설정 ##
프로젝트 루트 경로에 webpack.config.js 파일 생성

 

/* webpack.config.js */

const path = require('path')

module.exports = {
  // webpack은 js를 진입점으로 사용
  // 파일을 읽어들이기 시작하는 진입점 설정
  entry: './js/main.js',

  // 결과물(번들)을 반환하는 설정
  output: {
    // 어떠한 경로에다가 결과물을 만들어서 내어줄지 명시 (절대경로)
    // 기본값
    // path: path.resolve(__dirname, 'dist'),
    
    // 결과물의 파일의 이름
    // 기본값
    // filename: 'main.js',
    
    // 기존의 만들었던 내용 제거
    clean: true
  }
}

 

Plugins

 

## HTML 연동을 위해 설치 ##
$ npm i -D html-webpack-plugin

webpack.config.js 파일에 내용 추가

 

/* webpack.config.js */

const path = require('path')

// 추가된 부분
const HtmlPlungin = require('html-webpack-plugin');

module.exports = {
  entry: './js/main.js',
  output: {
    clean: true
  },

 // 추가된 부분
 // 번들링 후 결과물의 처리 방식 등 다양한 플러그인들을 설정
  plugins: [
    new HtmlPlungin({
      template: './index.html'
    })
  ]
}

 

정적 파일 연결

 

dist 폴더로 자동으로 넣어줄 수 있는 패키지를 설치한다

 

## 패키지 설치 ##
$ npm i -D copy-webpack-plugin

webpack.config.js 파일에 내용 추가

 

/* webpack.config.js */

const CopyPlugin = require('copy-webpack-plugin');

module.exports = {
   plugins: [
    new CopyPlugin({
      patterns: [
        // 만들어놓은 폴더의 이름을 명시
        { from: 'static'}
      ]
    })
  ]
}

 

Module (CSS, SCSS 연결)

 

# Loader #
# 자바스크립트 파일이 아닌 웹 자원(HTML, CSS, Images, 폰트 등)들을 변환할 수 있도록 도와주는 속성 #
$ npm i -D css-loader style-loader
$ npm i -D sass-loader sass

package.json 내부에 내용 추가
"browserslist": [
    "> 1%",
    "last 2 versions"  
]

webpack.config.js 파일에 내용 추가

 

/* webpack.config.js */

module: {
    rules: [
      {
        test: /\.s?css$/,
        use: [
          'style-loader',
          'css-loader',
          'sass-loader'
        ]
      }
    ]
  }

 

/* main.js */

// import '../css/main.css'
import '../scss/main.scss'

 

Autoprefixer

 

# CSS 속성의 공급 업체 접두사 (Vender Prefix) 를 사용자의 브라우저에 따라 자동으로 붙여주는 플러그인 #
$ npm i -D postcss autoprefixer postcss-loader

webpack.config.js 파일에 내용 추가
.postcssrc.js 파일 생성 후 내용 추가

 

/* webpack.config.js */

module: {
    rules: [
      {
        test: /\.s?css$/,
        use: [
          'style-loader',
          'css-loader',
          // 추가된 부분
          'postcss-loader',
          'sass-loader'
        ]
      }
    ]
  },

 

/* .postcssrc */
// ESM - (improt, export 키워드를 사용하는 방식)
// node.js 에서는 CommonJS 방식을 사용

// import 대신 require() 방식으로 js파일을 외부에서 가져옴
// export 대신 module.exports 방식으로 내용들을 내보내기 

module.exports = {
  plugins: [
    require('autoprefixer')
  ]
}

 

Babel

 

## 패키지 설치 ##
$ npm i -D @babel/core @babel/preset-env @babel/plugin-transform-runtime
$ npm i -D babel-loader

webpack.config.js 파일에 내용 추가
.babelrc.js 파일 생성 후 내용 추가

 

/* webpack.config.js */
module: {
    rules: [      
      {
        test: /\.js$/,
        use: [
          'babel-loader'
        ]
      }
    ]
  },

 

/* .babelrc.js */
module.exports = {
  presets: ['@babel/preset-env'],
  plugins: [
    ['@babel/plugin-transform-runtime']
  ]
}

 


참고

https://webpack.js.org/concepts/

 

Concepts | webpack

webpack is a module bundler. Its main purpose is to bundle JavaScript files for usage in a browser, yet it is also capable of transforming, bundling, or packaging just about any resource or asset.

webpack.js.org