Home webpack
Post
Cancel

webpack

webpack

  • 구체적인 설정이 필요
  • 대형 프로젝트에 적합

설치와 설정

1
2
3
npm init -y
npm i -D webpack webpack-cli webpack-dev-server@next
# @next를 붙이는간 cli와 버전을 맞추기위함
  • npm run 으로 실행할 개발서버 및 빌드 명령 설정
1
2
3
4
  "scripts": {
    "dev": "webpack-dev-server --mode development",
    "build": "webpack --mode production"
  },
  • webpack.config.js 생성

공식 문서에 더 많은 옵션 설명이 있다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// import
const path = require('path')
// 전역 모듈 'path'

module.exports = {
  // parcel index.html 처럼
  // 파일을 읽어들이기 시작하는 진입점 설정

  // 웹팩은 js 파일을 진입점으로 한다
  entry: './js/main.js',

  // 결과물(번들)을 반환하는 설정
  output: {
    // 절대 경로
    // 첫번째 인수와 두번째 인수를 합쳐줌 경로+경로
    // __dirname은 현재 webpack config파일의 경로
    path: path.resolve(__dirname, 'dist'),
    filename: 'main.js',
    
    // path와 filename 을 주석처리해도 된다 
    // defalut값이 (dist, main.js)

    // 빌드 실행시 기존 파일 지우고 생성
    clean: true
  },
}

플러그인

main.js를 index.html 이랑 연결해서 개발 서버를 여는 방법

1
npm i -D html-webpack-plugin
  • webpack.config.js 설정
1
2
3
4
5
6
7
8
9
10
11
12
const HtmlPlugin = require('html-webpack-plugin')
  // 번들링 후 결과물의 처리 방식 등 다양한 플러그인을 설정
  plugins: [ // main.js 와 html이 연결됨
    new HtmlPlugin({
      template: './index.html'
    }),
  ],

  // 서버 실행시 주소가 이상하게 나오지 않게 로컬호스트 지정
  devServer: {
    host:'localhost'
  }
  • 빌드 설정

static 내부에 favicon , images폴더 가 들어있는 구조

1
npm i -D copy-webpack-plugin
1
2
3
4
5
6
7
8
9
const CopyPlugin = require('copy-webpack-plugin')
  // 번들링 후 결과물의 처리 방식 등 다양한 플러그인을 설정
  plugins: [
    new CopyPlugin({
      patterns: [ // static이 dist에 copy됨
        { from: 'static' }
      ]
    })
  ],

스타일 시트 가져오기

  • html이 아닌 js로 연결해놓고
  • js와 html을 연결해서 가져온다

  • js는 단순히 css를 가져오기만 한다
1
import '../css/main.css'
  • 읽을수 있게 하려면
1
npm i -D css-loader style-loader
  • webpack.config.js도 설정 해준다
1
2
3
4
5
6
7
8
9
10
11
12
13
// css 읽어오기
  module: {
    rules: [
      {
        // .css로 끝나는 모든 것
        test: /\.css$/,
        use: [
          'style-loader', // 해석된 부분을 삽입해서 사용
          'css-loader',// 먼저 로드됨 js에서 css를 해석하는 용도
        ]
      }
    ]
  },
  • scss로 변경해보기
1
import '../scss/main.scss'
1
2
# scss가져오고 읽으려면
npm i -D sass-loader sass
  • webpack.config.js도 설정 해준다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
module: {
    rules: [
      {
        // .css로 끝나는 모든 것 + ? 니까 scss 도 가능
        test: /\.s?css$/,
        use: [
          'style-loader', // 해석된 부분을 삽입해서 사용
          'css-loader',// 먼저 로드됨 js에서 css를 해석하는 용도
          'sass-loader' // css로드가 로드되기전에 먼저 로드되야됨 (먼저 동작해야됨)
        ]
      },
    ]
  },

autoprefixer

postcss 후처리기에서autoprefixer사용

  • 웹팩의 로더를 사용
1
npm i -D postcss autoprefixer postcss-loader
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
module: {
    rules: [
      {
        // .css로 끝나는 모든 것 + ? 니까 scss 도 가능
        test: /\.s?css$/,
        use: [
          'style-loader', // 해석된 부분을 삽입해서 사용
          'css-loader',// 먼저 로드됨 js에서 css를 해석하는 용도
          // postcss-loader 적용시에는 packagejson에 browserslist 명시가 필요
          // .postcssrc도 작성
          'postcss-loader',// 순서 중요 scss에 공급업체 접두사 붙임 
          'sass-loader' // css로드가 로드되기전에 먼저 로드되야됨 sass 해석 (먼저 동작해야됨)
        ]
      },
    ]
  },

  • postcss-loader 적용 후 브라우저 설정
1
2
3
4
"browserslist": [
    "> 1%",
    "last 2 versions"
  ]
  • .postcssrc.js 생성
1
2
3
4
5
module.exports = {
  Plugins: [
    require('autoprefixer')
  ]
}

babel

1
npm i -D @babel/core @babel/preset-env @babel/plugin-transform-runtime
  • .babelrc.js 생성
1
2
3
4
5
6
module.exports = {
  presets: ['@babel/preset-env'], // 일일이 명시해야되는 자바스크립트의 기능을 한번에 프리셋
  plugins: [
    ['@babel/plugin-transform-runtime']
  ] //비동기처리를 위해 사용
}
  • 바벨 패키지설치해서 바벨이 동작할수있게 되었는데
    그걸 해석하기 위한 매개체
1
npm i -D babel-loader
  • webpack.config.js 설정
1
2
3
4
5
6
{
    test: /\.js$/,
    use: [
      'babel-loader'
    ]
}

Netlify

  • 설정이 자신이 설정한 구조와 같아야함
1
2
3
4
5
빌드 커맨드
npm run bulid

퍼블리쉬 디렉토리
dist/

npx degit

1
npx degit iamidlek/레포이름 다운받을폴더명
  • 클론과 다르게 커밋등의 내용이 없다
    (zip파일로 다운받는것과 동일)
  • 템플릿 다운 용도로 적절

헷갈림 포인트

웹팩 역시 필요한 상황이나 빌드까지의 흐름을 경험하지 않으면
한번에 설정이나 그런 필요성이 와닿지 않는 것 같다

다만 parcel 과 webpack 설정 강의를 들으니 어느정도 사용법이나
어떤 설정이 어떤 역할을 하는지 알게 되는 것 같다

This post is licensed under CC BY 4.0 by the author.