CRA나 Vite를 사용하지 않고 React 어플리케이션을 구성해보기
이유 : CRA는 간편하게 설정을 자동화해 주지만, 커스터마이징에 제약이 많아 실무에서 한계가 있을 수 있음
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>No CRA</title>
</head>
<body>
<div id="root"></div>
<script>
const App = () => {
return (
<>
<h1>Hello World</h1>
</>
);
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<App />);
};
</script>
</body>
</html>
<script src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<div id="root"></div>
<script type="text/babel">
const App = () => {
return (
<>
<h1>Hello World</h1>
</>
);
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<App />);
};
npm init -y
npm install --save-dev @babel/core @babel/cli @babel/preset-react
or
yarn init -y
yarn add @babel/core @babel/cli @babel/preset-react --dev
babel-cli
@babel/core
: 빌드타임에 바벨을 실행시키기 위한 CLI 명령어 도구.@babel/preset-react
: React 용 바벨 문법 변환 패키"scripts": {
"build": "babel src -d dist"
},
npm run build or yarn run build를 통해 실행시켜주면, dist 폴더에 app.js 가 생김
const App = () => {
return /*#__PURE__*/ React.createElement("h1", null, "Hello, World!");
};
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(/*#__PURE__*/ React.createElement(App, null));
index.html 수정
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>No CRA</title>
<script src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
</head>
<body>
<div id="root"></div>
<script src="./dist/app.js" type="module"></script>
</body>
</html>
번들러란?
번들러란 여러개의 파일로 구성된 코드나 리소스를 하나의 파일(또는 몇 개의 파일)로 묶어주는 도구. 여러 JavaScript, CSS, 이미지파일등을 하나의 파일로 결합하여 배포 및 로드 성능을 개선하는데 사용됨
참고) 브라우저는 한번에 6개씩 나누어서 네트워크 요청을 가져옴. 여러개의 파일이 있다면 그만큼 로드가 지연됨.
npm install --save-dev webpack webpack-cli babel-loader
or
yarn add --dev webpack webpack-cli babel-loader
webpack
webpack-cli
: 빌드타임에 웹팩을 실행시키기 위한 CLI 명령어 도구.babel-loader
: 바벨과 통합하기 위한 바벨 로더const path = require("path");
module.exports = {
entry: "./src/app.js",
output: {
path: path.resolve(__dirname, "dist"),
filename: "bundle.js",
},
module: {
rules: [
//.css .js 등 서로 다른 확장자를 가진 파일을 처리할 때 어떤 규칙을 적용할지 정의
{
test: /\.js$/, // 어떤 파일을 대상으로 할지 정규표현식으로 작성
exclude: /node_modules/, // node_modules 폴더는 제외
use: {
loader: "babel-loader", // babel-loader를 사용
},
},
],
},
mode: "development", // 없으면 warning 이 남
};
entry
: 번들링의 시작점(엔트리)입니다. 여기서는 src/index.js
를 엔트리로 지정output
: 번들링 결과물의 출력 위치와 파일명을 지정dist/bundle.js
로 설정module.rules
: Babel을 사용해 JavaScript 파일을 트랜스파일링하기 위해 babel-loader
를 설정mode
: 개발모드를 설정해줄 수 있음.package.json
의 scripts
항목에 다음 명령어를 추가"scripts": {
"build": "webpack"
},
빌드명령어를 시작하면 dist폴더에 파일이 생김
: 코드최적화가 있는지에 따른 빌드속도가 차이가난다.
Webpack플러그인은 빌드과정중 특정 기능을 추가하거나 개선하는 역할을 한다.
1. 파일 이름에 해시값 추가
캐시 문제를 해결하기 위해 빌드된 파일 이름에 해시값을 추가
코드가 변경될 때마다 새로운 파일 이름이 생성, 브라우저에서 업데이트 된 js파일을 캐시하지 않도록 설정 가능
2. HTML Webpack plugin 설정
yarn add --dev html-webpack-plugin
or
npm install --save-dev html-webpack-plugin
: clean Webpack Plugin 설정 시 빌드 시마다 HTML파일이 자동으로 업데이트, 파일을 삭제해줄 필요가 없다.
npm install --save-dev clean-webpack-plugin
or
yarn add --dev clean-webpack-plugin
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
plugins: [
new CleanWebpackPlugin(),
new HtmlWebpackPlugin({
template: "index.html",
filename: "index.html",
}),
],
: Webpack 개발 서버를 설정해 코드 변경 사항이 실시간으로 반영되도록 설정
1. 개발 서버 설치 및 설정
npm install --save-dev webpack-dev-server
or
yarn add --dev webpack-dev-server
devServer: {
static: {
directory: path.join(__dirname, "dist"),
},
port: 9000, // 개발 서버가 실행될 포트번호
open: true, // 서버가 실행되면 자동으로 브라우저를 염
hot: true, // 코드 변경 사항을 실시간으로 반영
},
"scripts": {
"build": "webpack",
"start": "webpack serve"
},
설치가 끝난 후 yarn start or npm start 명령어로 개발 서버를 실행하고, 코드가 수정될 때마다 자동으로 변경 사항이 브라우저 반영
: 실제 프로젝트에서는 개발, 스테이징, 프로덕션 환경에 맞게 다른 설정을 적용해야함. Webpack 과 함께 dotenv-webpack을 사용해 환경변수를 관리
1. 환경 변수 파일 생성
: 프로젝트 루트에 .env.development, .env.production 파일을 생성해 각 환경에 맞는 변수 설정
# .env.development
APP_API_URL=https://dev-api.example.com
# .env.production
APP_API_URL=https://api.example.com
npm install --save-dev dotenv-webpack
or
yarn add --dev dotenv-webpack
webpack설정 파일에 플러그인 추가
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
const DotenvWebpack = require("dotenv-webpack");
const mode = process.env.NODE_ENV || "development";
module.exports = {
mode,
plugins: [
new CleanWebpackPlugin(),
new HtmlWebpackPlugin({
template: "index.html",
filename: "index.html",
}),
new DotenvWebpack({
path: `./.env.${process.env.NODE_ENV || "development"}`,
}),
],
};
script변경
"scripts": {
"build": "webpack",
"start": "NODE_ENV=production webpack serve"
},
환경변수 사용
const apiUrl = process.env.APP_API_URL;
크로스 개발환경 추가
윈도우 환경에서는 set NODE_ENV=~ &&
이런식으로 사용해야함
각각 환경에서 오류가 나지 않도록 변경해주기 위해서 cross-env 패키지를 설치
npm install --save-dev cross-env
"start": "cross-env NODE_ENV=development webpack serve"