webpackEnv 변수에 따라 development 또는 production 환경이 결정되며, 환경에 따라 번들링 및 최적화 방식이 달라집니다.
const env = getClientEnvironment(paths.publicUrlOrPath.slice(0, -1));
소스 맵을 생성할지 여부를 결정하는 변수입니다. 소스 맵은 개발 시 디버깅을 위해 중요한 역할을 하지만, 프로덕션 환경에서는 불필요하게 리소스를 소모할 수 있어 이 설정을 통해 소스 맵 생성 여부를 제어합니다.
const shouldUseSourceMap = process.env.GENERATE_SOURCEMAP !== 'false';
devtool: isEnvProduction
? shouldUseSourceMap
? 'source-map' // 프로덕션 모드에서 source-map을 생성
: false // 프로덕션 모드에서 source-map을 생성하지 않음
: isEnvDevelopment && 'cheap-module-source-map' // 개발 모드에서는 가벼운 소스 맵 사용
사용 목적: 개발자는 빌드된 코드를 디버깅할 때 원본 소스 코드와의 대응 관계를 알기 어려운데, 소스 맵은 이 문제를 해결합니다. 특히 프로덕션에서는 필요하지 않지만, 개발 환경에서는 디버깅을 위해 꼭 필요하므로 환경에 따라 다르게 설정하는 경우가 많습니다.
이 설정은 작은 크기의 웹팩 런타임 스크립트를 인라인으로 포함할지 여부를 결정합니다. 인라인 스크립트는 웹 요청을 줄이지만, 경우에 따라 성능에 영향을 줄 수 있으므로 환경에 따라 설정합니다.
const shouldInlineRuntimeChunk = process.env.INLINE_RUNTIME_CHUNK !== 'false';
웹팩 런타임 스크립트는 웹팩에서 번들된 모듈을 관리하고 로드하기 위해 생성하는 스크립트입니다. 이 스크립트는 번들된 모듈 간의 관계를 유지하고, 애플리케이션이 필요할 때 올바른 모듈을 호출할 수 있게 해줍니다.
isEnvProduction &&
shouldInlineRuntimeChunk &&
new InlineChunkHtmlPlugin(HtmlWebpackPlugin, [/runtime-.+[.]js/]),
단점: HTML 파일의 크기가 커질 수 있어 로딩 시간이 길어질 수 있습니다. 상황에 따라 별도 파일로 분리하는 것이 나을 때도 있습니다.
const emitErrorsAsWarnings = process.env.ESLINT_NO_DEV_ERRORS === 'true';
const disableESLintPlugin = 'true'; // 직접 true로 설정
const useTypeScript = fs.existsSync(paths.appTsConfig);
const useTailwind = fs.existsSync(path.join(paths.appPath, 'tailwind.config.js'));
JSX 트랜스폼은 React 17부터 도입된 기능으로, React.createElement를 직접 호출하지 않고도 JSX 문법을 사용할 수 있게 해줍니다. 이전에는 JSX 구문을 사용할 때마다 React 객체를 항상 import해야 했지만, 이 트랜스폼이 적용되면 JSX가 자동으로 React를 감지하여 호출합니다.
const hasJsxRuntime = (() => {
if (process.env.DISABLE_NEW_JSX_TRANSFORM === 'true') {
return false;
}
try {
require.resolve('react/jsx-runtime');
return true;
} catch (e) {
return false;
}
})();
프로젝트 경로와 환경 변수를 설정하여 다른 파일에서 이 설정들을 불러와 사용할 수 있도록 합니다.
CSS 및 SASS 파일의 로딩과 처리를 위해 개발 모드에서는 style-loader를, 프로덕션 모드에서는 MiniCssExtractPlugin.loader를 사용합니다.
이미지 파일, SVG, JS 파일 등에 대해 특정 크기 이상은 URL로, 그 외는 Data URL로 처리하여 요청 횟수를 줄이고 최적화를 합니다.
다양한 플러그인을 활용해 빌드를 최적화하고 성능을 향상합니다. 예를 들어, HTML 파일에 필요한 리소스를 자동으로 주입하는 HtmlWebpackPlugin, 번들 최적화를 위한 TerserPlugin, 그리고 CssMinimizerPlugin 등이 포함됩니다.
프로덕션 환경에서 코드 압축, 난독화 등을 통해 번들 크기를 줄이고, 개발 환경에서는 빠른 리빌드를 위한 캐싱 전략을 사용합니다.
빌드 후 생성된 파일의 저장 위치, 파일명 포맷 등을 설정하여 빌드된 파일이 올바르게 배포될 수 있도록 구성합니다.