All Articles

리액트 웹팩(WebPack) 설치하기


사전에 node가 설치되어야 합니다. 자신의 OS에 맞게 node를 설치해주세요.


Webpack 공식 문서 - 링크


웹팩 (Webpack) 설치하기

  1. 터미널을 열고, 자신의 프로젝트 경로로 이동하여 “npm init” 입력합니다.

  1. react와 react-dom을 설치합니다.
npm i react react-dom

  1. webpack과 webpack-cli를 추가로 설치합니다. ( -D 는 개발용으로만 webpack을 사용할 것이라는 뜻입니다. 그래서 설치 후에, package.json 파일에서 “devDependencies”: 에 추가됩니다. )
npm i -D webpack webpack-cli

  1. index.html 파일에서 webpack으로 출력할 파일을 추가해줍니다.
...
<script src="./dist/app.js"></script>
...

  1. Counter.jsx 파일 생성
const React = require('react');
const { Component } = React;

class Counter extends Component {
    state = {

    };

    render() {

    }
}

module.exports = Counter;
  • React를 사용하기 위해서 2번에서 설치한 라이브러리를 위와 같이 선언해서 작성해줘야합니다.

  • 하단에 export 해야 다른 파일에서 Counter.jsx 파일을 사용할 수 있습니다.


  1. client.jsx 파일 생성
const React = require('react');
const ReactDom = require('react-dom');

const Counter = require('./Counter');

ReactDom.render(<Counter />, document.querySelector("#root"));
  • 5번의 Counter 파일을 위와 같이 불러와, 렌더링 해줄 수 있습니다.

  1. webpack.config.js 파일 생성
const path = require('path');
//실서비스: process.env.NODE_ENV = 'production';

module.exports = {
  name: 'counter-settings',
  mode: 'development', //실서비스: production
  devtool: 'eval',  //실서비스: hidden-source-map
  resolve: {
    extensions: ['.js','.jsx']
  }

  entry: { //입력
    app: ['./client']
  },
  output: { //출력
    path: path.join(__dirname, 'dist'),
    filename: 'app.js'
  },
}
  • resolve는 확장자를 적어놓게 되면, 파일이름 뒤의 확장자를 webpack이 자동으로 찾아서 실행한다.

  • path는 자신의 프로젝트 경로의 폴더에서 원하는 파일로 설정할 수 있다.


  1. 터미널에서 “webpack” 명령어를 실행하면, command not found가 뜰 것입니다. 그것을 해결하는 방법에는 여러 가지가 있지만, 2가지 방법을 알아보겠습니다.

  2. package.json 파일에서 “scripts”: { “dev”: webpack } 으로 작성하여, 터미널에서 “npm run dev” 실행


  • “npx webpack” 으로 실행

Error!!!! 가 나타납니다.

- Error가 난 이유는 client.jsx 파일의 태그인 JSX 때문입니다. 이것을 사용하기 위해서 바벨(babel) 설치가 필요합니다. 다음으로 가봅시다.



웹팩 (Webpack) 설정하기

[webpack.config.js] 파일
const path = require('path');

module.exports = {
  name: 'counter-settings',
  mode: 'development', //실서비스: production
  devtool: 'eval',  //실서비스: hidden-source-map
  resolve: {
    extensions: ['.js','.jsx']
  },

  entry: { //입력
    app: ['./client']
  },
  module: {
        rules: [{
            test: /\.jsx?$/,
            loader: 'babel-loader',
            options: {
                presets: [
                    ['@babel/preset-env', {
                        targets: {
                            browsers: ['> 5% in KR'],
                        },
                        debug: true,
                    }],
                    '@babel/preset-react',
                ],
                plugins: [],
            },
      }],
  },
  plugins: [
    new webpack.LoaderOptionsPlugin({ debug: true });
  ],
  output: { //출력
    path: path.join(__dirname, 'dist'),
    filename: 'app.js'
  },
}

Webpack 공식 문서에서도 위의 파일과 같이 Mode, Entry, Output, Loaders(Module), Plugins 를 기본적인 개념으로 강조합니다.

Entry : 시작하는 파일들을 넣고, Output : 결과가 어떻게 나올지 설정하고, Loaders(Module) : 규칙들을 적용하며, Plugins : 추가적으로 하고 싶은 작업을 설정하고, Mode : development, production 중 선택


@babel/preset-env와 plugins

웹팩 설치할 때 말했듯이, @babel/preset-env는 여러분의 브라우저 버전에 맞게 최신 문법을 옛날 문법으로 바꿔 적용시켜주는 역할을 합니다.

preset 이라는 것은 plugin들의 집합을 의미하며, ‘preset-env’ 이 안에도 수많은 plugin들을 내포하고 있습니다.

적용하고자 하는 plugin을 명시적으로 설정해주는 것이, babel 연산 속도가 느려지지 않도록 하는 것이 좋습니다.

위의 설정에선, browsers를 ‘한국에서 5% 이상의 점유율을 가지고 있는 브라우저를 지원하라’ 로 설정하였습니다.

브라우저 버전이나 설정에 대한 것은 Browserslist 사이트 를 참고하시면 됩니다.


자동으로 빌드해주는 방법

[ webpack-dev-server와 hot-loader ]

변경사항이 있을 때마다, “npm run dev” 또는 “npx webpack”로 빌드하기 귀찮기 때문에, 자동으로 빌드해주는 방법을 알아봅시다.


  1. 터미널을 열고, react-hot-loader 를 설치해줍니다.
npm i -D react-hot-loader

react-hot-loader 는 코드가 변경되었을 때 페이지를 새로고침하지 않고 바뀐부분만 빠르게 교체해주는 라이브러리입니다.



  1. 추가로 webpack-dev-server 를 설치해줍니다.
npm i -D webpack-dev-server

webpack-dev-server 는 로컬에서 사용할 개발용 서버를 제공합니다. 이 기능을 사용하여 소스 파일을 감시하고 내용이 변경될 마다 번들을 다시 컴파일 합니다. 수시로 새로고침을 하지 않아 편리합니다.



  1. package.json 설정
...
"scripts": {
    "dev": "webpack-dev-server --hot"
  },
...


  1. client.jsx 설정

기존에 렌더링 했던 <WordRelay /> 대신 Hot를 만들어 <Hot /> 으로 변경해줍니다.

const { hot } = require('react-hot-loader/root');
const Hot = hot(WordRelay);

ReactDom.render(<Hot />, document.querySelector("#root"));
(client.jsx 전체 코드)
const React = require('react');
const ReactDom = require('react-dom');
const { hot } = require('react-hot-loader/root');

const WordRelay = require('./WordRelay');

const Hot = hot(WordRelay);

ReactDom.render(<Hot />, document.querySelector("#root"));


  1. webpack.config.js 설정

babel-loader options의 plugins 안에 ‘react-hot-loader/babel’을 추가해줍니다.

(webpack.config.js 전체 코드)
const path = require("path");

module.exports = {
  name: "wordrelay-settings",
  mode: "development", //실서비스: production
  devtool: "eval", //실서비스: hidden-source-map
  resolve: {
    extensions: [".js", ".jsx"]
  },

  //입력
  entry: {
    app: ["./client"]
  },
  module: {
    rules: [
      {
        test: /\.jsx?/,
        loader: "babel-loader",
        options: {
          presets: [
            [
              "@babel/preset-env",
              {
                targets: {
                  browsers: ["> 1% in KR"]
                },
                debug: true
              }
            ],
            "@babel/preset-react"
          ],
          plugins: [
            "@babel/plugin-proposal-class-properties",
          "react-hot-loader/babel"]
        }
      }
    ]
  },

  plugins: [],

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


  1. webpack output 파일 설정

webpack-dev-server를 사용할 땐 폴더를 사용하지 않고, ./app.js로 설정해줍니다.

그 이유는 webpack-dev-server 자체적으로 따로 처리하기 때문에 그런 것 같습니다.

아래와 같이 index.html 파일을 변경해줍니다.

...
<script src="./app.js"></script>
...
(index.html 전체 코드)
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf8" />
  <title>끝말잇기</title>
</head>
<body>
  <div id="root"></div>

  <script src="./app.js"></script>
</body>
</html>


+ 추가로 output path를 설정하는 방법

  • webpack.config.js 파일에서 publicPath를 추가해줍니다.
...
output: {
    path: path.join(__dirname, "dist"),
    filename: "app.js"
    publicPath: '/dist/'
  }
...
  • index.html 파일에서 script의 경로를 변경해줍니다.
<script src="./dist/app.js"></script>


  1. 터미널에 npm run dev 실행 후, localhost:8080 접속 확인! 이로써, 수정사항 있을 때, 알아서 자동으로 반영이 되어 나타납니다.

※ webpack.config.js 설정 변경시, 꼭 재실행 (npm run dev) !!!

webpack-dev-server가 탐지하는 것은 client.jsx나 client.jsx 에서 불러오는 것들만 자동으로 업데이트 반영해주는 것이다.

webpack.config.js의 변경점은 스스로 눈치 채지 못하므로 변경시에 꼭 재실행 해줘야 합니다.



참고 - ZeroCho님의 React 강좌