-
Notifications
You must be signed in to change notification settings - Fork 8
[TS] Webpack config
https://webpack.kr/guides/asset-modules/
-
asset/resource
는 별도의 파일을 내보내고 URL을 추출합니다. 이전에는file-loader
를 사용하여 처리할 수 있었습니다. -
asset/inline
은 애셋의 data URI를 내보냅니다. 이전에는url-loader
를 사용하여 처리할 수 있었습니다. -
asset/source
는 애셋의 소스 코드를 내보냅니다. 이전에는raw-loader
를 사용하여 처리할 수 있었습니다. -
asset
은 data URI와 별도의 파일 내보내기 중에서 자동으로 선택합니다. 이전에는 애셋 크기 제한이 있는url-loader
를 사용했습니다.
file-loader를 없애고 다음 코드로 바꾸었다.
asset이 4kb보다 크면 asset/resource로 바뀌어 별도의 파일로 빌드된다.
4kb보다 작으면 asset/inline으로 바뀌어 bundle.js 파일 안에 이미지 파일이 빌드된다.
우리가 현재 쓰는 이미지들은 1kb보다 작으므로 build해도 별도의 이미지 파일 안 생김.
{
test: /\.(png|svg|jpe?g|gif|webp)$/i,
type: 'asset',
parser: {
dataUrlCondition: {
maxSize: 4 * 1024, // 4kb
},
},
},
dotenv가 없다면?
Uncaught ReferenceError: process is not defined
사용법
const dotenv = require('dotenv');
dotenv.config();
module.exports = {
plugins: [
new webpack.DefinePlugin({
'process.env': JSON.stringify(process.env),
}),
],
}
해결 →
webpack.config 파일에서는 dotenv 관련 설정을 하지 않는 것으로 바꿈.
// webpack.dev.js
const webpack = require('webpack');
const { merge } = require('webpack-merge');
const { HotModuleReplacementPlugin } = require('webpack');
const common = require('./webpack.config.js');
const dotenv = require('dotenv');
module.exports = () => {
dotenv.config({ path: './.env.development' });
return merge(common, {
mode: 'development',
devtool: 'cheap-module-source-map',
plugins: [
new HotModuleReplacementPlugin(),
new webpack.DefinePlugin({
'process.env': JSON.stringify(process.env),
}),
],
module: {
rules: [
{
test: /\.(jpe?g|png|gif)$/i,
type: 'asset/inline',
},
],
},
});
};
// webpack.prod.js
const webpack = require('webpack');
const { merge } = require('webpack-merge');
const common = require('./webpack.config.js');
const dotenv = require('dotenv');
module.exports = () => {
dotenv.config({ path: './.env.development' });
return merge(common, {
mode: 'production',
devtool: 'hidden-source-map',
plugins: [
new webpack.DefinePlugin({
'process.env': JSON.stringify(process.env),
}),
],
});
};
//wabpack.prod.js
const { merge } = require('webpack-merge');
const common = require('./webpack.config.js');
const Dotenv = require('dotenv-webpack');
module.exports = () => {
return merge(common, {
mode: 'production',
devtool: 'hidden-source-map',
plugins: [
new Dotenv({
path: './.env.production',
systemvars: true,
}),
],
});
};
- 해결
현재 두가지 요소가 함께 적용되어있음.
그러나 cloudFront의 캐시 무효화 관련하여 하나씩 실험은 못 해본 상태
첫번째 요소 : ignoreStub : true → [공식문서의 옵션](https://www.npmjs.com/package/dotenv-webpack)
두번째 요소 : process 패키지 설치 후 browser환경에 node의 process 모듈 추가([관련 블로그](https://leo-xee.github.io/Error/react-webpack-process/), [스택오버플로우](https://stackoverflow.com/questions/65018431/webpack-5-uncaught-referenceerror-process-is-not-defined))
const webpack = require('webpack');
const { merge } = require('webpack-merge');
const common = require('./webpack.config.js');
const Dotenv = require('dotenv-webpack');
module.exports = () => {
return merge(common, {
mode: 'production',
devtool: 'hidden-source-map',
plugins: [
new Dotenv({
path: './.env.production',
systemvars: true,
safe: true,
ignoreStub: true,
}),
new webpack.ProvidePlugin({
process: 'process/browser.js',
}),
],
});
};
배경색만 적용이 되고 아무 에러, 로드가 없음
→ 배경색만 적용되는 것은 css global로 인한 것이고, bundle.js 혹은 라우팅이 잘못 되고 있다고 추측함.
github pages와 달리 aws로 배포할 때는 react-router의 baseName을 설정해 줄 필요가 없다. 해당 라인을 제거하였다.
{ basename: process.env.REACT_APP_BASE_URL },
[https://velog.io/@leehaeun0/CRA-환경에서-배포-시-.env-분기하기-feat.-env-cmd](https://velog.io/@leehaeun0/CRA-%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C-%EB%B0%B0%ED%8F%AC-%EC%8B%9C-.env-%EB%B6%84%EA%B8%B0%ED%95%98%EA%B8%B0-feat.-env-cmd)
나중에 webpack 최적화
cache: {
type: env.dev ? 'memory' : 'filesystem',
buildDependencies: {
config: [__filename],
},
idleTimeout: 2000,
},
만약 dotenv 패키지를 쓴다면?
const webpack = require('webpack');
const { merge } = require('webpack-merge');
const { HotModuleReplacementPlugin } = require('webpack');
const common = require('./webpack.config.js');
const Dotenv = require('dotenv-webpack');
// const dotenv = require('dotenv');
module.exports = () => {
// dotenv.config({ path: './.env.development' });
return merge(common, {
mode: 'development',
devtool: 'cheap-module-source-map',
plugins: [
new HotModuleReplacementPlugin(),
new Dotenv({
path: './.env.development',
}),
// new webpack.DefinePlugin({
// 'process.env': JSON.stringify(process.env),
// }),
],
module: {
rules: [
{
test: /\.(jpe?g|png|gif)$/i,
type: 'asset/inline',
},
],
},
});
};
- 백엔드 코드 컨벤션
- 백엔드 기술 스택 및 선정 이유
- 각종 인스턴스 설정 파일 및 구성 위치 가이드
- ERD (24.09.27)
- 백엔드 CI CD 동작 프로세스
- 로컬 DB 환경 설정
- 백엔드 로깅 전략
- 백엔드 로그 모니터링 구성도
- 스프링 메트릭 모니터링 구성도
- Flyway 로 스키마 관리
- 코드잽 서버 구성도
- Git Submodule 사용 메뉴얼
- 프론트엔드 코드 컨벤션
- 프론트엔드 기술 스택 및 선정 이유
- 프론트엔드 서비스 타겟 환경 및 브라우저 지원 범위 선정
- 프론트엔드 모니터링 및 디버깅 환경 구축
- 프론트엔드 테스트 목록
- 프론트엔드 라이브러리 기술 검토
- 프론트엔드 개발서버, 운영서버 빌드 및 배포 환경 구분
- 목표했던 타겟 환경과 디바이스에서 서비스 핵심 기능 동작 확인
- 프론트엔드 접근성 개선 보고서
- EC2 로그 확인 방법
- VSCode를 통한 EC2 인스턴스 SSH 연결 방법
- 터미널을 통한 EC2 인스턴스 SSH 연결 방법
- NGINX 설정 파일 접근 및 적용 방법
- DB 접속 및 백업 방법
- [QA] 배포 전 체크리스트
- CI 파이프라인 구축
- CD 파이프라인 구축
- 백엔드 CI CD 트러블슈팅
- Lombok Annotation Processor 의존성을 추가한 이유
- 2차 스프린트 기준 ERD
- DTO 검증하기
- ProblemDetail
- Fork된 레포지토리 PR에서 CI Secrets 접근 문제 해결
- AWS CloudWatch 모니터링
- 스프링 메트릭 모니터링 구축 방법
- 로깅과 Logback에 대해 알아보아요.
- 백엔드 CD 파이프라인 Ver.2
- 요청, 응답 로그에 correlationId 를 추가하자!
- 3차 스프린트 기준 ERD
- 더미데이터 생성하고 실행하기
- 쿼리 성능 개선 결과
- 테이블별 인덱스 설정 목록
- 사용자 증가 시 발생할 수 있는 문제 상황과 개선 방안
- k6를 사용한 서버 부하 테스트
- 6차 스프린트 기준 ERD
- Query Performance Improvement Results
- 테스트 전략 및 CI 설정
- CI CD 구조
- 배포 전, 로컬에서 로그인 기능 포함 테스트해보는 법
- stylelint 적용기
- 내 작업 브랜치 중간에 Merge된 동료의 작업물을 넣고 싶다면 pull vs rebase
- [TS] Webpack config
- [TS] Webpack 환경에서 MSW v2 이슈
- [TS] webpack에서 react‐router‐dom 적용 안됨
- 2024.07.28 새 기획 회의
- 2024.07.26 2차 데모데이 후 회의
- 2024.07.11 백엔드 논의 좀 할게요
- 2024.07.11 백엔드 ERD 회의
- 2024.07.09 깃 브랜치 전략, PR 템플릿 회의
- 2024.07.03 주제 선정 회의
- 2023.07.03 팀빌딩데이 킥오프 회의
- 2023.08.07 3차 스프린트 중간회고