Next.js의 server는 어디에 있나?
https://github.com/vercel/next.js/blob/canary/packages/next/src/server/next-server.ts
https://github.com/vercel/next.js/blob/canary/packages/next/src/server/base-server.ts#L2360
노드서버로 구성되어있고, next.js 프레임워크 내부의 서버이다. 하나의 next.js 앱이 띄워지면 next 프레임웍 자체로 해당 서버가 구동된다.
요 서버는 라우팅 및 serverSideProps 수행 및 html 렌더링등의 역할을 함
protected async renderHTML(
req: NodeNextRequest,
res: NodeNextResponse,
pathname: string,
query: NextParsedUrlQuery,
renderOpts: LoadedRenderOpts
): Promise<RenderResult> {
return getTracer().trace(NextNodeServerSpan.renderHTML, async () =>
this.renderHTMLImpl(req, res, pathname, query, renderOpts)
)
}
private async renderHTMLImpl(
req: NodeNextRequest,
res: NodeNextResponse,
pathname: string,
query: NextParsedUrlQuery,
renderOpts: LoadedRenderOpts
): Promise<RenderResult> {
if (process.env.NEXT_MINIMAL) {
throw new Error(
'Invariant: renderHTML should not be called in minimal mode'
)
// the `else` branch is needed for tree-shaking
} else {
// Due to the way we pass data by mutating `renderOpts`, we can't extend the
// object here but only updating its `nextFontManifest` field.
// https://github.com/vercel/next.js/blob/df7cbd904c3bd85f399d1ce90680c0ecf92d2752/packages/next/server/render.tsx#L947-L952
renderOpts.nextFontManifest = this.nextFontManifest
if (this.enabledDirectories.app && renderOpts.isAppPath) {
return lazyRenderAppPage(
req.originalRequest,
res.originalResponse,
pathname,
query,
renderOpts
)
}
// TODO: re-enable this once we've refactored to use implicit matches
// throw new Error('Invariant: render should have used routeModule')
return lazyRenderPagesPage(
req.originalRequest,
res.originalResponse,
pathname,
query,
renderOpts
)
}
}
서버사이드렌더링 관련 메서드가 존재하는지 여부 판단
const hasServerProps = !!components.getServerSideProps
let hasStaticPaths = !!components.getStaticPaths
const isServerAction = getIsServerAction(req)
const hasGetInitialProps = !!components.Component?.getInitialProps
let isSSG = !!components.getStaticProps
-> 이렇게 판별후 renderoption 에 어쩌구저쩌구 넣어줌.