npm i -D typescript ts-loader
ts-loader를 통해 모든 .ts 및 .tsx 파일을 로드한다.
{
"compilerOptions": {
"target": "ESNext", //ts 파일을 js 어떤 버전의 코드로 변환해줄지
"module": "ESNext", //js 파일 간 import 문법 구현시 어떤 문법 쓸지
// "useDefineForClassFields": true, if target is ES2022 or higher, including ESNext,
// "lib": ["DOM", "DOM.Iterable", "ESNext"], //js로 컴파일할 때 포함될 라이브러리 목록
"outDir": "./dist/", //js파일 아웃풋 경로 설정
"allowJs": true, //js 파일들 ts에서 import해서 쓸 수 있는지
"noUnusedParameters": true, //쓰지않는 파라미터 있으면 에러내기
"moduleResolution": "node", //모듈 해석 방법
"baseUrl": ".", //paths 사용시 필수
"paths": {
// 긴 상대 경로 피하는 방법
"@api/*": ["src/api/*"],
"@utils/*": ["src/utils/*"],
"@/*": ["src/*"]
},
"strict": true //강하게 타입을 정의. 아래 주석 처리한 옵션을 모두 활성화한 것과 같은 옵션
// "noImplicitAny": true, //any라는 타입이 의도치않게 발생할 경우 에러를 띄워주는 설정
// "strictNullChecks": true,
// "strictFunctionTypes": true,
// "strictBindCallApply": true,
// "strictPropertyInitialization": true,
// "noImplicitThis": true,
// "alwaysStrict": true,
},
"include": ["src", "**/*.ts"], //ts 적용할 파일 이름이나 패턴을 배열로 지정
"exclude": ["node_modules", "dist"] //컴파일에서 제외할 파일 및 디렉토리의 패턴
}
내 프로젝트의 환경에 맞게 설정해줬다. lib 옵션을 설정하지 않으면 target에 맞게 default 값을 ts가 알아서 지정해준다고 하여 제외하였다.
entry: {
main: './src/main.ts',
},
파일명 ts로 변경
{
test: /\.ts$/,
use: 'ts-loader',
exclude: /node_modules/,
},
ts-loader를 통해 모든 .ts
파일을 로드할 수 있도록 설정
resolve: {
extensions: ['.ts', '.js'],
alias: {
'@api': path.resolve(__dirname, './src/api'),
'@utils': path.resolve(__dirname, './src/utils'),
'@': path.resolve(__dirname, './src/'),
},
},
"build": "tsc && webpack"
Typescript를 적용하는 과정에서 에러를 만나 삽질했지만 결국 해결! main.ts 에 import한 파일들을 모두 찾을 수 없다는 에러가 있었다. 아래 사진은 상세 에러를 띄운 화면!
@
을 쓰는게 node_modules 안에서 특정 기능을 하는 다른 파일과 겹쳐 인식하지 못하는 건가 싶었고, 다른 문자로 바꿔서 시도해봤지만 실패.Field 'browser' doesn't contain a valid alias configuration
에 대해 검색해봤으나 해결할 만한 방법을 찾지 못함. 그러다가 main.ts에서 import 하는 파일들을 ts paths 설정이 아닌 상대경로로 바꿔주니 에러가 해결됨webpack typescript
의 키워드로 검색했고 typescript 에서 paths로 단축어로 경로를 지정한다면, webpack 에서도 설정을 해줘야함을 알게됨.//webpack.config.js
resolve: {
extensions: ['.ts', '.js'],
alias: {
'@api': path.resolve(__dirname, './src/api'),
'@utils': path.resolve(__dirname, './src/utils'),
'@': path.resolve(__dirname, './src/'),
},
},
원래 있던 extensions에 alias를 추가해주니 에러가 해결됐다.
2시간 삽질의 보람!!!!!!! 여러 프로그램을 사용할 때 하나의 기능을 사용하려면 여러 프로그램들을 모두 연결해줘야한다는 것을 깨달았다.