gh-pages๋ก ๋ฆฌ์กํธ ์ฑ์ ๋ฐฐํฌํ ๋ URL ์ค์ ์ package.json์ homepages๋ก ์ถ๊ฐํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ ๋ผ์ ๊ฒ์ํ๋ค๊ฐ ๋์ค์ ๋ ์์๊น๋ด ๊ธฐ๋ก์ผ๋ก ๋จ๊ฒจ๋๋ค ..^^
package.json
{ | |
"name": "twitter", | |
"homepage": "https://hannah26hannah/github.io/react-twitter-clone/", | |
"version": "0.1.0", | |
"private": true, | |
"dependencies": { | |
"@fortawesome/fontawesome-svg-core": "^1.2.34", | |
"@fortawesome/free-brands-svg-icons": "^5.15.2", | |
"@fortawesome/free-regular-svg-icons": "^5.15.2", | |
"@fortawesome/free-solid-svg-icons": "^5.15.2", | |
"@fortawesome/react-fontawesome": "^0.1.14", | |
"@testing-library/jest-dom": "^5.11.9", | |
"@testing-library/react": "^11.2.5", | |
"@testing-library/user-event": "^12.8.3", | |
"firebase": "^8.3.0", | |
"gh-pages": "^3.1.0", | |
"node-sass": "^5.0.0", | |
"react": "^17.0.1", | |
"react-dom": "^17.0.1", | |
"react-router-dom": "^5.2.0", | |
"react-scripts": "4.0.3", | |
"uuid": "^8.3.2", | |
"web-vitals": "^1.1.0" | |
}, | |
"scripts": { | |
"start": "react-scripts start", | |
"build": "react-scripts build", | |
"predeploy" : "npm run build", | |
"deploy": "gh-pages -d build" | |
}, | |
"eslintConfig": { | |
"extends": [ | |
"react-app", | |
"react-app/jest" | |
] | |
}, | |
"browserslist": { | |
"production": [ | |
">0.2%", | |
"not dead", | |
"not op_mini all" | |
], | |
"development": [ | |
"last 1 chrome version", | |
"last 1 firefox version", | |
"last 1 safari version" | |
] | |
} | |
} |
gh-pages๋ฅผ installํ ๋ค script์ predeploy์ deploy ๋ช ๋ น์ด๋ฅผ ๋ฃ์ด์ค ๋ค "homepage"์ ๋ด ๊นํ ์์ด๋ + github.io + ํ์ฌ ์ ์ฅ์ ์ด๋ฆ์ ๋ฃ์ด์ค ๊ฒ๊น์ง๋ ๋ค๋ฅธ ํํ ๋ฆฌ์ผ์ ๋์ ์๋ ๋ด์ฉ๊ณผ ๋์ผํ๊ฒ ์งํํ๋ค.
๊ทธ๋ฐ๋ฐ ์๊พธ ๋น๋๋ ํ์ผ์ ๋ฒ๋ค๋ css๋ js ํ์ผ์ ์ฐธ์กฐํ๋ ๊ฒฝ๋ก๊ฐ /github.io...
๋ก ์์ํ๊ณ ์์๋ค. ์ฆ, github io๋ฅผ ๋ฃ์ ์์ ํ URL์ ์ฐพ์ง ๋ชปํ๊ณ ์์๋ค. React-router ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋๋ ๋น์ทํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ browser-router ์ชฝ ์ด์์ธ๊ฐ ์ถ์ด์ ์๋์ฒ๋ผ Router.js ํ์ผ์ ์ผ๋ถ ์์ ํด์ฃผ์๋ค.
Router.js
import React from 'react'; | |
import {HashRouter as Router, Route, Switch} from 'react-router-dom'; | |
import Profile from 'routes/Profile'; | |
import Auth from '../routes/Auth'; | |
import Home from '../routes/Home'; | |
import Navigation from './Navigation'; | |
import { BrowserRouter } from 'react-router-dom'; | |
const AppRouter = ({refreshuser, isLoggedIn, userObj, setIsLoggedIn}) => { | |
return ( | |
<BrowserRouter basename={process.env.PUBLIC_URL}> | |
<Router> | |
{isLoggedIn && <Navigation userObj={userObj} />} | |
<Switch> | |
{isLoggedIn ? | |
<> | |
<Route exact path='/'> | |
<Home userObj={userObj} /> | |
</Route> | |
<Route exact path='/profile'> | |
<Profile userObj={userObj} setIsLoggedIn={setIsLoggedIn} refreshuser={refreshuser} /> | |
</Route> | |
</> : | |
<> | |
<Route exact path='/'> | |
<Auth /> | |
</Route> | |
</> | |
} | |
</Switch> | |
</Router> | |
</BrowserRouter> | |
) | |
} | |
export default AppRouter; |
์๋๋ <Router>
๊ฐ ์ต์๋จ์ ์์นํ๋๋ฐ ์ด๋ฅผ <BrowserRouter basename={process.env.PUBLIC_URL}>
๋ก ๊ฐ์ธ์ฃผ์๋ค.
.env
// root
PUBLIC_URL=https://hannah26hannah.github.io/react-twitter-clone/
๋ฃจํธ ๋ฐ๋ก ์๋์๋ Firebase ์ค์ ํ์ผ์ ์ํ ํค๊ฐ ๋ด๊ธด .env ํ์ผ์ด ์๊ณ , ์ฌ๊ธฐ์ ์์ฒ๋ผ PUBLIC_URL์ ์ค์ ํด์ฃผ์๋ค.
์ด๋ ๊ฒ ํ๊ณ ๋๋๊น ์ ์์ ์ผ๋ก ๋น๋๋๊ณ ๋ฐฐํฌํ ์ ์์๋ค.
Reference
2๋ฌ ์ ์ ๊ฒ์๋ ์คํ์ค๋ฒํ๋ก์ฐ ๋ต๋ณ์ ์ฐธ๊ณ ํ๋ค.