Skip to content

Instantly share code, notes, and snippets.

View khg0712's full-sized avatar
๐ŸŽฏ
Focusing

Hugo Kim khg0712

๐ŸŽฏ
Focusing
View GitHub Profile
// SSR ์‹œ์ ์— Router ์‹ฑ๊ธ€ํ†ค์— ์ ‘๊ทผํ•  ๋•Œ Next.js page ์ปดํฌ๋„ŒํŠธ ์˜ˆ์‹œ
import Router from 'next/router'
export default function page() {
return (
<div>
{/* ์•„๋ž˜ ์—๋Ÿฌ ๋ฐœ์ƒ
* Error: No router instance found.
* You should only use "next/router" on the client side of your app.
* /}
// SSR ์ฝ”๋“œ
// packages/next/server/render.tsx
// renderToHTML์˜ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ƒ๋žต.
// https://github.com/vercel/next.js/blob/v12.3.4/packages/next/server/render.tsx#L351
export async function renderToHTML() {
// CSR๊ณผ ๋‹ค๋ฅด๊ฒŒ SSR์—์„  ServerRouter๋ผ๋Š” ๋ณ„๊ฐœ์˜ class๋กœ Router๋ฅผ ๋งŒ๋“ ๋‹ค.
// ServerRouter parameter๋Š” ์ƒ๋žต.
const router = new ServerRouter()
// 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
// AppContainer์—์„œ RouterContext์— Router ์‹ฑ๊ธ€ํ†ค ์ฃผ์ž…ํ•˜๋Š” ์ฝ”๋“œ
// https://github.com/vercel/next.js/blob/v12.3.4/packages/next/client/index.tsx#L296
function AppContainer({
children,
// packages/next/client/router.ts
// import Router from 'next/router' ํ–ˆ์„ ๋•Œ ์ ‘๊ทผํ•˜๋Š” ๊ฐ’.
// Export the singletonRouter and this is the public API.
export default singletonRouter as SingletonRouter
// 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/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/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/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/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/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)