Skip to content

Instantly share code, notes, and snippets.

View khg0712's full-sized avatar
🎯
Focusing

Hugo Kim khg0712

🎯
Focusing
View GitHub Profile
// packages/next/server/render.tsx
// pre-renderν•˜λŠ” renderToHTML ν•¨μˆ˜
// https://github.com/vercel/next.js/blob/v12.3.4/packages/next/server/render.tsx#L351
export async function renderToHTML(
req: IncomingMessage,
res: ServerResponse,
pathname: string,
query: NextParsedUrlQuery,
renderOpts: RenderOpts
// Next.js v12.3.4 버전 κΈ°μ€€ SSR μ½”λ“œ
// packages/next/server/render.tsx
// https://github.com/vercel/next.js/blob/v12.3.4/packages/next/server/render.tsx#L1114
const renderDocument = async () => {
// ...
//
const createBodyResult = (
initialStream: ReactReadableStream,
suffix?: string
// Next.js v13.0.0 ~ v13.3.0μ—μ„œμ˜ SSR μ½”λ“œ
// λ ˆνΌλŸ°μŠ€ν•˜λŠ” μ½”λ“œλŠ” v13.3.0 κΈ°μ€€
// packages/next/src/server/render.ts
// https://github.com/vercel/next.js/blob/v13.3.0/packages/next/src/server/render.tsx#L119
// streaming SSR 지원을 μœ„ν•΄ renderToReadableStream을 μ‚¬μš©ν•΄μ„œ SSR 처리
// v12.3.4처럼 renderDocumentμ—μ„œ document renderλ₯Ό μ§„ν–‰ν•˜κ³ ,
// renderDocumentμ—μ„œ renderToString 호좜
async function renderToString(element: React.ReactElement) {
const renderStream = await ReactDOMServer.renderToReadableStream(element)
// packages/next/client/next.js
// https://github.com/vercel/next.js/blob/v12.3.4/packages/next/client/next.js#L12
// Next.js client side initialize μ½”λ“œ
initialize({})
.then(() => hydrate())
.catch(console.error)
// packages/next/client/index.tsx
// https://github.com/vercel/next.js/blob/v12.3.4/packages/next/client/index.tsx
// 졜초 hydration을 μœ„ν•΄μ„œ μ‚¬μš©
// λ‚΄λΆ€μ—μ„œ render ν•¨μˆ˜ 호좜
// ν•¨μˆ˜ λ‚΄λΆ€λŠ” μƒλž΅
// https://github.com/vercel/next.js/blob/v12.3.4/packages/next/client/index.tsx#L756
export async function hydrate(opts?: { beforeRender?: () => Promise<void> }) {}
// packages/next/client/router.ts
// useRouter μ½”λ“œ
// https://github.com/vercel/next.js/blob/v12.3.4/packages/next/client/router.ts#L132
export function useRouter(): NextRouter {
return React.useContext(RouterContext)
}
// packages/next/client/with-router.tsx
// withRouter μ½”λ“œ
// https://github.com/vercel/next.js/blob/v12.3.4/packages/next/client/with-router.tsx#L19
import { useRouter } from './router'
export default function withRouter<
P extends WithRouterProps,
C extends BaseContext = NextPageContext
>(
// packages/next/client/index.ts
// Router 싱글톀을 μ €μž₯ν•˜λŠ” μ „μ—­ 객체
// https://github.com/vercel/next.js/blob/v12.3.4/packages/next/client/index.tsx#L67
export let router: Router
// hydrate ν•¨μˆ˜μ—μ„œ Router 싱글톀이 μ΄ˆκΈ°ν™”(createRouter)λ˜λŠ” μ½”λ“œ 호좜
// https://github.com/vercel/next.js/blob/v12.3.4/packages/next/client/index.tsx#L863
export async function hydrate(opts?: { beforeRender?: () => Promise<void> }) {
// ...
// packages/next/client/router.ts
// Router 싱글톀을 μ €μž₯ν•˜λŠ” 객체
// https://github.com/vercel/next.js/blob/v12.3.4/packages/next/client/router.ts#L20
const singletonRouter: SingletonRouterBase = {
router: null, // holds the actual router instance
readyCallbacks: [],
ready(cb: () => void) {
if (this.router) return cb()
if (typeof window !== 'undefined') {
// packages/next/client/router.ts
// import Router from 'next/router' ν–ˆμ„ λ•Œ μ ‘κ·Όν•˜λŠ” κ°’.
// Export the singletonRouter and this is the public API.
export default singletonRouter as SingletonRouter