λΉλ λ° λ°°ν¬μ νμμ± π§©
μ λΉλκ° νμνκ°μ? π
- μΉλΈλΌμ°μ λ HTML, CSS, JSλ§ ν΄μ κ°λ₯ π»
- Reactμ JSX, state λ±μ λΈλΌμ°μ κ° μ§μ μ΄ν΄ν μ μμ β
- λΉλ κ³Όμ μ ν΅ν΄ λΈλΌμ°μ μΉνμ μΈ νμΌλ‘ λ³ν νμ π
- λ³νλ νμΌμ μλ²μ μ¬λ €μΌ μ¬μ©μκ° μ κ·Ό κ°λ₯ π
λ°°ν¬ μ 체ν¬μ¬ν β
νλ‘μ νΈ νμΈ π
- μ½μ/ν°λ―Έλμ μλ¬κ° μμ΄μΌ ν¨ (κ²½κ³ λ 무μ κ°λ₯) β οΈ
- νμ κ²½λ‘ λ°°ν¬ μ μΆκ° μ€μ νμ π
νμ κ²½λ‘ λ°°ν¬ μ€μ π οΈ
create-react-app νλ‘μ νΈ
// package.json
{
"homepage": "/blog", // λ°°ν¬ν κ²½λ‘ μΆκ°
// κΈ°ν μ€μ ...
}
- React Router μ¬μ© μ
basename μμ± μΆκ° κΆμ₯ π
Vite νλ‘μ νΈ
export default defineConfig({
base: '/blog'
})
/blog/ κ²½λ‘λ μ λ κ²½λ‘, ./λ μλ κ²½λ‘λ‘ CSS νμΌ μ°Έμ‘° π
λΉλ μμ
κ³Όμ ποΈ
λΈλΌμ°μ νΈν νμΌ μμ± π
- ν°λ―Έλμμ νλ‘μ νΈ ν΄λλ‘ μ΄λ
npm run build λͺ
λ Ήμ΄ μ€ν
dist λλ build ν΄λμ λ³νλ νμΌ μμ±
index.htmlμ΄ λ©μΈ νμ΄μ§ π
GitHub Pagesλ‘ λ°°ν¬νκΈ° π
리ν¬μ§ν 리 μμ± π
- GitHub λ‘κ·ΈμΈ ν New Repository ν΄λ¦
- Repository μ΄λ¦μ
μ¬μ©μλͺ
.github.ioλ‘ μ€μ (μ€μ!) π
- README νμΌ μμ± μ²΄ν¬ ν 리ν¬μ§ν 리 μμ±
λΉλ νμΌ μ
λ‘λ π€
- μμ±λ 리ν¬μ§ν λ¦¬λ‘ μ΄λ
dist λλ build ν΄λ λ΄λΆ νμΌμ λλκ·Έμ€λλ‘μΌλ‘ μ
λ‘λ (ν΄λ μμ²΄κ° μλ λ΄μ©λ¬Όλ§!)
- μ΄λ‘μ Commit λ²νΌ ν΄λ¦
- μ½ 5λΆ ν
https://μ¬μ©μλͺ
.github.ioλ‘ μ μνμ¬ λ°°ν¬ νμΈ π
λ€λ₯Έ μ΄λ¦μ 리ν¬μ§ν 리 μ¬μ©νκΈ° (μ νμ¬ν) π
- λΉλ μ νμ κ²½λ‘ μ€μ (0λ² νλͺ© μ°Έκ³ )
- μ 리ν¬μ§ν 리 μμ± (μ΄λ¦ μμ λ‘κ² μ€μ )
- λΉλ νμΌ μ
λ‘λ
- 리ν¬μ§ν 리 Settings β Pagesμμ Sourceλ₯Ό
Noneμμ mainμΌλ‘ λ³κ²½
μ¬μ©μλͺ
.github.io/리ν¬μ§ν 리μ΄λ¦μΌλ‘ μ μ κ°λ₯
μμ£Ό 묻λ μ§λ¬Έ (FAQ) β
404 μ€λ₯κ° λ°μν λ π«
- λ°°ν¬ ν 5λΆ μ΄μ κΈ°λ€λ €λ³΄κΈ° β±οΈ
Ctrl + Shift + Rλ‘ κ°λ ₯ μλ‘κ³ μΉ¨ μλ π
- 리ν¬μ§ν 리 μ΄λ¦μ΄
μ¬μ©μλͺ
.github.io νμμΈμ§ νμΈ π
μ
λ°μ΄νΈ λ°©λ² π
- μ½λ μμ ν λ€μ
npm run build μ€ν
- μμ±λ νμΌμ λ€μ μ
λ‘λνλ©΄ λ¨
- λΉλν λλ§λ€ CSS, JS νμΌλͺ
μ΄ μλ λ³κ²½λμ΄ μΊμ λ¬Έμ ν΄κ²° π§Ή
νμΌ μ΄λ¦ μ μ§νκΈ° π
public ν΄λμ λ£μ νμΌμ λΉλ νμλ μ΄λ¦κ³Ό κ²½λ‘ μ μ§
- κ°λ° μ
/κ²½λ‘λ‘ import κ°λ₯
μΌλΆ νμΌμ΄ λ‘λλμ§ μμ λ π
- λΉλ μλ¬ μ¬λΆ νμΈ
- νμ ν΄λ λ°°ν¬ μ€μ νμΈ
- κ°λ°μ λꡬμμ νμΌ κ²½λ‘ νμΈ
λΌμ°ν
κ΄λ ¨ 404 μ€λ₯ π
- GitHub Pagesλ SPA λΌμ°ν
μ μ νμ΄ μμ
- ν΄κ²°μ±
:
- μλ² μ€μ (GitHub Pagesμμλ λΆκ°λ₯) β
- HashRouter μ¬μ© (
# κΈ°νΈκ° URLμ μΆκ°λ¨) β
μΆκ° μ 보 λ° ν π‘
μ¬μ©μ μ μ λλ©μΈ μ°κ²°νκΈ° π
- λλ©μΈ μ 곡μ
체μμ λλ©μΈ ꡬ맀
- GitHub 리ν¬μ§ν 리 β Settings β Pagesμμ Custom domain μ€μ
- DNS μ 곡μ
체μμ λ€μ μ€μ μΆκ°:
- A λ μ½λ:
@ β 185.199.108.153 (GitHub IP)
- CNAME λ μ½λ:
www β μ¬μ©μλͺ
.github.io
- 리ν¬μ§ν 리μ
CNAME νμΌ μΆκ° (λ΄μ©μ λλ©μΈλͺ
λ§)
- μ€μ μλ£ ν HTTPS μ μ© μ²΄ν¬
SPA λΌμ°ν
λ¬Έμ ν΄κ²°νκΈ° β‘
<!DOCTYPE html>
<html>
<head>
<script>
sessionStorage.redirect = location.href;
</script>
<meta http-equiv="refresh" content="0;URL='/'">
</head>
</html>
<script>
(function(){
let redirect = sessionStorage.redirect;
delete sessionStorage.redirect;
if (redirect && redirect != location.href) {
history.replaceState(null, null, redirect);
}
})();
</script>
- μ΄ λ°©μμΌλ‘ SPA λΌμ°ν
λ¬Έμ λ₯Ό ν΄κ²°ν μ μμ (HashRouter λμ) π
νκ²½λ³μ νμ©νκΈ° πΏ
REACT_APP_API_URL=https://api.example.com
REACT_APP_API_URL=https://production-api.example.com
const apiUrl = process.env.REACT_APP_API_URL;
- κ°λ°/λ°°ν¬ νκ²½μ λ°λΌ λ€λ₯Έ μ€μ μ¬μ© κ°λ₯ π
- API μ£Όμ, κΈ°λ₯ νλκ·Έ λ±μ νκ²½λ³λ‘ κ΄λ¦¬ π οΈ
CI/CD μλν μ€μ νκΈ° π€
name: Deploy to GitHub Pages
on:
push:
branches: [ main ]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 16
- run: npm ci
- run: npm run build
- name: Deploy
uses: JamesIves/github-pages-deploy-action@v4
with:
folder: build
- GitHub Actionsλ₯Ό νμ©ν μλ λ°°ν¬ μ€μ
- main λΈλμΉμ νΈμνλ©΄ μλμΌλ‘ λΉλ λ° λ°°ν¬ π