리액트의 진입 장벽을 낮춰 주는 매력적인 create-react-app.
CRA로 프로젝트를 진행해 왔지만, 직접 환경을 구성할 필요성을 느꼈다.
가벼운 무게와 리액트가 어떻게 돌아가는지 자세히 알기 위해서...!
알아야 할 것이 산더미지만 잊지 않기 위해 우선 기록해 본다.
# cmd창
## 폴더 생성
mkdir react-app
## 해당 폴더로 이동
cd react-app
## node package.json 생성
yarn init
이제 원하는 코드 에디터에 해당 폴더를 열면 node_module 폴더와 package.json이 있을 것이다.
public 폴더 생성 뒤 index.html 생성 한다.
<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>리액트 프로젝트</title>
</head>
<body>
<div id="root"></div>
</body>
</html>
body 안에 id root인 div는 우리가 만들 리액트 파일들이 그려질 영역이다.
이제 리액트를 사용하기 위해 모듈들을 설치해 보자.
# cmd
yarn add react react-dom
ES6 이후의 문법이나 리액트에서 쓰는 JSX문법을 지원하지 않는 브라우저가 이해할 수 있도록 변환해준다.
# cmd
yarn add @babel/core @babel/preset-react @babel/preset-env
HTML, CSS, JavaScript, Image등을 병합하여 하나의 결과물로 만드는 도구
# cmd
yarn add webpack webpack-cli webpack-dev-server -D
웹팩의 번들링에 필요
# cmd
yarn add babel-loader css-loader sass-loader -D
번들링 파일에 적용할 플러그인들
# cmd
yarn add html-webpack-plugin clean-webpack-plugin mini-css-extract-plugin -D
// 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 MiniCssExtractPlugin = require("mini-css-extract-plugin");
module.exports = {
mode: "development",
entry: "./src/index.js",
output: {
path: __dirname + "/dist",
filename: "[name].js",
clean: true,
},
resolve: {
extensions: [".js", ".jsx"],
},
module: {
rules: [
{ test: /\.(js|jsx)$/i,
exclude: "/node_modules/",
loader: "babel-loader"
},
{
test: /\.(sc|c)ss$/i,
use: [MiniCssExtractPlugin.loader, "css-loader", "sass-loader"]
},
plugins: [
new HtmlWebpackPlugin({ template: "public/index.html" }),
new MiniCssExtractPlugin(),
],
devServer: {
host: "localhost",
port: 1234,
open: true,
client: {
overlay: true,
},
historyApiFallback: true,
hot: true,
proxy: {
"/api/*": {
target: "http://localhost:5000",
pathRewrite: { "^/api": "/" },
},
},
},
};
난관이었던 웹팩 설정...☆ 하나 하나 찬찬히 살펴 보자.
// package.json
"scripts": {
"start": "webpack serve --progress --mode development",
"build": "webpack"
}
실행 스크립트를 입력한다.
'--progress' 옵션은 번들링 진행 상태를 볼 수 있다.
이제 public/index.html에 넣을 컴포넌트를 만들어 보자.
src 폴더를 생성하고 app.jsx를 생성한다.
// src/app.jsx
import React from "react";
function App(){
return <p>진실은 언제나 하나...!</p>
};
export default App;
그 다음 이 컴포넌트와 public/index.html을 연결해 줄 index.js를 생성한다.
// src/index.js
import React from "react";
import ReactDOM from "react-dom";
import App from "./App";
ReactDOM.render(<App />, document.getElementById("root"));
이제 React는 ReactDOM을 사용하여 id값이 root인 HTML element에 우리가 작성한 컴포넌트를 표시한다.
그리고 cmd 창에 'yarn start'를 입력하면 끄읏-☆
글 챕터를 통일 시키려고 '세상에, 간단해😏'를 사용하고 있지만 반어법의 정석이 아닐까 매번 생각 한다.
알면 알수록 알아갈 게 많은 JS와 그와 관련된 프레임워크, 라이브러리들...
이번에는 웹팩 설정도 해봤는데 속성도 많고 그에 따른 옵션도 많았다.
(왜 CRA 프로젝트에서 eject 시키면 설정할 게 많아질 거라는 지 알게 된...)
프랜시스 베이컨의 '아는 것이 힘이다'가 실감나기도 하면서 재밌기도 하면서 아는 것보다 모르는 것이 많구나 실감 났다.
그래서 결론은... 파이팅이라고여...🙋🏻♀️
아주 유용한 정보군요!