본문 바로가기

Frontend/Webpack&Vite

[webpack] 기본 세팅

리액트를 하기 위한 webpack 세팅

  • CRA만 쓰지말고 직접 세팅해보자!

npm 사용준비

  • 프로젝트 폴더 열고 npm init

리액트 설치

  • npm i react react-dom

웹팩 설치(-D: 개발에만 쓰이는것)

  • npm i -D webpack webpack-cli

react문법을 위한 babel 설치

  • npm i -D babel-loader @babel/core @babel/preset-env @babel/preset-react @babel/plugin-proposal-class-properties
  • babel-loader : 바벨과 웹팩을 연결
  • @babel/core : 바벨 기본적인 파일
  • @babel/preset-env : 브라우저에 맞게 최신문법을 예전문법으로 변환
  • @babel/preset-react : jsx등 react 문법을 쓰기 위함
  • @babel/plugin-proposal-class-properties : state = {} 같은 class 최신 문법 쓰기위함

webpack.config 적용 순서

  • entry에 있는 파일을 읽고, module 적용한후 output에 뺀다

webpack.config.js

const path = require('path');

module.exports = {
  name: 'wordrelay-setting',
  mode: 'development', // 실서비스 production
  devtool: 'eval', // 소스맵, 로그, 디버깅, 번들 처리를 어떻게 할 것인지
  resolve: {
    extensions: ['.js', '.jsx'] // 여기서 생략해도 되는 확장자 등록
  },
  entry: {
    app: ['./client'],
  }, // 입력

  module: {
    rules: [{
      test: /\.jsx?/, // js와 jsx
      loader: 'babel-loader',
      options: {
        presets: ['@babel/preset-env','@babel/preset-react'],
        plugins: ['@babel/plugin-proposal-class-properties'],
      },
    }],
  },

  output: {
    path: path.join(__dirname, 'dist'),
    filename: 'app.js'
  }, // 출력

  devServer: {
    // writeToDisk: true // true로 하면 app.js 파일 실제로 생성
  } 
}

webpack 명령어 실행하는 방법 2가지

  • npx webpack

  • package.json의 script에 등록해서 npm run 등록한 이름으로 실행

    // package.json
    "scripts": {
      "test": "echo \"Error: no test specified\" && exit 1",
      "dev": "webpack"
    },

나머지 파일들을 만들고 웹팩 실행

  • entry에 적혀있는 파일(client)에서 의존성 맺고있는(import, require)것들을 찾아 변환&번들링해줌
  • dist폴더에 app.js파일로 번들링 되서 생성됨
  • html에서 번들링된 하나의 자바스크립트 파일만 읽게해서 최적화하는 원리

index.html

<body>
<div id="root"></div>
<script src="./dist/app.js"></script>
</body>

client.jsx

import React from 'react';
import ReactDom from 'react-dom';
import WordRelay from './WordRelay';

ReactDom.render(<WordRelay />, document.querySelector('#root'));

WordRelay.jsx

const React = require('react');
const { Component } = React;

class WordRelay extends Component {
    state = {
        text: 'Hello webpack',
    }

    render() {
            return <h1>{this.state.text}</h1>
    }
}

module.exports = WordRelay;

jsx를 못읽어서 나는 에러 => babel 필요

빌드 성공화면

웹팩2 자세히 설명해놓은 블로그