-
Notifications
You must be signed in to change notification settings - Fork 2
Webpack, Babel, TypeScript, React 기본 설정
윤정민 edited this page Jul 23, 2023
·
12 revisions
예제 레포지토리를 참고하세요!
npm i -D webpack webpack-cli webpack-dev-server
webpack.common.js
const path = require('path');
module.exports = {
// 빌드 환경 - 'development', 'production', 'none'
mode: 'development',
// 번들링 시작 진입점
entry: {
main: './src/index.tsx',
},
// 번들링 결과물
output: {
filename: '[name].bundle.js',
// ** 절대 경로로 설정해야됨
path: path.resolve(__dirname, 'dist'),
clean: true,
},
// 로더
module: {},
// 플러그인
plugins: [],
// 모듈을 해석하는 방식
resolve: {
// 탐색할 확장자
extensions: ['.tsx', '.ts', '.jsx', '.js'],
},
};
webpack.dev.js
// webpack 설정을 덮어써서 통합시킴
const { merge } = require('webpack-merge');
const common = require('./webpack.common.js');
module.exports = merge(common, {
mode: 'development',
// webpack-dev-server 설정
devServer: {
// History API를 사용할 때, 404 리스폰스로 index.html을 제공.
historyApiFallback: true,
// 개발 서버를 시작할 때 브라우저를 염.
open: true,
},
});
webpack.prod.js
const { merge } = require('webpack-merge');
const common = require('./webpack.common.js');
module.exports = merge(common, {
mode: 'production',
});
{
"scripts": {
"start": "webpack serve --config webpack.dev.js --progress",
"build": "webpack --config webpack.prod.js --progress"
}
}
- serve : webpack-dev-server 실행
- --config : config 파일 지정
- --progress : 진행 상황 표시
webpack
npm i -D @babel/core @babel/preset-env @babel/preset-react core-js
babel.config.js
module.exports = {
presets: [
[
'@babel/preset-env',
{
// 브라우저 지원 범위
targets: {
chrome: '51',
},
// 폴리필 방식
useBuiltIns: 'entry',
// core-js 버전
corejs: '3.31.0',
},
],
['@babel/preset-react'],
],
};
- 타입체킹을 해주지 않음.
npm i -D babel-loader ts-loader html-webpack-plugin typescript
webpack.common.js
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
mode: 'development',
// ...
module: {
rules: [
{
test: /\.tsx?$/,
// ts-loader -> babel-loader 순으로 실행 됨
use: ['babel-loader', 'ts-loader'],
exclude: /node_modules/,
},
],
},
plugins: [
new HtmlWebpackPlugin({
// public/index.html 파일을 사용함. 절대 경로, 상대 경로 모두 가능
template: path.resolve(__dirname, 'public/index.html'),
}),
],
// ...
};
tsconfig.json
{
"compilerOptions": {
"target": "ES6",
"lib": ["DOM", "DOM.Iterable", "ES2023"],
"jsx": "react-jsx",
"module": "ESNext",
"moduleResolution": "Node",
"resolveJsonModule": true,
"allowJs": true,
"isolatedModules": true,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"strict": true,
"noFallthroughCasesInSwitch": true,
"skipLibCheck": true
},
"include": ["src"]
}
npm i react react-dom
npm i -D @types/react @types/react-dom