React에서 SSR을 구현하기 위한 프레임워크
npx create-next-app@latest
npx create-next-app@latest --typescript #타입스크립트 탬플릿
#yarn
yarn create next-app
기존 React는 CSR(Client-Side-Rendering)으로 빈 html을 띄워주면 그때 js파일을 해석하여 페이지를 랜더링하는 방식. 이 방식은 html이 완성되지 않은 상태에서 페이지를 불러오기 때문에 크롤링에 적합하지 않다. 검색 엔진은 크롤링을 바탕으로 하기 때문에 CSR 방식을 사용하는 페이지들은 검색 노출도가 떨어진다.
반면 SSR은 클라이언트 대신, 서버에서 페이지를 랜더링한다. Next.js는 이처럼 SSR을 이용하여 사용자와 검색 엔진 클롤러에 랜더링하여 제공한다.
export async function getStaticProps(context){
return{
props: {**data**}
}
}
예시 : posts 데이터 전달
function Blog({[posts}){
return{
<ul>
{posts.map((post)=>(
<li>{posts.title}</li>
))}
</ul>
}
}
//called at build time
export async function getStaticProps(){
//request to get 'posts'
const res = await fetch('path')
const posts = awiat res.json()
//return props
return{
props: {
posts
}
}
}
export async function getStaticPaths(){
return {
paths: [
{params: {**data**}}
],
fallback : true // false, 'blocking'
}
}
// Define Fallback Page
if(router.isFallback){
return <div>Loading...</div>
}
export async function getServerSideProps(context){
return{
props : {**data**}
}
}
Javascript로 서버 코드를 유지 관리하기 위한 대안으로 Javascript에 타입을 부여한 언어
Typescript로 작성된 코드가 컴파일 과정을 거쳐 js가 되고 이를 브라우저가 해석한다. 즉, 개발 환경에서만 활성화된다.
let arr : any[] = ['hello',123,true]
let code: string|number
code = 123
code = 'abc'
code = false //Error
var employee : [number,string] = [1,"John"]
var user : [number,string]
user = ['John',123] //Error
enum PrintMedia {
Newspaper, //0
Newsletter, //1
Magazine, //2
Book //3
}
let mediaType : number = PrintMedia.Book //3
let type : string = PrintMedia[2] //'Magazine'
function sayHi():void{
console.log("Hi")
}
interface Foo {
bar : number;
bas : string;
}
var foo = {} as Foo;
foo.bar =123;
foo.bas ='Hi';
파일 시스템 기반의 라우터. pages 디렉토리에 추가되는 파일을 페이지 경로로 사용할 수 있다.
pages/index.js -> '/'
pages/blog/index.js -> '/blog'
pages/blog/my-post.js -> '/blog/my-post'
pages/[username]/settings.js -> '/:username/settings' #Dynamic routing
Typescript 기반의 Next js로 마크다운 포스트를 생성하는 앱 (Nextjs 기본 예제)
마크다운 파일의 메타 데이터를 파싱
const fullPath = path.join(postsDirectory,`${id}.md`)
const fileContent = fs.readFileSync(fullPath,'utf-8')
//parse metadata with gray-matter
const matterRslt = matter(fileContent)
마크다운 문서를 HTML로 변환
//convert markdown to HTML
const processedContent = await remark()
.use(remarkHtml)
.process(matterRslt.content)
Github repo: https://github.com/R1NM/simple_nextjs_blog