이 2가지를 먼저 알아야 React 환경을 구축할 수 있다.
WebPack이란? JS 어플리케이션을 위해 여러개의 파일을 하나의 파일로 통합해주는 모듈 번들러
ES6+ 버전 이상의 JS 코드를 하위 버전의 JS 문법으로 변환
브라우저가 지원하지 않는 경우
가 많다. (특히, ES6+ 이후)// package.json 생성
npm init -y
npm i react react-dom
<style>
태그로 변환 후, index.html의 <head>
부분에 삽입// webpack 설치
npm i --save--dev webpack webpack-cli webpack-dev-server
// 관련모듈 설치
npm i --save--dev babel-loader css-loader style-loader file-loader html-webpack-plugin clean-webpack-plugin
npm i --save--dev @babel/core @babel/preset-react @babel/preset-env
// babel.config.js
module.exports = {
presets: ['@babel/preset-env', '@babel/preset-react'],
};
// webpack.config.js
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
module.exports = {
mode: 'development', // 만약 환경변수를 사용하지 않는다면 직접 'development' 입력
entry: './src/index.js',
output: {
// 번들링 결과 : /dist폴더
path: __dirname + '/dist',
// bundle.해쉬.js로 생성
filename: 'bundle.[hash].js',
publicPath: '/',
},
resolve: {
// 번들링을 할 파일 설정
extensions: ['.js', '.jsx'],
},
module: {
// loader 설정 - 등록한 로더의 뒤의 요소부터 번들링에 반영
// node_modules 제외
rules: [
{
test: /\.(js|jsx)$/,
exclude: '/node_modules/',
loader: 'babel-loader',
},
{
test: /\.css$/,
use: [{ loader: 'style-loader' }, { loader: 'css-loader' }],
},
{
test: /\.(png|jpe?g|gif|svg)$/i,
loader: 'file-loader',
options: {
name: 'assets/[contenthash].[ext]',
},
},
],
},
plugins: [
// 빌드 이전 결과물을 제거
new CleanWebpackPlugin(),
// 번들한 css파일과 js파일을 html 파일에 link 태그, script태그로 추가
new HtmlWebpackPlugin({
template: 'public/index.html',
}),
// 환경 정보를 제공
new webpack.DefinePlugin({
mode: 'development',
port: 3000, // 포트번호 0이상 65536 미만 번호로 설정
}),
],
devServer: {
host: 'localhost',
port: 3000,
open: true,
historyApiFallback: true,
// hot : 모듈의 변화된 부분만 서버에 자동으로 반영
hot: true,
},
};
FYI : 포트 번호를 0 이상 65535 이하로 설정하는 것은 네트워크 프로토콜의 표준을 따르는 것이며, 65536 이상의 번호는 사용 불가하기 때문에 이 범위 내에서 설정 해야 한다.
// package.json
"scripts": {
"start": "webpack-dev-server --progress --mode development",
"build": "webpack --progress --mode production"
}
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=divice-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>title</title>
</head>
<body>
<div id="root"></div>
</body>
</html>
// index.js
import React from "react";
import { createRoot } from "react-dom/client";
import App from "./App";
const container = document.getElementById("root");
const root = createRoot(container);
root.render(<App />);
// App.jsx
import React from "react"; // 꼭 import 해야한다. import 하지 않으면 렌더링 안됨
function App() {
return <></>;
}
export default App;