babel과 webpack, plugin 알아보기
맨 밑에 한눈에 보기 정리 있다!
CRA(Create React App), Vite를 사용하지 않고 애플리케이션을 구성하는 방법을 정리해 보려 한다.
위 두가지는 간편하게 자동으로 모든 것을 설정해주지만 커스터마이징에 제약이 많아 실무에 한계가 있다고 함
초기 설정
01 파일 만들기
먼저 프로젝트 폴더를 만든 후, 몇가지 파일을 세팅해준다.
index.html
src > App.js
src라는 폴더 안에 App.js 파일
02 react dom 세팅
html 파일 안에 root div를 넣어준 후
CDN을 통해 react와 reactDOM을 로드한다. (설치 없이 React를 사용할 수 있다.)
<head>
//...html 기본 코드 작성
//react와 reactDOM을 사용하기 위한 세팅
<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>
</body>
Transpiler
프로그래밍 언어의 코드를 다른 프로그래밍 혹은 다른 버전이나 형식으로 변환하는 도구
위와 같이 세팅을 해준 후, script 안에 react 문법으로 작성해줘도 동작은 하나, 꽤나 번거롭다.
그래서 사용하는 것이트랜스파일러!
01 바벨 설치하기
먼저 html script 모음들 아래 babel standalone을 추가해준다.
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
그리고 아래와 같이 리액트 문법대로 써주면 되는데! 이러면 오류가 뜬다.
그래서 오류를 없애기 위한 패키지들을 설치해줘야 한다.
02 패키지 설치하기
먼저 npm을 초기화해준 후 패키지를 설치한다.
npm init -y //모두 yes 하라는 뜻
npm install --save-dev @babel/core @babel/cli @babel/preset-react
babel-cli @babel/core: 빌드 타임에 바벨을 실행시키기 위한 CLI 명령어 도구
@babel/preset-react: React용 바벨 문법 변환 패키지
03 바벨 설정 파일 만들기
.babelrc 파일을 생성한 후 아래와 같은 코드를 작성한다.
rc를 뒤에 붙이면 패키지 설정 관련한 문서라는 뜻
{
"presets": ["@babel/preset-react"]
}
04 package.json 파일 수정
package.json 파일이 옆에 만들어져있을 건데, 그 파일 안에 들어가서 scripts를 찾아 아래 추가해주면 된다.
"scripts": {
"build": "babel src -d dist"
},
그리고 터미널을 열어 아래 명령어를 입력하면, dist 폴더에 App.js가 생긴다.
npm run build
Bundler
위처럼 트랜스파일을 해준 후, html에 스크립트로 그 파일을 연결해주면 정상적으로 작동이 된다.
하지만 이 경우 dist에 파일이 늘어날 때마다 로딩 시간이 길어질 거다.
이때 사용하는 게 번들러인데,
여러 개의 파일로 구성된 코드나 리소스를 최소한의 파일로 묶어주는 역할을 한다.
01 패키지 설치
터미널에 아래 명령어를 입력해 패키지를 설치한다.
npm install --save-dev webpack webpack-cli babel-loader
webpack webpack-cli: 빌드타임에 웹팩을 실행시키기 위한 CLI 명령어 도구
babel-loader: 베발과 통합하기 위한 바벨 로더
02 Webpack 설정 파일 생성
프로젝트 루트에 webpack.config.js 파일을 만든 후 아래의 코드를 입력한다.
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", //개발모드를 설정해줄 수 있음.
};
03 프로젝트 빌드 및 실행
package.json, script 항목에 아래 명령어 추가
"scripts": {
"build": "webpack"
},
터미널에 다시 npm run build를 입력해주면 dist 폴더에 하나의 통합 파일이 만들어진다.
Plugins
01 해시값 추가
먼저 빌드된 파일 이름에 해시값을 추가하여, 변경사항이 생길때 새로운 파일 이름이 생성하도록 해 불필요한 캐시를 막는다.
webpack.config.js
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.[contenthash].js'
}
02 html-webpack-plugin
해시값을 html에 자동으로 참조시키는 플러그인
npm install --save-dev html-webpack-plugin
터미널로 설치한 후, webpack.config.js 파일에 플러그인을 추가해준다.
const HtmlWebpackPlugin = require("html-webpack-plugin"); // 파일 상단 path 아래 기입
...
module: {...
} //모듈 다음에 아래 플러그를 추가
plugins: [
new HtmlWebpackPlugin({
template: "index.html",
filename: 'index.html',
})
]
03 clean webpack plugin
불필요한 파일을 자동으로 삭제
npm install --save-dev clean-webpack-plugin
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
plugins: [
new CleanWebpackPlugin(),
new HtmlWebpackPlugin({
template: "index.html",
filename: "index.html",
}),
],
04 webpack-dev-server
코드 변경 사항 실시간으로 반영
npm install --save-dev webpack-dev-server
플러그인을 설치한 후, webpack.config.js 파일에서 plugin 아래 추가해준다.
devServer: {
static: {
directory: path.join(__dirname, "dist"),
},
port: 9000, //개발 서버가 실행될 포트 번호
open: true, //서버가 실행되면 자동으로 브라우저 열기
hot: true, //코드 변경사항 실시간 반영
},
package.json
"scripts": {
"build": "webpack",
"start": "webpack serve"
},
이제 명령어 npm start를 하면 변경 사항을 실시간으로 확인할 수 있다 !
환경 변수 관리
정말 마지막이다.
실제 프로젝트에서는 프로덕트 환경에 따라 다른 설정을 적용해야 한다.
개발 환경에서만 필요하고 배포할 땐 필요하지 않은 무거운 파일 등을 따로 관리하는 것
01 환경 변수 파일 생성
.env.환경 파일을 생성한 후 각 환경에 필요한 변수를 설정한다.
.env.development
APP_API_URL=https://api.example.com
02 dotenv-webpack
npm install --save-dev dotenv-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"}`, //추가
}),
],
};
"scripts": {
"build": "webpack",
"start": "NODE_ENV=production webpack serve"
},
한 눈에 요약
01 파일 생성
index.html
.babelrc
.env.development
.webpack.config.js
02 터미널에서 패키지 install
npm init -y
npm install --save-dev @babel/core @babel/cli @babel/preset-react webpack webpack-cli babel-loader html-webpack-plugin clean-webpack-plugin webpack-dev-server dotenv-webpack cross-env
03 파일 수정
<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> //body 안에
index.html
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack",
"dev": "cross-env NODE_ENV=development webpack serve",
},
package.json
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
const DotenvWebpack = require("dotenv-webpack");
module.exports = {
entry: "./src/App.js", //번들링의 시작점(엔트리)입니다. 여기서는 src/index.js를 엔트리로 지정합니다.
output: { //번들링 결과물의 출력 위치와 파일명을 지정합니다. dist/bundle.js로 설정됩니다.
path: path.resolve(__dirname, "dist"), //너가 번들링한 파일을 어디에 둘거야?
filename: 'bundle.[contenthash].js',
},
module: {
rules: [
//.css .js 등 서로 다른 확장자를 가진 파일을 처리할 때 어떤 규칙을 적용할지 정의
//Babel을 사용해 JavaScript 파일을 트랜스파일링하기 위해 babel-loader를 설정합니다.
{
test: /\.js$/, // 어떤 파일을 대상으로 할지 정규표현식으로 작성
exclude: /node_modules/, // node_modules 폴더는 제외
use: {
loader: "babel-loader", // babel-loader를 사용
},
},
],
},
plugins: [
new CleanWebpackPlugin(),
new HtmlWebpackPlugin({
template: "index.html",
filename: 'index.html',
}),
new DotenvWebpack({
path: `./.env.${process.env.NODE_ENV || "development"}`,
}),
],
devServer: {
static: {
directory: path.join(__dirname, "dist"), //어떤 서버 참조할거야? //어떤 걸로 build 하니?
},
port: 9000, //네트워크의 열린 문, 실행될 포트 번호
open: true, //실행되면 자동으로 브라우저 염
hot: true, // 변경사항 실시간 반영 HMR Hot Module Reload 내가 저장하면 바로 반영해주는 기능 / hot 만 있어도 바로 반영 된다는 뜻
},
mode: "development", // 없으면 warning 이 남 //개발모드를 설정해줄 수 있음.
};
webpack.config.js
'WEB > react' 카테고리의 다른 글
[react/공부] useRef (0) | 2025.02.06 |
---|---|
[react/공부] styled-componenet (1) | 2025.02.05 |
[react/공부] useState로 컴포넌트 상속 알아보기 (0) | 2025.02.03 |
[react/공부] Hook이 뭐야? (0) | 2025.01.31 |
[react/공부] 리액트 시작하기 (2) | 2025.01.27 |