1. Udemy(5)
- firebase-tools 설치
$ npm install -g firebase-tools
- 로그인
$ firebase login
- 초기화
$ firebase init
- 배포
$ firebase deploy
- 호스팅 비활성화
$ firebase hosting:disable
Authentication(인증)
- firebase API 이용
- 일부 콘텐츠는 보호되어야 하기때문에 필요하다
- 인증되지 않은 사용자는 콘텐츠 접근이 불가능하다
인증토큰
으로 작업할 때 이러한 토큰은 일반적으로 JSON 웹 토큰
형식(JWT)으로 생성된다
- 이러한
토큰
은 실제로 데이터를 문자열로 인코딩하는 알고리즘에 의해 구성된 긴 문자열이다(개인 키의 도움으로 서버에서만 알 수 있다)
NextJs
- React를 기반으로 한 React 프레임워크
- 설치 :
npx create-next-app || yarn create-next-app
npm run dev
를 이용해 개발서버를 시작할 수 있다
- React에서 react-router-dom의 라우팅은 CSR을 제공하고 Next에서 제공하는 File System의 라우팅은 SSR을 제공한다
- Next가 제공하는 SSR은 SPA를 지원해 필요한 데이터만 부분적으로 요청받고 응답하는 방식이다
- 공식홈페이지를 통해 더욱 자세한 내용을 확인할 수 있다
Page
- pages폴더안의 index.js파일은 루트페이지를 로드하거나 주어진 하위폴더에서 아무것도 슬래시하지 않고 로드 된다
// 예시
pages/index.js => my-domain.com
pages/home/index.js || pages/home.js => my-domain.com/home
pages/home/detail/index.js || pages/home/detail.js => my-domain.com/home/detail
- dynamic route : 파일이름에 []대괄호가 있을 경우 nextJS에게 이것이 동적페이지가 될것임을 알려준다
import { useRouter } from 'next/router';
const router = useRouter();
const id = router.query.작명;
- 페이지를 전환할때
a 태그
를 이용할경우 새페이지를 로드하기 때문에 Redux 또는 context 등 모든상태를 잃어버린다 따라서 Link
를 이용해 SPA를 유지해준다 속성은 href를 그대로 이용한다
import Link from 'next/link'
✍️ SSG & SSR
- NEXT는 브라우저에 렌더링 할 때 기본적으로
pre-redering
(사전 렌더링 : 각 페이지들을 사전에 미리 HTML 문서로 생성하여 가지고 있는 것)을 한다(Good for SEO!)
pre-redering
Static-Site-Generation(SSG)
: build 시에 HTML을 각 페이지별로 생성하고 해당 페이지로 요청이 올 경우 이미 생성된 HTML 문서를 반환한다.(권장)
Server-Side-Rendering(SSR)
: 요청이 올 때 마다 해당하는 HTML 문서를 그때 그때 생성하여 반환한다.
✍️ Fetch data for pre-rendering
Static Generation
getStaticProps
: build 시에 fetch data
- 객체를 return하며 값을 props객체로 담아 전달할 수 있다
- revalidate : page re-generate가 일어날 수 있는 시간(초 단위), 전체 사이트를 다시 빌드할 필요 없이 페이지별로 정적 생성을 사용할 수 있다
function HomePage(props) {
return (
);
}
export async function getStaticProps() {
const res = await fetch('https://.../meetups');
const meetups = await res.json();
return {
props: {
meetups: meetups.map(meetup => ({
title: meetup.title,
address: meetup.address,
})),
},
revalidate: 1,
};
}
export default HomePage
getStaticPaths
: build 시에 fetch data를 기반으로 dynamic route를 지정
- paths(필수) : 배열값을 받으며 미리 렌더링되는 키를 결정, 각각의 값 params은 페이지 이름에 사용된 매개변수와 일치해야 한다
- fallback(필수) : 빌드시 생성해놓지 않아 path 페이지가 없을 경우 처리방법, boolean 또는 'blocking' 값
function MeetupDetails(props) {
return (
);
}
export async function getStaticPaths() {
const res = await fetch('https://.../meetups');
const meetups = await res.json();
return {
fallback: true or false or 'blocking',
paths: meetups.map(meetup => ({
params: { meetupId: meetup._id },
})),
};
}
export async function getStaticProps(context) {
const meetupId = context.params.meetupId;
const res = await fetch(`https://.../meetups/${meetupId}`);
const selectedMeetup = await res.json();
return {
props: {
meetupData: {
id: selectedMeetup,
title: selectedMeetup.title,
},
},
};
}
export default MeetupDetails;
Server-Side-Rendering
getServerSideProps
: 각 요청 마다 fetch data
export async function getServerSideProps(context) {
const req = context.req;
const res = context.res;
return {
props: {
meetups: DUMMY_MEETUPS,
},
};
}
✍️ API Router
- Next.js 앱안에 API endpoint를 만들수 있다
- pages/api 디렉토리 안에 함수 작성
export default function handler(req, res) {
res.status(200).json({ text: 'Hello' })
}
export default function handler(req, res) {
if (req.method === 'POST') {
} else {
}
}
✍️ Deploying
vercel
- nextjs와 같은팀으로 nextjs에 최적화되어있다
- Git과 연동되어 따로 파일을 빌드할 필요없이 프로젝트 폴더를 Git에 push 해준뒤 vercel과 프로젝트폴더를 연동 시켜주면 된다
- 수정사항이 생길경우 수정한뒤 다시 push해주면 알아서 재배포가 된다