빌드한 리액트 앱을 최상위 경로가 아닌 서브 디렉터리에 넣고 접속해보면 오류와 함께 아무것도 뜨지 않는다.
create-react-app을 사용하면 기본적으로 결과물들이 최상위 주소 기준으로 만들어져서 그렇다. 간단한 설정으로 해결할 수 있다.
package.json 파일에 아래 한 줄을 추가한다.
{
// 생략
},
"homepage": "."
}
그리고 다시 빌드하면 상대 경로 기준으로 만들어져서 어느 디렉터리에서든 잘 실행된다.
그런데 react-router에서 <Link>
로 주소를 이동할 때 무조건 최상위 경로 기준으로 이동해서 주소 이동 후 새로고침하면 엉뚱한 곳으로 접속되는 문제가 있었다. 해결법을 찾아봤더니 basename
을 지정해서 라우팅할 때 특정 경로를 붙여줄 수 있었다.
하지만 basename
은 상대 경로를 지원하지 않아서 결국엔 서브 디렉터리 명을 하드코딩 해줘야 한다. 경로 하드코딩 없이 어디서든 사용할 수 있게 만들고 싶었는데 방법을 찾지 못했다...
그래서 그나마 타협점으로 환경변수를 사용하기로 했다. PUBLIC_URL
환경변수는 위에서 추가한 homepage
와 같은 역할을 한다. 따라서 앞에서 추가한 homepage
는 다시 원래대로 지워도 된다.
<BrowserRouter>
<App />
</BrowserRouter>
그리고 위 부분을 찾아 아래처럼 basename={process.env.PUBLIC_URL}
을 추가한다.
<BrowserRouter basename={process.env.PUBLIC_URL}>
<App />
</BrowserRouter>
이제 빌드 스크립트를 수정하든지, 직접 환경변수를 지정하든지 해서 PUBLIC_URL
환경변수에 하위 경로를 넣고 빌드하면 리액트 실행 문제와 react-router 라우트 문제 모두 해결된다. PUBLIC_URL
에 지정한 주소에서만 작동한다는 게 흠...
'프로그래밍 > React' 카테고리의 다른 글
CRA 없이 React 개발환경 구축하기 (Rollup편) (0) | 2022.03.05 |
---|---|
스토리북에서 CSS Modules 사용하기 (0) | 2022.02.05 |
CRA 없이 React 개발환경 구축하기 (Parcel편) (0) | 2022.01.22 |
We no longer support global installation of Create React App 오류 해결법 (0) | 2022.01.05 |
CRA 없이 React 개발환경 구축하기 (Webpack편) (1) | 2021.12.11 |
부모 컴포넌트에서 자식 컴포넌트 함수 실행하기 (0) | 2021.08.13 |
함수형 컴포넌트에서 forceUpdate 구현 (0) | 2021.07.02 |
아파치 웹서버에 리액트 라우터 앱 올리기 (0) | 2021.05.22 |