npm i ~
npm이란 Node Package Manager의 줄임말으로, 자바스크립트 라이브러리를 편하게 설치하고 관리하도록 돕는 패키지 매니저입니다.
npm init -y
-y
: 별도의 수동 설정없이 default로 설정된 package.json 파일이 바로 생성됩니다.
npm i -D webpack webpack-cli
-D
: 웹팩은 개발용 라이브러리(=개발할 때만 사용되고 배포 시 최종 애플리케이션 코드에서 제외되는 라이브러리)이므로 설치 옵션에 -D
를 추가합니다.
npm i -D webpack-dev-server
index.html
파일에 스크립트 로딩 관련 코드를 직접 작성하지 않아도 됩니다.
npm install -D html-webpack-plugin
// webpack.config.js
const HtmlWebpackPlugin = require('html-webpack-plugin');
const path = require('path');
module.exports = {
entry: './src/index.jsx', // webpack 최초 진입점(엔트리 포인트) 파일 경로를 설정합니다.
output: { // webpack을 실행한 후의 결과물의 이름/경로 등을 설정합니다.
filename: 'main.js',
path: path.resolve(__dirname, 'dist'),
},
plugins: [
new HtmlWebpackPlugin({
template: './index.html', // 번들링 파일을 주입하여 번들링 폴더로 복사할 대상 HTML 파일을 설정합니다.
}),
],
devServer: { // webpack-dev-server 옵션을 설정합니다.
static: path.resolve(__dirname, 'dist'),
historyApiFallback: true, // 404 페이지 대신 index.html로 이동합니다.
hot: true, // 모듈 전체를 다시 로드하지 않고 변경된 사항만 갱신합니다.
},
resolve: { // resolve: import를 할 때 확장자를 생략할 수 있습니다.
extensions: ['.jsx', '.js'],
},
};
package.json
을 다음과 같이 수정해주었습니다. "scripts": {
"build": "webpack --mode=production",
"start": "webpack serve --mode=development"
},
npm i -D @babel/core @babel/cli @babel/preset-env @babel/preset-react babel-loader
@babel/core
: 바벨 설치@babel/cli
: 바벨 커맨드라인 도구@babel/preset-env
: ECMAScript2015+를 변환하는 프리셋(*프리셋이란 간단하게 말해서 '플러그인 모음'입니다.)@babel/preset-react
: 리액트 변환을 위한 프리셋 (jsx 관련 plugin도 포함되어 있습니다.)babel-loader
: babel-loader을 사용하면 바벨을 webpack으로 통합해서 사용할 수 있습니다.// webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.(js|jsx|ts|tsx)$/, // 해당 파일명으로 끝나면 babel-loader가 처리
exclude: /node_modules/, // node_modules는 대상에서 제외
loader: "babel-loader", // 바벨 로더 추가
},
],
},
}
// babel.config.js
module.exports = {
presets: [
'@babel/preset-env',
'@babel/preset-react',
],
};
npm -i -D eslint
npx eslint --init
--init
옵션으로 eslint 설정을 손쉽게 구성할 수 있습니다. 답변에 따라 그에 맞는 .eslintrc 파일을 자동으로 생성해줍니다.
npm i react react-dom
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>React App</title>
</head>
<body>
<div id="root"></div>
</body>
</html>
src/index.jsx
→ webpack.config.js의 entry에서 지정했던 파일 경로과 동일하게 생성해야 합니다!
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
const rootNode = document.getElementById('root');
ReactDOM.createRoot(rootNode).render(
<React.StrictMode>
<App />
</React.StrictMode>,
);
ReactDOM.render
대신 createRoot
를 사용하네요!src/App.jsx
import React from 'react';
export default function App() {
return (
<h1>MY REACT APP💗</h1>
);
}
:3