React 프로젝트를 시작할 때 필요한 개발 환경을 세팅해주는 도구로 React에서 제공해주고 있다.
모듈 번들러나 Babel 등 설정을 따로 하지 않고 아주 간편하게 이용할 수 있지만
추가적인 설정을 해야할 때는 CRA가 오히려 번거로울 수 있다.
이건 쉬우니까 패스!
npm init // 혹은 npm init -y
위의 명령어로 package.json이 생성된다.
package.json : 설치한 라이브러리 목록을 보여주는 파일
npm i react react-dom react-router-dom
DOM : Document Object Model, 웹 페이지를 이루는 요소(태그 등)를 JS가 이용할 수 있게 브라우저 내에서 트리 구조로 만든 객체 모델. 즉, DOM은 HTML, XML 등의 문서와 JS를 이어준다. 특히 리액트는 virtual DOM을 이용함.
바인딩 : 프로그램에 사용된 구성 요소의 실제 값 또는 프로퍼티를 결정짓는 행위
node_modules : 라이브러리들을 모아높은 폴더
npm i -D typescript @types/react @types/react-dom
tsc --init // ts가 전역으로 설치된 경우
node_moduels/.bin/tsc --init // ts가 해당 프로젝트에만 설치되어 있는 경우
위의 명령어로 tsconfig.json 파일이 생성된다. 필요없는 부분은 제거하고 사용하면 된다.
tsconfig.json : 해당 프로젝트를 컴파일 하기 위해 필요한 루트 파일들과 각종 컴파일러 옵션들을 설정한다. (JS의 jsconfig.json과 유사)
Webpack은 프로젝트 내의 모든 자바스크립트 파일들을 번들링하고 브라우저에서 돌아가도록 필요한 자원들을 준비해준다.
npm i -D webpack-cli webpack-dev-server html-webpack-plugin
npm i -D ts-loader // ts를 사용하는 경우에만
Babel은 자바스크립트 컴파일러이다. 현재 모든 브라우저가 ES6를 지원하지 않기 때문에 ES6를 지원하지 않기 때문에 ES6를 ES5로 변환시킬 필요가 있는데, Babel이 바로 그 역할을 해준다.
npm i -D babel-loader @babel/core @babel/preset-env @babel/preset-react
npm i -D @babel/preset-typescript
/* webpack.config.js */
const HtmlWebpackPlugin = require('html-webpack-plugin');
const path = require('path');
const webpack = require('webpack');
const prod = process.env.NODE_ENV === 'production';
module.exports = {
mode: prod ? 'production' : 'development',
devtool: prod ? 'hidden-source-map' : 'eval',
entry: './src/index.tsx',
devServer: {
port: 3000,
inline: true,
hot: true,
historyApiFallback: true,
publicPath: '/',
},
resolve: {
extensions: ['.js', '.jsx', '.ts', '.tsx'],
},
module: {
rules: [
{
test: /\.tsx?$/,
exclude: /(node_modules)/,
use: {
loader: ['babel-loader', 'ts-loader'],
options: {
presets: ["@babel/preset-react", ["@babel/preset-env", { targets: { node: "12" } }]]
}
}
},
],
},
output: {
publicPath: "/",
path: path.join(__dirname, '/dist'),
filename: 'bundle.js',
},
plugins: [
new webpack.ProvidePlugin({
React: 'react',
}),
new HtmlWebpackPlugin({
template: './src/index.html',
}),
new webpack.HotModuleReplacementPlugin(),
],
};
npm start, yarn start 처럼 react 서버를 실행시킬 때 사용하는 명령어를 커스텀해야한다.
/* package.json */
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "webpack serve --mode development --open --hot",
"build": "webpack --mode production",
"prestart": "npm build",
"start": "webpack --mode development"
},
위와 같이 항목을 추가시키면 된다. 프로젝트를 시작할 때는 아래의 명령어를 입력하면 된다.
npm run dev
src 폴더, plublic 폴더를 만들자.
/* App.tsx */
import React from 'react';
const App = () => <>Test</>;
export default App;
/* index.html */
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<div id="root"></div>
</body>
</html>
/* index.tsx */
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
const rootElement = document.getElementById('root');
ReactDOM.render(<App />, rootElement);