๐Ÿ› /Dev Tool

[gh-pages] CRA ๋ฐฐํฌ ์‹œ homepage ๊ฒฝ๋กœ๋ฅผ ์ฐธ์กฐํ•˜์ง€ ๋ชปํ•  ๋•Œ

ํ•œ๋‚˜ 2021. 3. 16. 12:38

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"
]
}
}
view raw package.json hosted with โค by GitHub

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;
view raw Router.js hosted with โค by GitHub

์›๋ž˜๋Š” <Router>๊ฐ€ ์ตœ์ƒ๋‹จ์— ์œ„์น˜ํ•˜๋Š”๋ฐ ์ด๋ฅผ <BrowserRouter basename={process.env.PUBLIC_URL}>๋กœ ๊ฐ์‹ธ์ฃผ์—ˆ๋‹ค.

.env

// root
PUBLIC_URL=https://hannah26hannah.github.io/react-twitter-clone/

๋ฃจํŠธ ๋ฐ”๋กœ ์•„๋ž˜์—๋Š” Firebase ์„ค์ • ํŒŒ์ผ์„ ์œ„ํ•œ ํ‚ค๊ฐ€ ๋‹ด๊ธด .env ํŒŒ์ผ์ด ์žˆ๊ณ , ์—ฌ๊ธฐ์— ์œ„์ฒ˜๋Ÿผ PUBLIC_URL์„ ์„ค์ •ํ•ด์ฃผ์—ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๊ณ  ๋‚˜๋‹ˆ๊นŒ ์ •์ƒ์ ์œผ๋กœ ๋นŒ๋“œ๋˜๊ณ  ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

Reference

2๋‹ฌ ์ „์— ๊ฒŒ์‹œ๋œ ์Šคํƒ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ๋‹ต๋ณ€์„ ์ฐธ๊ณ ํ–ˆ๋‹ค.