Language/React
React/TypeScript - 절대경로 지정
건담아빠
2022. 8. 2. 15:23
`~/` 에 대한 절대경로를 추가해 보자.
0. typescript 추가
# typescript 추가
$ yarn add --dev typescript @types/node @types/react @types/react-dom @types/jest
1. paths alias 설정
$ yarn add --dev react-app-rewired customize-cra
2. tsconfig.json
{
"extends": "./tsconfig.paths.json",
"compilerOptions": {
"target": "es5",
"lib": [
"dom",
"dom.iterable",
"esnext",
],
"allowJs": true,
"skipLibCheck": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"module": "esnext",
"moduleResolution": "Node",
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "react",
"outDir": "./dist/", // 아웃풋 될 경로
"noImplicitAny": true, // 음.. 암시적 any 타입의 표현식 및 선언에서 오류를 발생시킬지?
}
}
3. tsconfig.paths.json
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"~/*": [
"src/*"
]
}
}
}
4. config-overrides
const { override, addWebpackAlias } = require('customize-cra');
const path = require('path');
module.exports = override(
addWebpackAlias({
'~': path.resolve(__dirname, 'src'),
}),
);
5. 실행 스크립트 변경 (package.json)
{
...
"scripts": {
"start": "set PORT=3000 && react-app-rewired start",
"build": "react-app-rewired build",
"test": "react-app-rewired test",
"eject": "react-scripts eject"
},
...
}
6. Test.js
import React from 'react';
class Test extends React.Component {
render() {
return (
<React.Suspense>
<br/>
<br/>
<br/>
<div>test</div>
<br/>
<br/>
<br/>
</React.Suspense>
)
}
}
export default Test;
7. index.js -> index.tsx
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from '~/App';
import reportWebVitals from './reportWebVitals';
ReactDOM.render(
<React.StrictMode>
<App />
</React.StrictMode>,
document.getElementById('root')
);
reportWebVitals();
8. App.js -> App.tsx
import React from 'react';
// import logo from './logo.svg';
import './App.css';
import Test from '~/views/components/Test'
// const Title = ({ text }) => (
const Title: React.FC<{ text: string }> = ({ text }) => (
<h1>{text}</h1>
)
if (process.env.ONLY_DEV) {
console.log('This is only test be better development');
}
function App() {
return (
<div className="App">
<header className="App-header">
<Test />
<Title text="Hello World!!" />
<h2>{process.env.API_URL}</h2>
{/* <img src={logo} className="App-logo" alt="logo" /> */}
<p>
Edit <code>src/App.js</code> and save to reload.
</p>
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
</header>
</div>
);
}
export default App;
9. 확인
참고) paths alias
- 절대 경로를 사용하려면 tsconfig.json과 webpack의 설정을 건들여야 한다.
단순하게 tsconfig.json의 paths 설정을 바꾸면 된다 생각했지만 React 실행시 강제적으로 paths 설정을 지워 버린다. (충격...)
https://7stocks.tistory.com/127
- React + TypeScript 환경에서 절대경로 사용하기
https://velog.io/@hoo00nn/React-TypeScript-%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C-%EC%A0%88%EB%8C%80%EA%B2%BD%EB%A1%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0
- Alias solution for rewired create-react-app
https://githubhot.com/repo/mryhchan/react-app-rewire-alias