지난 글 1-1. React CRA가 최선이고 최고일까?에 이어지는 글입니다.
나는 CRA를 안쓰고 싶었으며, 빠른 빌드 도구인 esbuild 존재를 알았기 때문에 CRA 없이 React + TypeScript의 개발환경을 세팅하는 방법을 우선 알아보았다.
yarn과 npm의 차이는 https://joshua1988.github.io/vue-camp/package-manager/npm-vs-yarn.html#yarn 참고하면 좋을 것 같다.
> npm init
{
"name": "webpack-practice",
"version": "1.0.0",
"description": "",
"main": "index.tsx",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
// npm init 명령어는 package.json에 정보를 기록하고 프로젝트를 초기화한다
npm i typescript
npm i react react-dom
npm i -D @types/react @types/react-dom
npm i webpack webpack-cli webpack-dev-server -D
npm i -D babel-loader @babel/core
npm i -D @babel/preset-env @babel/preset-react @babel/preset-typescript
module.exports = {
presets: [
"@babel/preset-react",
"@babel/preset-env",
"@babel/preset-typescript",
],
};
/*
목적에 맞게 여러가지 플러그인(코드 변환을 처리하는 모듈)을 세트로 모아놓은 것을 “프리셋”이라고 한다.
babel-loader : JSX 및 ES6+ 문법을 트랜스파일링
@babel/core : 바벨의 코어
@babel/preset-react : 리액트의 JSX를 트랜스파일링
@babel/preset-env : ES6+ 코드를 ES5로 트랜스파일링하고 브라우저 폴리필을 자동화
*/
tsc --init
타입스크립트 컴파일러 옵션은 해당 문서를 참고하자
npm i -D html-webpack-plugin clean-webpack-plugin
const path = require('path');
const webpack = require('webpack');
module.exports = {
mode: 'development', // 배포용: production
devtool: 'eval', // 배포용: hidden-source-map *그냥 source-map을 쓰면 개발자 도구에 소스코드가 노출이 된다.
resolve: {
extensions: ['.jsx', '.js', '.tsx', '.ts'], // 웹팩에서 처리해주는 확장자들
},
entry: {
app: './app.tsx',
},
// modules, plugins에 적힌 처리과정을 client.tsx에 적용을 해서 최종적으로 app.js를 뽑아낸다(output).
module: {
rules: [
// babel대신에 tsc 설정.
{
test: /\.tsx?$/, // tsx나 ts파일을 발견하면
loader: 'ts-loader', // 해당 loader를 통해서 버전을 변환하겠다 는 뜻.
},
],
},
plugins: [], // 현재는 필요없어진 옵션이라고 한다.
output: {
filename: '[name].js', // or '[name].js'
path: path.join(__dirname, 'dist'), // npm webpack을 실행하면 client.tsx를 통해서 webpack처리 후 dist폴더가 생기고 그 안에 app.js가 들어있다.
},
};
//index.tsx
import ReactDOM from "react-dom";
import App from "./App";
ReactDOM.render(<App />, document.getElementById("root"));
//App.tsx
const App: React.FC = () => {
return (
<div>hello world</div>
)
};
export default App;
"scripts": {
"dev": "webpack-dev-server --mode=development --open --hot --progress",
"build": "webpack --mode=production --progress",
"start": "webpack --mode=development --progress"
},
참고 링크