보통 리액트 프로젝트를 진행할때 CRA(Create React App)를 사용하여 쉽게 개발 환경을 구축할 수 있다. CRA를 사용하면 Babel, Webpcak 등 설정하기 귀찮은 내용들을 해결해주는 편한 툴이다.
나 또한 항상 당연하듯이 CRA로 리액트 프로젝트 개발을 시작했다. 그러던 중 CRA에 대한 궁금증이 생겨 CRA 없이 리액트 개발 환경을 구축하는 방법에 대해 정리해보았다.
프로젝트 파일을 생성하고 package.json 파일 초기화
mkdir cra
cd cra
npm init -y
mkdir src dist public
public 폴더에 루트 <div>
를 만든다.
cd public
touch index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>CRA 없이 리액트 개발 환경 구축</title>
</head>
<body>
<div id="root"></div>
</body>
</html>
리액트 컴포넌트를 렌더링할 index.js 파일을 생성
cd src
touch index.js
리액트의 핵심 패키지들을 설치
npm install react react-dom
리액트에서는 ES6와 JSX를 사용한다. 브라우저 호환성을 위해 ES6 => ES5, JSX => js로 트랜스파일링을 해주는 바벨을 설치해야한다.
npm install @babel/core @babel/preset-react @babel/preset-env -D
루트 경로에서 babel.config.js
파일을 생성하고 프리셋들을 설정
module.exports = {
presets: ['@babel/preset-react', '@babel/preset-env'],
};
모듈 번들러인 웹팩의 핵심 패키지들을 설치한다.
npm install webpack webpack-cli webpack-dev-server -D
웹팩 번들링에 필요한 로더를 설치한다.
npm install babel-loader style-loader css-loader file-loader -D
<style>
태그로 감싸서 삽입웹팩 번들링 후 적용할 플러그인 설치
npm install html-webpack-plugin clean-webpack-plugin -D
루트 경로에 webpack.config.js
파일 생성
mode : devlopment(개발용), production(배포용), none 3가지 모드가 있습니다.
entry : 웹팩을 실행할 대상 파일
module.exports = {
mode: 'development',
entry: './src/index.js' resolve: {
extensions: ['.js', '.jsx'],
},
};
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
path: path.resolve(__dirname, './dist'), // 결과물 경로
filename: 'bundle.js', // 결과물 파일명
},
};
resolve: {
extensions: ['.js', '.jsx'],
},
devtool: 'eval-cheap-source-map',
overlay
: 에러 발생 시 브라우저에 내용을 띄울지 설정hot
: 모듈의 변화만 자동으로 로드하는 HMR(Hot Module Replacement) 기능 활성화 설정writeToDisk
: 메모리 뿐만 아니라 파일도 만들것인지 설정 devServer: {
port: 5500,
overlay: true,
hot: true,
writeToDisk: true,
},
test
: 어떤 파일에 적용할지 확장자 작성exclude
: 로더에서 제외할 파일 설정loader
: 적용할 로더가 1개라면 loader로 설정use
: 적용할 로더가 2개 이상이면 use 배열로 설정 module: {
rules: [
{
test: /\.(js|jsx)$/,
exclude: '/node_modules/',
loader: 'babel-loader',
},
{
test: /\.css$/,
// use: ['style-loader', 'css-loader'],
use: [MiniCssExtractPlugin.loader, 'css-loader'],
},
{
test: /\.(jpeg|jpg)$/,
loader: 'file-loader',
options: {
name: '[name].[ext]',
},
},
],
},
template
는 번들링 파일을 주입하고 번들링 폴더로 복사할 대상 HTML 파일을 명시하는 옵션입니다.const htmlWebpackPlugin = require('html-webpack-plugin');
const cleanWebpackPlugin = require('clean-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
...
plugins: [
new CleanWebpackPlugin(),
new HtmlWebpackPlugin({
template: './public/index.html',
}),
new MiniCssExtractPlugin({ filename: 'app.css' }),
],
--progress
옵션은 번들링 진행 상태를 보여줍니다. "scripts": {
"dev": "webpack-dev-server --progress & open http://localhost:5000/",
"build": "webpack --pregress"
},
cd src
touch App.css App.jsx
import React from 'react';
import './App.css';
const App = () => {
return <div className='container' />;
};
export default App;
.container {
width: 500px;
height: 200px;
margin: 0 auto;
background-image: url(../public/bg.jpg) center no-repeat;
background-size: cover;
}
import React from 'react';
import ReactDom from 'react-dom';
import App from './src/App';
ReactDom.render(<App />, document.getElementById('root'));
package.json에 등록한 scripts 명령어로 실행
npm run dev
실행 결과 dist폴더에 아래 이미지와 같이 파일들이 생성되었다.
로그를 통해서 실행되는 것을 확인할 수 있다.
최근 webpack에 대해서 공부하다가 CRA 없이 리액트 개발 환경 구축을 해보았습니다. 기초적인 부분만 살펴보았는데도 이해가 안되는 부분이 있어 2~3번 반복해보니 이제야 정리가 된 것 같습니다.
I'm so happy with Payvantage. I needed a new phone but was concerned about my credit. Their no-credit approval process was super fast and easy. I got the latest Android phone without any stress, and the payment plan is very manageable. Highly recommend!https://mypayvantage.com/
@drive mad, 너무 좋은 포스트 잘 읽었습니다. 감사합니다!