React 기본 학습 -2. Webpack 도입 및 설정 - 구구단 예제

React 기본 학습 -2. Webpack 도입 및 설정 - 구구단 예제

리액트 강좌를 보면서 학습한 내용 정리용.

리액트 무료 강좌(웹게임) - ZeroCho TV

Webpack 도입 및 설정 - 구구단 예제

package.json

{
  "name": "gugudan",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "dev": "webpack"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "react": "^17.0.1",
    "react-dom": "^17.0.1"
  },
  "dependencies": {
    "@babel/core": "^7.12.3",
    "@babel/plugin-proposal-class-properties": "^7.12.1",
    "@babel/preset-env": "^7.12.1",
    "@babel/preset-react": "^7.12.5",
    "babel-loader": "^8.2.1",
    "webpack": "^5.5.0",
    "webpack-cli": "^4.2.0"    
  }
}

webpack.config.js

webpack 설정

const path = require('path');
const webpack = require('webpack');

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

    entry: {
        app: ['./client'],
    }, // 입력

    module: {
        rules: [{
            test: /\.jsx?$/,
            loader: 'babel-loader',
            options: {
                presets: [
                    // preset 에 상세 옵션 줄때 아래와 같이 설정 가능
                    ['@babel/preset-env', {
                        targets: {
                            browsers: ['> 5% in KR'], // 한국에서 점유율 5% 이상 브라우저에 대응
                        },
                        debug: true,
                    }], '@babel/preset-react'], // plugin 들의 모음이 preset 임.
                plugins: [], // babel-loder의 추가요소
            },
        }],
    },
    plugins: [
        new webpack.LoaderOptionsPlugin({ debug: true }),
    ], // 추가적으로 붙이고 싶은 것들이 있으면 여기
    output: {
        path: path.join(__dirname, 'dist'), // path.join 은 현재폴더 경로 + dist 를 반환함
        filename: 'app.js'
    } // 출력
};

GuGuDan.jsx

const React = require('react');
const ReactDom = require('react-dom');
const { useState, useRef } = React; 
// 이 선언으로 react.useState -> useState 로 사용 가능. 중복선언 생략가능.

const GuGuDan = () => {
    // 변경이 발생하는 값의 선언
    const [first, setFirst] = useState(Math.ceil(Math.random() * 9));
    const [second, setSecond] = useState(Math.ceil(Math.random() * 9));
    const [value, setValue] = useState('');
    const [result, setResult] = useState('');
    const inputRef = useRef(null); // ref
    
    const onChangeInput = (e) => {
        setValue(e.target.value);
    };

    const onSubmitForm = (e) => {
        e.preventDefault();
        if (parseInt(value) == first * second) {
            setResult('정답 : ' + value);
            setFirst(Math.ceil(Math.random() * 9));
            setSecond(Math.ceil(Math.random() * 9));
            setValue('');
            // inputRef
            inputRef.current.focus();
        } else {
            setResult('');
            setValue('');
            inputRef.current.focus();
        }
    };

    return (
        <React.Fragment>
            <div>{first} 곱하기 {second}는?</div>
            <form onSubmit={onSubmitForm}>
                <input ref={inputRef} onChange={onChangeInput} value={value}/>
                <button>입력!</button>
            </form>
            <div id="result">{result}</div>
        </React.Fragment>
    );
}

// GuGuDan이 다른곳에서 쓰이려면 반드시 아래와 같이 선언해야함.
module.exports = GuGuDan;
주의!

client.jsx

const React = require('react');
const ReactDom = require('react-dom');

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

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

index.html

<html>
    <head>
        <meta charset="UTF-8" />
        <title>구구단</title>
    </head>
    <body>
        <div id="root"></div>
        <script src="./dist/app.js"></script>
    </body>
</html>

GitHub : React-Study-1/1.구구단/

Pie's Tech Note

생계형 개발자의 메모장

comments powered by Disqus

    rss facebook twitter github youtube mail spotify instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora