webpack을 통해 React 환경을 직접 구성해 보려고 한다.
npm install react react-dom
React 기본 설정을 해보자
우선 root > public
경로에 토대가 되는 index.html 파일을 생성한다.
<!DOCTYPE html>
<html lang="ko-KR">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
// 이 안에 들어가는 모든 엘리먼트를 React DOM에서 관리하기 때문에 이것을 “루트(root)” DOM 노드라고 부릅니다.
<div id="root"></div>
</body>
</html>
body 태그 안에 있는 <div id="root"></div>
를 기준으로 React의 랜더링이 실행된다.
그 후root > src
경로에 index.jsx파일을 생성한다.
import React from "react";
import ReactDOM from "react-dom/client";
const root = ReactDOM.createRoot(document.getElementById("root"));
const element = <h1>Hello, world</h1>;
root.render(element);
React 엘리먼트를 렌더링 하기 위해서는 우선 DOM 엘리먼트를 ReactDOM.createRoot()
에 전달한 다음, React 엘리먼트를 root.render()
에 전달해야 합니다.
위에서 한 설정만으로는 제대로된 실행이 되지 않을 것이다. 왜냐하면 entry-point
가 index.jsx로 설정이 안되어있기 때문에 webpack
이 바뀐 시작점을 인식 할 수 없다. 게다가 .jsx
파일도 인식하지 못한다.
추가적인 설정을 통해 해결해 보자.
우선 entry-point
를 index.jsx로 바꾸자.
// webpack.config.js
// ...
module.exports = {
// ...
entry: {
main: "./src/index.jsx",
},
// ...
}
기존에 ./src/app.js
였던 entry-point
를 ./src/index.jsx
로 변경하자.
다음은 .jsx
파일을 인식하게 해보자.
기존의 babel-loader 설정은 .js
파일만 인식 할 수 있었기 때문에 .jsx
파일도 인식할 수 있도록 추가한다.
// webpack.config.js
// ...
module.exports = {
// ...
module: {
rules: [
{
test: /\.(js|jsx)$/i,
exclude: /node_modules/,
loader: "babel-loader",
},
],
},
// ...
}
기존에 /\.js$/i
였던 정규식을 /\.(js|jsx)$/i
로 변경하자.
추가적으로 React 에 맞는 babel 설정을 하기 위해 @babel/preset-react 을 설치한다.
npm install -D @babel/preset-react
babel.config.js
파일에 preset을 추가한다.
// babel.config.js
module.exports = {
["@babel/preset-react", { runtime: "automatic" }],
};
automatic
으로 설정시import React from "react"
구문을 생략 할 수 있다.React를 추가했으니 그에 맞게 ESLint 설정도 추가해보자.
npm install -D eslint-plugin-react eslint-plugin-react-hooks eslint-plugin-jsx-a11y
// .eslintrc.js
module.exports = {
// ...
extends: [
"eslint:recommended",
"eslint-config-prettier",
"plugin:react/recommended",
"plugin:react-hooks/recommended",
"plugin:jsx-a11y/recommended",
],
plugins: ["prettier", "react", "react-hooks", "jsx-a11y"],
parserOptions: {
// ECMScript 규격의 JSX 사용 여부
ecmaFeatures: {
jsx: true,
},
// ...
},
rules: {
// ...
// import React from "react" 구문을 사용하지 않아도 경고를 표시하지 않는다.
"react/react-in-jsx-scope": "off",
},
};
React-router-dom을 사용하여 라우팅 설정을 해보자
npm install react-router-dom
import { BrowserRouter, Route, Routes } from "react-router-dom";
import Home from "@/components/Home/Home";
import Profile from "@/components/Profile/Profile";
const App = () => {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/profile" element={<Profile />} />
</Routes>
</BrowserRouter>
);
}
export default App;
path
속성에는 원하는 경로를 작성하면 된다.path="*"
로 설정하면 설정한 경로 이외의 모든 경로에 대한 결과를 제공합니다. 주로 404 페이지 등에 사용된다./:id
와 같이 경로에 :
를 붙여서 동적인 부분을 나타낼 수 있다.elemet
속성에 렌더링할 컴포넌트를 지정할 수 있다.