Notice
Recent Posts
Recent Comments
Link
250x250
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- current_date
- Effective Java
- regex
- 퀵소트
- git
- MySQL
- Node
- eslint
- migration
- spring
- Chunk
- REACT
- Spring Batch
- upgrade
- Regular expression
- spring cloud
- log_bin
- expire_logs_days
- REACTJS
- Webpack
- update
- JavaScript
- Effective Java 3/e
- 정규표현식
- log4j2
- nodejs
- java
- npm
- Express
- mysql 5.5
Archives
- Today
- Total
내 세상
[webpack] webpack-dev-server config 설정 (esbuild-loader, babel-loader) 본문
Technical/React
[webpack] webpack-dev-server config 설정 (esbuild-loader, babel-loader)
sga8 2024. 12. 6. 13:39728x90
반응형
webpack dev server 매우 느린 이슈로 인해 해결방안
1. babel-loader → esbuild-loader 변경
2. webpack config 수정
module.exports = {
mode: 'development',
entry: ['@babel/polyfill', './src/index.js'],
devtool: false,
optimization: {
providedExports: process.env.NODE_ENV === 'prod',
},
output: {
pathinfo: false,
filename: 'bundle.js',
path: path.resolve(__dirname + '/dist'),
publicPath: '/',
clean: true,
},
devServer: {
static: {
directory: path.join(__dirname, 'public'),
},
historyApiFallback: true,
// compress: true,
host: process.env.TEST_IP,
port: process.env.TEST_PORT,
https: {
cert: process.env.TEST_CERT,
key: process.env.TEST_KEY,
},
proxy: {
'/test': {
target: `${imsiurl}`,
changeOrigin: true,
secure: false,
}
},
},
cache: { type: process.env.NODE_ENV !== 'prod' ? 'memory' : 'filesystem' },
module: {
rules: [
{
test: /\.(js|jsx|ts|tsx)$/,
exclude: /node_modules/,
use: {
loader: 'esbuild-loader',
options: {
loader: 'jsx',
target: 'es2015',
},
},
},
{
test: /\.html$/,
use: [
{
loader: 'html-loader',
options: { minimize: true },
},
],
},
{
test: /\.(css|scss)$/,
use: [
'style-loader',
'css-loader',
{
loader: require.resolve('sass-loader'),
options: {
sourceMap: true,
},
},
],
},
{
test: /\.(png|jpe?g|gif|svg|webp)$/i,
use: {
loader: 'file-loader',
options: {
name: '[name].[contenthash].[ext]',
},
},
},
],
},
resolve: {
extensions: ['.js'],
alias: {
'@src': path.resolve(__dirname, 'src/'),
'@resource': path.resolve(__dirname, 'public/'),
},
},
plugins: [
(() => {
return new Dotenv({
path: `./.env.${process.env.NODE_ENV}`,
})
})(),
new HtmlWebPackPlugin({
template: './public/index.html',
filename: 'index.html',
}),
],
}
cache 옵션
- true/false (default: true)
- cache.type: memory(default) / filesystem
- cache.compression: 압축 여부
- cache.maxAge: 생명 주기
devtool 옵션
- eval-sourc-map
- fast build / high debug quality
- 개발 환경 용도 / 빌드 속도가 중요하면서도 디버깅 품질을 유지하고 싶을 때 적합
- 빌드 시간: 빠름
- 디버깅 품질: 높음
- source-map
- highest debug quality
- 프로덕션 환경 / 디버깅 품질이 중요할 때 사용
- 빌드 시간: 느림
- 디버깅 품질: 매우 높음
- false
- fastest build / No Debug
- 프로덕션 환경 / 보안상 장점
- 빌드 시간: 매우 빠름
- 디버깅 품질: 없음
providedExports 옵션
- true/false (Default: true)
- Tree Shaking: 사용되지 않는 코드를 제거하는 기법. 최종 번들 크기를 줄여줌.
- 트리 쉐이킹 최적화: providedExports 옵션을 사용하면, Webpack은 해당 모듈이 제공하는 특정 내보내기(export) 항목들을 이미 알고 있기 때문에, 어떤 부분이 실제로 사용되지 않는지 추적하여 제거할 수 있습니다. 이를 통해 번들 크기를 더욱 최적화할 수 있습니다.
- providedExports 옵션의 작동 방식:
- 내보내기(export) 확인: Webpack은 모듈이 제공하는 내보내기(export) 항목을 알아냅니다.
- 트리 쉐이킹: 이후 트리 쉐이킹을 통해 사용되지 않는 내보내기 항목을 제거합니다.
- 예를 들어, 특정 함수나 객체가 실제 코드에서 사용되지 않으면, 이를 최종 번들에서 제거합니다.
- 최적화: 트리 쉐이킹은 번들 크기를 줄이고, 불필요한 코드를 배제하여 로딩 성능을 향상시킵니다.
- 예시와 더 나아가:providedExports와 트리 쉐이킹:참고:
- providedExports 옵션은 트리 쉐이킹을 더 효율적으로 작동하게 만들어, 번들 크기를 최소화하는 데 기여합니다.
- 이 옵션은 ES 모듈 기반으로 최적화되므로, ES 모듈 시스템을 사용해야 효과적으로 작동합니다.
- 이 옵션은 기본적으로 Webpack 4 이상에서 트리 쉐이킹을 지원하기 위해 활성화됩니다. providedExports가 true로 설정되면, Webpack은 해당 모듈에서 제공하는 export 항목을 알고 있게 되고, 실제로 사용되지 않은 코드들은 트리 쉐이킹을 통해 번들에서 제거할 수 있습니다.
- 만약 lodash와 같은 라이브러리를 사용하는 경우, providedExports를 설정하면 lodash에서 실제로 사용된 메소드만 번들에 포함시키고, 사용되지 않은 메소드는 제거할 수 있습니다. 이로 인해 최종 번들의 크기가 줄어들게 됩니다.
Trouble Shooting
- ReferenceError: React is not defined
- esbuild가 암시적인 React 사용을 감지못해 발생하는 에러
- index.js / app.js 파일처럼 최상단 위치의 파일에서 아래처럼 global 선언해서 해결
import React from 'react';
global.React = React;
728x90
반응형
'Technical > React' 카테고리의 다른 글
[React] React-leaflet rectangle gradient 적용 방법 (0) | 2025.01.09 |
---|---|
[React] React-Select 메뉴 클릭 시, 드롭다운 메뉴 뒤 클릭 이슈 (0) | 2025.01.07 |
[React] node-sass error (0) | 2023.01.04 |
[React] MUI ClickAwayListener (0) | 2022.12.23 |
[React] Copy to Clipboard (0) | 2022.11.29 |