{"id":5416,"date":"2026-10-12T17:50:32","date_gmt":"2026-10-12T09:50:32","guid":{"rendered":"https:\/\/arc.dev\/employer-blog\/?p=5416"},"modified":"2026-10-12T17:51:05","modified_gmt":"2026-10-12T09:51:05","slug":"nextjs-interview-questions","status":"publish","type":"post","link":"https:\/\/arc.dev\/employer-blog\/nextjs-interview-questions\/","title":{"rendered":"Next.js interview questions that test App Router and RSC judgment"},"content":{"rendered":"\n<p>Most &#8220;Next.js interview questions&#8221; lists you&#8217;ll find online are trivia. They ask what ISR stands for, what getStaticProps did, or what a Server Component is. A candidate can pass every one by reading documentation the night before, without ever shipping a Next.js app that took real traffic.<\/p>\n\n\n\n<p>That gap costs money. The engineers who cause expensive production incidents often knew the vocabulary perfectly. They just never had to decide whether a product page should revalidate on a tag or a timer, or why wrapping a whole route in &#8216;use client&#8217; quietly doubled the JavaScript bundle.<\/p>\n\n\n\n<p>This set of scenario-based questions <strong>addresses the four decisions a Next.js engineer makes every week<\/strong>: rendering strategy, the Server and Client Component boundary, caching and revalidation, and the proxy layer that runs before your route code. Each one comes with what a strong answer covers and the plausible-sounding weak answer that signals shallow experience.<\/p>\n\n\n\n<p><em>Written for Next.js 16 (released October 21, 2025), verified against the official Next.js documentation. Note that Next.js 16 renamed middleware.ts to proxy.ts, and that this layer now runs on the Node.js runtime by default.<\/em><\/p>\n\n\n\n<p><strong>In this guide:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>How to use scenario-based questions to assess Next.js judgment<\/li>\n\n\n\n<li>Rendering strategy scenarios for fast, fresh pages<\/li>\n\n\n\n<li>Server and Client Component boundary scenarios<\/li>\n\n\n\n<li>Caching and revalidation scenarios that reveal production experience<\/li>\n\n\n\n<li>Routing and proxy layer scenarios for secure application behavior<\/li>\n\n\n\n<li>How to actually run this in an interview<\/li>\n\n\n\n<li>Frequently asked questions<\/li>\n\n\n\n<li>Building a more reliable Next.js interview process<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>How to use scenario-based questions to assess Next.js judgment<\/strong><\/h2>\n\n\n\n<p>Scenario questions work because they force a candidate to pick one option and defend it against a constraint, which recall questions never do. A definition has one right answer, while a rendering decision has tradeoffs, which are where seniority shows up.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Trivia vs. architectural judgment: what to test<\/strong><\/h3>\n\n\n\n<p>Each row below tests the same underlying knowledge. The left column can be answered from memory, while the right column cannot.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Trivia version<\/strong><\/td><td><strong>Scenario version that tests the same thing<\/strong><\/td><\/tr><tr><td>&#8220;What&#8217;s the difference between SSG and SSR?&#8221;<\/td><td>&#8220;A product page needs good search rankings, but inventory counts change every few minutes. How do you render it, and what breaks if you get it wrong?&#8221;<\/td><\/tr><tr><td>&#8220;What is a Server Component?&#8221;<\/td><td>&#8220;A teammate added &#8216;use client&#8217; at the top of a page because one button needed an onClick. What did that cost, and how would you fix it?&#8221;<\/td><\/tr><tr><td>&#8220;What does revalidatePath do?&#8221;<\/td><td>&#8220;An admin saves a price change, the mutation succeeds, but shoppers still see the old price for an hour. Walk me through how you&#8217;d find the cause.&#8221;<\/td><\/tr><tr><td>&#8220;What is middleware in Next.js?&#8221;<\/td><td>&#8220;Your team wants to check a user&#8217;s subscription tier before any route code runs. What belongs in the proxy layer and what doesn&#8217;t?&#8221;<\/td><\/tr><tr><td>&#8220;Name the Next.js caching layers.&#8221;<\/td><td>&#8220;Two users report seeing each other&#8217;s dashboard data. Where do you look first?&#8221;<\/td><\/tr><tr><td>&#8220;What is hydration?&#8221;<\/td><td>&#8220;A page renders a timestamp fine locally but throws a hydration mismatch in production. What&#8217;s your first hypothesis?&#8221;<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>A consistent scorecard for strong and weak answers<\/strong><\/h3>\n\n\n\n<p>Score each answer on three things instead of right or wrong.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Names a mechanism.<\/strong> The candidate says which API, cache layer, or file does the work, not just the concept.<\/li>\n\n\n\n<li><strong>States the tradeoff.<\/strong> Every choice costs something: freshness, latency, build time, or bundle size. Strong candidates volunteer the cost without being asked.<\/li>\n\n\n\n<li><strong>Describes a failure mode.<\/strong> People who shipped this know what broke. People who read about it do not.<\/li>\n<\/ul>\n\n\n\n<p>An answer that hits all three is senior. One that hits only the first is a well-prepared mid-level engineer, which may still be exactly who you want.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Version note and official documentation to verify before interviewing<\/strong><\/h3>\n\n\n\n<p>Next.js changes fast, and stale interview questions punish candidates unfairly. Before you run these, skim the current <a href=\"https:\/\/nextjs.org\/docs\/app\/guides\/server-and-client-boundary\">Server and Client boundary guide<\/a>, the <a href=\"https:\/\/nextjs.org\/docs\/app\/getting-started\/revalidating\">revalidation reference<\/a>, and the <a href=\"https:\/\/nextjs.org\/docs\/app\/getting-started\/proxy\">proxy documentation<\/a>.<\/p>\n\n\n\n<p>Two facts trip up interviewers in 2026: Next.js 16 renamed middleware.ts to proxy.ts, and renamed the default export from middleware to proxy. And that layer runs on Node.js by default now, not Edge. If a candidate uses the old names, that&#8217;s a knowledge-currency question, not a competence question.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Rendering strategy scenarios for fast, fresh pages<\/strong><\/h2>\n\n\n\n<p>Rendering strategy questions should hand the candidate a real constraint and make them choose. The names of the rendering modes matter less than whether they can explain what a wrong choice costs the business.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>A product page needs SEO performance and frequently changing inventory<\/strong><\/h3>\n\n\n\n<p><strong>Scenario:<\/strong> &#8220;We have 40,000 product pages. Search traffic drives most revenue, so pages need to be fast and crawlable. Stock levels and prices change every few minutes. How do you render these?&#8221;<\/p>\n\n\n\n<p><strong>What a strong answer covers:<\/strong> They separate the stable parts from the volatile parts. Product name, description, and images get cached and served fast. Stock and price get fetched at request time or streamed in with Suspense so the cached shell renders immediately. They mention on-demand revalidation triggered by the inventory system rather than a short timer that hammers the origin.&nbsp;<\/p>\n\n\n\n<p>Bonus points if they ask how bad a 60-second stale price is for the business, because that single answer changes the whole design. More bonus points if they name the Next.js 16 mechanism for this split: with <a href=\"https:\/\/nextjs.org\/docs\/app\/getting-started\/caching\">Cache Components<\/a> enabled, the product details go in the static shell through &#8216;use cache&#8217; while stock and price stream in behind Suspense. That is Partial Prerendering, and it gives one URL both an instant cached shell and live data.<\/p>\n\n\n\n<p><strong>Red flag:<\/strong> &#8220;I&#8217;d use SSR for everything so it&#8217;s always fresh.&#8221; That&#8217;s a candidate optimizing for correctness with no sense of cost. Also watch for anyone who wants to statically generate all 40,000 pages at build time without asking how long the build takes. For how each of these rendering choices affects what search engines actually index, see our guide to <a href=\"https:\/\/arc.dev\/employer-blog\/next-js-seo-rendering-strategies\/\">Next.js SEO rendering strategies<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>A personalized dashboard must protect user data without slowing the public site<\/strong><\/h3>\n\n\n\n<p><strong>Scenario:<\/strong> &#8220;Our marketing site and our logged-in dashboard live in the same Next.js app. The dashboard shows account-specific data. Marketing pages get 50x the traffic. How do you keep the dashboard secure and the marketing pages fast?&#8221;<\/p>\n\n\n\n<p><strong>What a strong answer covers:<\/strong> Reading cookies or headers opts a route into dynamic rendering, so the dashboard renders per request while marketing routes stay cached. They talk about route groups or layout structure so the personalized branch doesn&#8217;t accidentally pull the whole app into dynamic rendering.<\/p>\n\n\n\n<p>Strong candidates bring up authorization checks living in a server-only data access layer, which is what the <a href=\"https:\/\/cheatsheetseries.owasp.org\/cheatsheets\/Nextjs_Security_Cheat_Sheet.html\">OWASP Next.js security guidance recommends<\/a>, so a missing check in one component can&#8217;t leak another user&#8217;s data.<\/p>\n\n\n\n<p><strong>Red flag:<\/strong> Putting the auth check only in a shared layout. Layouts don&#8217;t re-run on every client-side navigation, so that&#8217;s a real security hole, not a style preference. A candidate who has debugged auth in the App Router knows this.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>A route mixes stable marketing content with request-time data<\/strong><\/h3>\n\n\n\n<p><strong>Scenario:<\/strong> &#8220;A homepage has a static hero, a static pricing table, and a live &#8216;recently purchased&#8217; feed. The feed query takes about 800ms. How do you render this page?&#8221;<\/p>\n\n\n\n<p><strong>What a strong answer covers:<\/strong> Stream the slow part. Wrap the feed in Suspense with a skeleton so the static shell ships immediately and the feed fills in. They explain that this keeps the fast content off the slow query&#8217;s critical path and improves perceived load time without sacrificing feed freshness.<\/p>\n\n\n\n<p><strong>Red flag:<\/strong> &#8220;I&#8217;d make the whole page dynamic.&#8221; Or fetching the feed client-side with useEffect as a reflex, which adds a waterfall and a loading spinner where streaming would have worked better. Ask a follow-up: &#8220;What happens to Largest Contentful Paint in your version?&#8221;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>An analytics page needs fresh numbers but costs a fortune to query<\/strong><\/h3>\n\n\n\n<p><strong>Scenario:<\/strong> &#8220;An internal analytics dashboard runs a query that takes 6 seconds and costs real money per run. Twenty people check it throughout the day. How do you handle rendering and caching?&#8221;<\/p>\n\n\n\n<p><strong>What a strong answer covers:<\/strong> Cache the expensive result with time-based revalidation tuned to how fast the data changes, so 20 views don&#8217;t mean 20 queries. They mention showing users when the data was last refreshed and offering a manual refresh that triggers on-demand revalidation for the person who needs current numbers. They tie the revalidation window to a business question, not a default.<\/p>\n\n\n\n<p><strong>Red flag:<\/strong> Suggesting a client-side polling interval, which multiplies the expensive query by the number of open tabs.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Server and Client Component boundary scenarios<\/strong><\/h2>\n\n\n\n<p>The boundary questions that matter are about consequences: what ships to the browser, where data gets fetched, and what breaks when the boundary sits in the wrong place. Definitions won&#8217;t surface any of that.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>One interactive control turns an entire page into a Client Component<\/strong><\/h3>\n\n\n\n<p><strong>Scenario:<\/strong> &#8220;A teammate put &#8216;use client&#8217; at the top of a 600-line page component because one button needed an onClick handler. The page still works. What&#8217;s wrong with it?&#8221;<\/p>\n\n\n\n<p><strong>What a strong answer covers:<\/strong> That directive marks the boundary, and everything imported below it goes to the client too. The whole subtree now ships as JavaScript, hydrates in the browser, and loses direct access to server data.<\/p>\n\n\n\n<p>The fix is pushing the boundary down: extract the button into its own small Client Component and keep the page a Server Component. They should mention passing server-rendered content as children to a Client Component wrapper, which keeps that content on the server even inside a client boundary.<\/p>\n\n\n\n<p><strong>Red flag:<\/strong> &#8220;It&#8217;s fine, it works.&#8221; Or knowing the directive is misplaced without being able to explain the cost in concrete terms like bundle size or hydration time.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>A Client Component needs data from a database and a private API key<\/strong><\/h3>\n\n\n\n<p><strong>Scenario:<\/strong> &#8220;A Client Component needs to display data from our Postgres database, and the query needs a secret API key. How do you build this?&#8221;<\/p>\n\n\n\n<p><strong>What a strong answer covers:<\/strong> The query stays on the server. Fetch in a Server Component and pass serializable data down as props, or call a Server Action from the client for on-demand fetches.<\/p>\n\n\n\n<p>They know the data crossing the boundary must be serializable, so functions and class instances won&#8217;t pass. They should flag that secrets belong in server-only modules and that anything imported into a Client Component tree can end up in the browser bundle.<\/p>\n\n\n\n<p><strong>Red flag:<\/strong> Reaching for a NEXT_PUBLIC_ environment variable to make the key available. That variable prefix means &#8220;put this in the browser bundle,&#8221; and a candidate who suggests it for a secret has a security gap, not a syntax gap.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>A hydration mismatch appears after deploying a date or locale change<\/strong><\/h3>\n\n\n\n<p><strong>Scenario:<\/strong> &#8220;A page renders fine locally. In production, the console shows a hydration mismatch on a component that formats a date. What&#8217;s your first hypothesis?&#8221;<\/p>\n\n\n\n<p><strong>What a strong answer covers:<\/strong> The server and the browser produced different HTML. Common culprits: new Date() evaluated at two different moments, a locale or timezone that differs between server and client, or Math.random() in render.<\/p>\n\n\n\n<p>They describe the fix as making the render deterministic (pass a fixed ISO timestamp, format on the client after mount, or use suppressHydrationWarning narrowly on the one element where a difference is expected).<\/p>\n\n\n\n<p><strong>Red flag:<\/strong> Suppressing the warning globally, or wrapping the whole component in a client-only dynamic import as the first move. That hides the mismatch and gives up server rendering for something a locale fix would have solved.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>A large client bundle makes a Server Component page slow to interact<\/strong><\/h3>\n\n\n\n<p><strong>Scenario:<\/strong> &#8220;A page uses Server Components and loads its HTML fast, but Interaction to Next Paint is bad. Where do you look?&#8221;<\/p>\n\n\n\n<p><strong>What a strong answer covers:<\/strong> They open the bundle analyzer and look at what&#8217;s in the client tree. Usual suspects: a heavy charting or date library imported at the top of a Client Component, a provider wrapping the root and pulling everything into hydration, or a UI kit imported wholesale. Fixes include dynamic imports for below-the-fold widgets, moving formatting logic to the server, and shrinking the client boundary.<\/p>\n\n\n\n<p><strong>Red flag:<\/strong> Blaming the server or suggesting a bigger instance. Server-rendered HTML arriving fast while interaction lags is a client-side JavaScript problem, and a candidate who has profiled a real app goes straight there.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>The Next.js 16 upgrade breaks the build on a custom webpack config<\/strong><\/h3>\n\n\n\n<p><strong>Scenario:<\/strong> &#8220;We upgraded to Next.js 16. The build now ignores the custom webpack() function in next.config.js, and a webpack plugin we rely on stopped running. We need to ship on Friday. What do you do?&#8221;<\/p>\n\n\n\n<p><strong>What a strong answer covers:<\/strong> They know that <a href=\"https:\/\/nextjs.org\/docs\/app\/api-reference\/turbopack\">Turbopack is the default bundler<\/a> for both next dev and next build as of Next.js 16, that it doesn&#8217;t read webpack() config, and that it doesn&#8217;t support webpack plugins (webpack loaders still work through turbopack.rules). The short-term move is next build &#8211;webpack to unblock the release.\u00a0<\/p>\n\n\n\n<p>The real fix is a migration plan: move aliases to turbopack.resolveAlias, move loaders to turbopack.rules, and find a Turbopack-compatible replacement for the plugin or decide consciously to stay on webpack for now. Strong candidates also check the documented gaps before calling the migration done, such as CSS Module ordering and the legacy ~ syntax for Sass imports, because those cause subtle visual regressions instead of build errors.<\/p>\n\n\n\n<p><strong>Red flag:<\/strong> Pinning Next.js back to version 15 without diagnosing anything, or deleting the plugin to get a green build without asking what it did. Also weak: treating the upgrade as a bundler bug and filing an issue instead of reading the release notes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Caching and revalidation scenarios that reveal production experience<\/strong><\/h2>\n\n\n\n<p>Caching is where the difference between reading docs and shipping code shows up hardest. Ask candidates to diagnose a bug instead of listing cache layers.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>A catalog update succeeds, but visitors still see an old price<\/strong><\/h3>\n\n\n\n<p><strong>Scenario:<\/strong> &#8220;An admin updates a product price. The database write succeeds, the admin panel shows the new price, but the public product page shows the old one for the next hour. Walk me through your debugging.&#8221;<\/p>\n\n\n\n<p><strong>What a strong answer covers:<\/strong> They work through the four caching layers in order. Request Memoization only deduplicates within a single render, so it&#8217;s rarely the culprit. Next is the Data Cache: was the fetch result cached? Then the Full Route Cache: was the whole page prerendered? Then the Router Cache: is the browser reusing a page it already visited? Plus any CDN in front. Those four names come from the Next.js caching model without Cache Components.&nbsp;<\/p>\n\n\n\n<p>In apps with Cache Components enabled, the same questions map to &#8216;use cache&#8217; entries, the prerendered static shell, and the copy the browser keeps. Then they name the fix: tag the cached price data and call updateTag from the Server Action that saves the price, so the write and the invalidation happen together.&nbsp;<\/p>\n\n\n\n<p>In Next.js 16, <a href=\"https:\/\/nextjs.org\/docs\/app\/api-reference\/functions\/updateTag\">updateTag<\/a> gives read-your-writes, so the next request waits for fresh data and the admin sees the new price right away. If the price arrives from an outside system through a webhook, revalidateTag(tag, &#8216;max&#8217;) in a Route Handler is the right call instead. They may reference how tag-based revalidation coordinates across instances, which matters once you run more than one server.<\/p>\n\n\n\n<p><strong>Red flag:<\/strong> &#8220;I&#8217;d shorten the revalidate time to 10 seconds.&#8221; That treats a correctness problem with a timer and multiplies origin load. Also weak: it only fixes the server cache and ignores the client router cache, so the admin&#8217;s own browser still shows stale content.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>A webhook should refresh related pages without rebuilding the whole site<\/strong><\/h3>\n\n\n\n<p><strong>Scenario:<\/strong> &#8220;Our CMS fires a webhook when an article is published. Publishing should update the article page, the category page, and the homepage feed. We have 8,000 articles and a 12-minute build. What&#8217;s your approach?&#8221;<\/p>\n\n\n\n<p><strong>What a strong answer covers:<\/strong> On-demand revalidation from a webhook handler, using tags that group related content so one publish event invalidates exactly the right set. They talk about tagging at the data-fetch level rather than guessing at paths, and about securing the webhook endpoint with a shared secret so nobody can trigger mass invalidation from outside.<\/p>\n\n\n\n<p><strong>Red flag:<\/strong> Triggering a full rebuild on every publish. With a 12-minute build, that&#8217;s an editorial team waiting 12 minutes for a typo fix. Also watch for an unauthenticated revalidation route.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>An authenticated route unexpectedly returns shared or stale data<\/strong><\/h3>\n\n\n\n<p><strong>Scenario:<\/strong> &#8220;Two users report seeing each other&#8217;s account data on a settings page. It&#8217;s intermittent. Where do you look?&#8221;<\/p>\n\n\n\n<p><strong>What a strong answer covers:<\/strong> Something user-specific got cached without the user in the cache key. They check whether a fetch was cached, but the request included a per-user token; whether a route was statically rendered when it should read cookies; and whether an in-memory cache or module-level variable is shared across requests on the same server instance.<\/p>\n\n\n\n<p>They should mention that a module-scoped variable in a server file persists across requests, which is a classic source of cross-user leakage.<\/p>\n\n\n\n<p><strong>Red flag:<\/strong> Suggesting a hard refresh or &#8220;it&#8217;s probably the CDN&#8221; with no plan to verify. Also weak: proposing to disable caching everywhere. That fixes the leak and creates a performance problem, and it doesn&#8217;t explain the bug.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>A team cannot explain why a fetch result is cached or dynamic<\/strong><\/h3>\n\n\n\n<p><strong>Scenario:<\/strong> &#8220;Your team argues in code review about whether a given fetch is cached. Nobody&#8217;s sure. How do you settle it, and how do you stop the argument from recurring?&#8221;<\/p>\n\n\n\n<p><strong>What a strong answer covers:<\/strong> They check the current version&#8217;s defaults instead of assuming, since caching behavior has shifted across recent Next.js majors. They set caching explicitly at each fetch or route segment so intent is visible in the code, and they verify with build output showing which routes are static and which are dynamic. For the recurring part: a short team convention documented in the repo, plus explicit cache options rather than relying on defaults.<\/p>\n\n\n\n<p><strong>Red flag:<\/strong> Stating a confident default without checking the version. A candidate who says &#8220;fetch is cached by default&#8221; or &#8220;fetch is never cached&#8221; as a flat fact, with no version qualifier, is repeating something they read once.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Turning on Cache Components makes the build fail<\/strong><\/h3>\n\n\n\n<p><strong>Scenario:<\/strong> &#8220;We enabled Cache Components on an existing app. The dev overlay now flags a dozen routes as blocking, and the build fails. A teammate suggests adding &#8216;use cache&#8217; to every page to make the errors go away. What do you do instead?&#8221;<\/p>\n\n\n\n<p><strong>What a strong answer covers:<\/strong> They explain what the errors mean. With<a href=\"https:\/\/nextjs.org\/docs\/app\/getting-started\/caching\"> Cache Components<\/a>, caching is opt-in, and every route has to produce a static shell. Any uncached data or runtime API (cookies, headers, searchParams) that sits outside a Suspense boundary blocks that shell, so Next.js stops and asks you to decide.&nbsp;<\/p>\n\n\n\n<p>They decide per component: shared data that can be a little stale gets &#8216;use cache&#8217; with a cacheLife and a cacheTag so it can be invalidated on write, while per-request or per-user data stays uncached and moves behind Suspense, as deep in the tree as possible so more of the page prerenders. That is Partial Prerendering in practice: a static shell served instantly, with dynamic holes streaming in.<\/p>\n\n\n\n<p><strong>Red flag:<\/strong> Blanket &#8216;use cache&#8217; on every page. It hides the decision the errors are asking for and risks caching data that should be fresh. Also weak: one Suspense boundary around the whole page, which technically passes but leaves an empty shell, or switching Cache Components back off without understanding why the routes were blocking.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Routing and proxy layer scenarios for secure application behavior<\/strong><\/h2>\n\n\n\n<p>The proxy layer runs before your route code, which makes it useful for cheap redirects and dangerous as a security boundary. These questions test whether a candidate knows the difference.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>A dynamic route must return a proper not-found state for missing records<\/strong><\/h3>\n\n\n\n<p><strong>Scenario:<\/strong> &#8220;A \/products\/[slug] route gets hit with a slug that doesn&#8217;t exist in the database. Right now it renders an empty page and returns a 200. Why does that matter, and how do you fix it?&#8221;<\/p>\n\n\n\n<p><strong>What a strong answer covers:<\/strong> A 200 on a missing page tells search engines to index an empty page and hides real errors from monitoring. The fix is calling notFound() when the record is missing, which renders the nearest not-found boundary and returns a 404. They should distinguish a genuinely missing record (404) from a fetch failure (error boundary, 500), because those need different handling.<\/p>\n\n\n\n<p><strong>Red flag:<\/strong> Redirecting to the homepage. That&#8217;s a soft 404; it confuses crawlers, and it strands users who mistyped a URL.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>A protected route needs an auth check before application code runs<\/strong><\/h3>\n\n\n\n<p><strong>Scenario:<\/strong> &#8220;We want to block unauthenticated users from \/dashboard\/* before any page code runs. Someone proposes doing the full session lookup and permission check in proxy.ts. What&#8217;s your take?&#8221;<\/p>\n\n\n\n<p><strong>What a strong answer covers:<\/strong> The proxy layer is good for cheap, coarse checks: does a session cookie exist? Redirect if it doesn&#8217;t. It runs on every matched request, so anything slow there adds latency to everything. The real authorization decision belongs closer to the data, in a server-side data access layer that every protected query passes through.<\/p>\n\n\n\n<p>Strong candidates say the proxy is optimistic, and that skipping the data-layer check leaves you exposed if anyone reaches a route another way. Current guidance on the middleware-to-proxy transition makes the same split between the fast cookie check and the real authorization.<\/p>\n\n\n\n<p><strong>Red flag:<\/strong> Treating the proxy as the only auth gate. Also worth probing: a candidate who assumes it still runs on Edge by default and therefore rules out database calls on runtime grounds. The latency reasoning is right, but the runtime fact is outdated.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>A candidate says the proxy layer is enough to protect admin routes<\/strong><\/h3>\n\n\n\n<p><strong>Scenario:<\/strong> &#8220;In March 2025, a Next.js vulnerability let attackers skip middleware entirely by adding one request header. Suppose your app&#8217;s only auth check lived in middleware. What was exposed, and what would you change so the next bypass doesn&#8217;t matter?&#8221;<\/p>\n\n\n\n<p><strong>What a strong answer covers:<\/strong> They may know it as CVE-2025-29927. Per <a href=\"https:\/\/vercel.com\/blog\/postmortem-on-next-js-middleware-bypass\">Vercel&#8217;s postmortem<\/a>, Next.js used an internal x-middleware-subrequest header to stop middleware from running recursively, and an attacker could send that header to skip middleware completely. Self-hosted apps running next start or standalone output were affected, and patches shipped in 12.3.5, 13.5.9, 14.2.25, and 15.2.3.\u00a0<\/p>\n\n\n\n<p>Strong candidates treat the patch as step one and the architecture as the real fix: every protected query and Server Action checks authorization in the data access layer, so skipping the proxy reaches a route but no data. That matches the <a href=\"https:\/\/nextjs.org\/docs\/app\/guides\/authentication\">Next.js authentication guide<\/a>, which says the proxy should not be your only line of defense.<\/p>\n\n\n\n<p><strong>Red flag:<\/strong> &#8220;Just upgrade.&#8221; Patching closes this specific hole but leaves the design that made it dangerous. Don&#8217;t mark a candidate down for not knowing the CVE number, which is trivia. Mark them down if they can&#8217;t explain why a single gate in front of the app is fragile. For where each auth check belongs, see our guide to <a href=\"https:\/\/arc.dev\/employer-blog\/nextjs-app-router-authentication\/\">authentication in the Next.js App Router<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>A team moves middleware logic to the current proxy layer<\/strong><\/h3>\n\n\n\n<p><strong>Scenario:<\/strong> &#8220;We&#8217;re upgrading a Next.js 14 app. It has a middleware.ts doing locale detection, an A\/B test cookie, and a session check. What changes, and what would you review during the migration?&#8221;<\/p>\n\n\n\n<p><strong>What a strong answer covers:<\/strong> The file becomes proxy.ts, and the default export is renamed to proxy. The default runtime moves to Node.js, so Node APIs and libraries that previously failed on Edge now work, and you can remove previous Edge-only workarounds. They review the matcher config so the proxy isn&#8217;t running on static assets it doesn&#8217;t need to touch, and they check that only one proxy file exists, since Next.js enforces a single file for centralized proxy control.<\/p>\n\n\n\n<p><strong>Red flag:<\/strong> Insisting middleware.ts is the current name in Next.js 16, or claiming Edge is still the default runtime. Both are outdated as of Next.js 16. Give partial credit if the candidate is unsure and says so, then reasons correctly about what the layer should and shouldn&#8217;t do.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>An internationalized route and redirect rule create a navigation loop<\/strong><\/h3>\n\n\n\n<p><strong>Scenario:<\/strong> &#8220;After adding locale prefixes, users hitting \/ get stuck in a redirect loop between \/ and \/en. How do you debug it?&#8221;<\/p>\n\n\n\n<p><strong>What a strong answer covers:<\/strong> They trace the request path: which rules in the proxy match, what each one rewrites or redirects to, and whether the redirect target re-enters the same matcher. They check for a conflict between a next.config redirect and a proxy redirect both firing on the same path. The fix is narrowing the matcher so already-prefixed paths skip the rule, and being clear about which layer owns the locale decision.<\/p>\n\n\n\n<p><strong>Red flag:<\/strong> Adding another redirect to patch the loop. That&#8217;s a candidate who fixes symptoms. Strong candidates want to see the actual request chain before changing anything.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>How to actually run this in an interview<\/strong><\/h2>\n\n\n\n<p>Budget 8 to 12 minutes per scenario and plan for four to six of them in a 60-minute technical round. Rushing through ten questions gets you ten surface answers, which is exactly the trivia problem in a different shape.<\/p>\n\n\n\n<p>Open the scenario, then stay quiet. Read it once, let the candidate think, and resist filling the silence. The first 20 seconds of a real answer often include a clarifying question, which is a signal in itself.<\/p>\n\n\n\n<p>When an answer is textbook-correct but flat, ask for the scar. Useful follow-ups:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>&#8220;Have you shipped this? What went wrong the first time?&#8221;<\/li>\n\n\n\n<li>&#8220;What did you try before that worked?&#8221;<\/li>\n\n\n\n<li>&#8220;How would you know in production that this broke?&#8221;<\/li>\n\n\n\n<li>&#8220;What would you do differently with half the timeline?&#8221;<\/li>\n<\/ul>\n\n\n\n<p>Someone who has lived it answers immediately with specifics. Someone who read the docs pauses and generalizes.<\/p>\n\n\n\n<p>Push on the tradeoff, not the terminology. If a candidate says &#8220;I&#8217;d use on-demand revalidation,&#8221; ask what it costs. If they can&#8217;t name a downside, they haven&#8217;t used it under load.<\/p>\n\n\n\n<p>For non-technical interviewers: you can run these without writing code. Score against the strong-answer and red-flag notes above, record the session with consent, and have an engineer review the transcript for 15 minutes afterward.<\/p>\n\n\n\n<p>That&#8217;s a much cheaper use of engineering time than putting a senior developer in every first-round call. If you&#8217;re building out this same scenario-based approach for other parts of your stack, this Angular interview questions guide follows the same format for teams hiring across multiple frameworks. Arc&#8217;s <a href=\"https:\/\/arc.dev\/interview\">interview questions hub<\/a> collects the rest, from React and TypeScript to SQL and DevOps.<\/p>\n\n\n\n<p>An AI assistant helps here in one specific way. Paste the candidate&#8217;s answer into your assistant with the prompt: &#8220;This candidate is answering a Next.js caching question. Generate three follow-up questions that would distinguish someone who has debugged this in production from someone who read the documentation.&#8221;<\/p>\n\n\n\n<p>You get usable probes in seconds, and the engineer reviewing later can see whether the probes landed. The same trick works on take-home submissions: ask the assistant to flag where the client boundary sits and whether caching is explicit or accidental, then have your engineer verify the flags.<\/p>\n\n\n\n<p>Keep the scorecard identical across candidates, as different interviewers asking different questions produces data you can&#8217;t compare.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Frequently asked questions<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>How many Next.js interview questions should you ask in a technical round?<\/strong><\/h3>\n\n\n\n<p>Four to six scenario-based questions in a 60-minute round, budgeting 8 to 12 minutes each. Rushing through ten questions produces ten surface-level answers, which recreates the same trivia problem scenario questions are meant to fix. Depth on fewer questions reveals more about a candidate&#8217;s actual experience than breadth across many.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>What&#8217;s the difference between a trivia question and a scenario question in a technical interview?<\/strong><\/h3>\n\n\n\n<p>A trivia question (&#8220;What is a Server Component?&#8221;) has one correct, memorizable answer that documentation can supply. A scenario question (&#8220;A teammate added &#8216;use client&#8217; to an entire page for one button, what did that cost?&#8221;) forces a candidate to reason through a real tradeoff and defend a decision, which is much harder to fake by reading docs the night before an interview.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Is Next.js middleware still called middleware?<\/strong><\/h3>\n\n\n\n<p>No. Next.js 16 renamed the middleware.ts file to proxy.ts, and the exported function changed from middleware to proxy. The concept and its purpose (running code before a route resolves) are unchanged; only the naming and, separately, the default execution runtime have been updated.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Does Next.js cache fetch requests by default?<\/strong><\/h3>\n\n\n\n<p>It depends on the version, which is exactly why interviewers should verify current defaults rather than trust a memorized answer. Caching defaults for fetch and route segments have shifted across recent Next.js major versions, so a candidate who states a flat, version-agnostic rule (&#8220;fetch is always cached&#8221; or &#8220;fetch is never cached&#8221;) is likely repeating something read once rather than reasoning from current behavior.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>What should a non-technical interviewer do to evaluate a Next.js candidate?<\/strong><\/h3>\n\n\n\n<p>Run the scenario questions and score answers against a written rubric (does the answer name a specific mechanism, state a tradeoff, and describe a failure mode) rather than trying to judge technical correctness in real time. Recording the session with the candidate&#8217;s consent and having an engineer review the transcript for 15 minutes afterward is far cheaper than putting a senior developer in every first-round call.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Building a more reliable Next.js interview process<\/strong><\/h2>\n\n\n\n<p>Good Next.js interviews test decisions, not definitions. Pick four scenarios that match the work the hire will do, give each one enough time to breathe, and score every candidate on the same three things: naming the mechanism, stating the tradeoff, and describing the failure mode.<\/p>\n\n\n\n<p>Verify your questions against current documentation before every hiring round. Next.js 16 renamed the middleware layer to proxy.ts, moved its default runtime to Node.js, and shifted caching defaults across recent majors. Questions built on last year&#8217;s behavior punish candidates who are up to date.<\/p>\n\n\n\n<p>The red flags in this guide do more work than the questions themselves. A candidate who says &#8220;shorten the revalidate window&#8221; instead of &#8220;invalidate the tag on write&#8221; has told you how they&#8217;ll handle a real incident, and no amount of vocabulary covers that.<\/p>\n\n\n\n<p>Running interviews like this well takes real Next.js depth on your side of the table too, and that&#8217;s exactly the screening layer Arc handles before you ever see a candidate.<\/p>\n\n\n\n<p><strong>Arc pre-vets <\/strong><a href=\"https:\/\/arc.dev\/hire-developers\/nextjs\"><strong>Next.js developers<\/strong><\/a> for technical depth and English fluency before you see a profile. HireAI matches your requirements against a pool of 450,000+ vetted professionals and returns a shortlist in seconds.<\/p>\n\n\n\n<p><a href=\"https:\/\/arc.dev\/\"><strong>Hire vetted Next.js developers with Arc \u2192<\/strong><\/a><\/p>\n\n\n\n<script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@graph\": [\n    {\n      \"@type\": \"Article\",\n      \"headline\": \"Next.js interview questions that test App Router and RSC judgment\",\n      \"description\": \"Scenario-based Next.js interview questions on rendering, Server Components, caching, and the proxy layer, with strong-answer and red-flag notes.\",\n      \"image\": {\n        \"@type\": \"ImageObject\",\n        \"url\": \"https:\/\/cdn-employer-wp.arc.dev\/wp-content\/uploads\/2026\/10\/nextjs-interview-questions.png\"\n      },\n      \"author\": {\n        \"@type\": \"Organization\",\n        \"name\": \"Arc\",\n        \"url\": \"https:\/\/arc.dev\"\n      },\n      \"publisher\": {\n        \"@type\": \"Organization\",\n        \"name\": \"Arc\",\n        \"logo\": {\n          \"@type\": \"ImageObject\",\n          \"url\": \"https:\/\/cdn.arc.dev\/arc-next-landing\/images\/arc\/share-logo.png\"\n        }\n      },\n      \"datePublished\": \"2026-09-02\",\n      \"dateModified\": \"2026-10-07\",\n      \"mainEntityOfPage\": {\n        \"@type\": \"WebPage\",\n        \"@id\": \"https:\/\/arc.dev\/employer-blog\/nextjs-interview-questions\/\"\n      }\n    },\n    {\n      \"@type\": \"FAQPage\",\n      \"mainEntity\": [\n        {\n          \"@type\": \"Question\",\n          \"name\": \"How many Next.js interview questions should you ask in a technical round?\",\n          \"acceptedAnswer\": {\n            \"@type\": \"Answer\",\n            \"text\": \"Four to six scenario-based questions in a 60-minute round, budgeting 8 to 12 minutes each. Rushing through ten questions produces ten surface-level answers, which recreates the same trivia problem scenario questions are meant to fix. Depth on fewer questions reveals more about a candidate's actual experience than breadth across many.\"\n          }\n        },\n        {\n          \"@type\": \"Question\",\n          \"name\": \"What's the difference between a trivia question and a scenario question in a technical interview?\",\n          \"acceptedAnswer\": {\n            \"@type\": \"Answer\",\n            \"text\": \"A trivia question, such as what is a Server Component, has one correct, memorizable answer that documentation can supply. A scenario question, such as a teammate adding a client directive to an entire page for one button and what that costs, forces a candidate to reason through a real tradeoff and defend a decision, which is much harder to fake by reading docs the night before an interview.\"\n          }\n        },\n        {\n          \"@type\": \"Question\",\n          \"name\": \"Is Next.js middleware still called middleware?\",\n          \"acceptedAnswer\": {\n            \"@type\": \"Answer\",\n            \"text\": \"No. Next.js 16 renamed the middleware file to proxy, and the exported function changed from middleware to proxy. The concept and its purpose, running code before a route resolves, are unchanged. Only the naming and, separately, the default execution runtime have been updated.\"\n          }\n        },\n        {\n          \"@type\": \"Question\",\n          \"name\": \"Does Next.js cache fetch requests by default?\",\n          \"acceptedAnswer\": {\n            \"@type\": \"Answer\",\n            \"text\": \"It depends on the version, which is exactly why interviewers should verify current defaults rather than trust a memorized answer. Caching defaults for fetch requests and route segments have shifted across recent Next.js major versions, so a candidate who states a flat, version-agnostic rule, fetch is always cached or fetch is never cached, is likely repeating something read once rather than reasoning from current behavior.\"\n          }\n        },\n        {\n          \"@type\": \"Question\",\n          \"name\": \"What should a non-technical interviewer do to evaluate a Next.js candidate?\",\n          \"acceptedAnswer\": {\n            \"@type\": \"Answer\",\n            \"text\": \"Run the scenario questions and score answers against a written rubric, checking whether the answer names a specific mechanism, states a tradeoff, and describes a failure mode, rather than trying to judge technical correctness in real time. Recording the session with the candidate's consent and having an engineer review the transcript for 15 minutes afterward is a far cheaper use of engineering time than putting a senior developer in every first-round call.\"\n          }\n        }\n      ]\n    }\n  ]\n}\n\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>Most &#8220;Next.js interview questions&#8221; lists you&#8217;ll find online are trivia. They ask what ISR stands for, what getStaticProps did, or what a Server Component is. A candidate can pass every one by reading documentation the night before, without ever shipping a Next.js app that took real traffic. That gap costs money. The engineers who cause [&hellip;]<\/p>\n","protected":false},"author":15,"featured_media":5417,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-5416","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-hiring"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Next.js interview questions that test real judgment - Arc Employer Blog<\/title>\n<meta name=\"description\" content=\"Scenario-based Next.js interview questions on rendering, Server Components, caching, and the proxy layer, with strong-answer and red-flag notes.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/arc.dev\/employer-blog\/nextjs-interview-questions\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Next.js interview questions that test real judgment - Arc Employer Blog\" \/>\n<meta property=\"og:description\" content=\"Scenario-based Next.js interview questions on rendering, Server Components, caching, and the proxy layer, with strong-answer and red-flag notes.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/arc.dev\/employer-blog\/nextjs-interview-questions\/\" \/>\n<meta property=\"og:site_name\" content=\"Arc Employer Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/arcdotdev\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/arcdotdev\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-12T09:50:32+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-12T09:51:05+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/arc.dev\/employer-blog\/wp-content\/uploads\/2026\/10\/nextjs-interview-questions.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1672\" \/>\n\t<meta property=\"og:image:height\" content=\"941\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"The Arc Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@arcdotdev\" \/>\n<meta name=\"twitter:site\" content=\"@arcdotdev\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"The Arc Team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"25 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/arc.dev\\\/employer-blog\\\/nextjs-interview-questions\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/arc.dev\\\/employer-blog\\\/nextjs-interview-questions\\\/\"},\"author\":{\"name\":\"The Arc Team\",\"@id\":\"https:\\\/\\\/arc.dev\\\/employer-blog\\\/#\\\/schema\\\/person\\\/08dd4743f5c0f965590e77094c5579bc\"},\"headline\":\"Next.js interview questions that test App Router and RSC judgment\",\"datePublished\":\"2026-10-12T09:50:32+00:00\",\"dateModified\":\"2026-10-12T09:51:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/arc.dev\\\/employer-blog\\\/nextjs-interview-questions\\\/\"},\"wordCount\":5081,\"publisher\":{\"@id\":\"https:\\\/\\\/arc.dev\\\/employer-blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/arc.dev\\\/employer-blog\\\/nextjs-interview-questions\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/arc.dev\\\/employer-blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/nextjs-interview-questions.png\",\"articleSection\":[\"Hiring\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/arc.dev\\\/employer-blog\\\/nextjs-interview-questions\\\/\",\"url\":\"https:\\\/\\\/arc.dev\\\/employer-blog\\\/nextjs-interview-questions\\\/\",\"name\":\"Next.js interview questions that test real judgment - Arc Employer Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/arc.dev\\\/employer-blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/arc.dev\\\/employer-blog\\\/nextjs-interview-questions\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/arc.dev\\\/employer-blog\\\/nextjs-interview-questions\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/arc.dev\\\/employer-blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/nextjs-interview-questions.png\",\"datePublished\":\"2026-10-12T09:50:32+00:00\",\"dateModified\":\"2026-10-12T09:51:05+00:00\",\"description\":\"Scenario-based Next.js interview questions on rendering, Server Components, caching, and the proxy layer, with strong-answer and red-flag notes.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/arc.dev\\\/employer-blog\\\/nextjs-interview-questions\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/arc.dev\\\/employer-blog\\\/nextjs-interview-questions\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/arc.dev\\\/employer-blog\\\/nextjs-interview-questions\\\/#primaryimage\",\"url\":\"https:\\\/\\\/arc.dev\\\/employer-blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/nextjs-interview-questions.png\",\"contentUrl\":\"https:\\\/\\\/arc.dev\\\/employer-blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/nextjs-interview-questions.png\",\"width\":1672,\"height\":941,\"caption\":\"Next.js interview questions that test App Router and RSC judgment\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/arc.dev\\\/employer-blog\\\/nextjs-interview-questions\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/arc.dev\\\/employer-blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Next.js interview questions that test App Router and RSC judgment\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/arc.dev\\\/employer-blog\\\/#website\",\"url\":\"https:\\\/\\\/arc.dev\\\/employer-blog\\\/\",\"name\":\"Arc Employer Blog\",\"description\":\"Insights on hiring and remote work\",\"publisher\":{\"@id\":\"https:\\\/\\\/arc.dev\\\/employer-blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/arc.dev\\\/employer-blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/arc.dev\\\/employer-blog\\\/#organization\",\"name\":\"Arc.dev\",\"url\":\"https:\\\/\\\/arc.dev\\\/employer-blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/arc.dev\\\/employer-blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/arc.dev\\\/employer-blog\\\/wp-content\\\/uploads\\\/2022\\\/02\\\/Arc-alternate-logo.png\",\"contentUrl\":\"https:\\\/\\\/arc.dev\\\/employer-blog\\\/wp-content\\\/uploads\\\/2022\\\/02\\\/Arc-alternate-logo.png\",\"width\":512,\"height\":512,\"caption\":\"Arc.dev\"},\"image\":{\"@id\":\"https:\\\/\\\/arc.dev\\\/employer-blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/arcdotdev\",\"https:\\\/\\\/x.com\\\/arcdotdev\",\"https:\\\/\\\/www.instagram.com\\\/arcdotdev\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/arcdotdev\",\"https:\\\/\\\/www.youtube.com\\\/c\\\/Arcdotdev\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/arc.dev\\\/employer-blog\\\/#\\\/schema\\\/person\\\/08dd4743f5c0f965590e77094c5579bc\",\"name\":\"The Arc Team\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c1380473325c827343a6d47c7b5d6916c147171af99760766d2acb56da62ed02?s=96&d=mm&r=pg\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c1380473325c827343a6d47c7b5d6916c147171af99760766d2acb56da62ed02?s=96&d=mm&r=pg\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c1380473325c827343a6d47c7b5d6916c147171af99760766d2acb56da62ed02?s=96&d=mm&r=pg\",\"caption\":\"The Arc Team\"},\"description\":\"The Arc team provides articles and expert advice on tech careers and remote work. From helping beginners land their first junior role to supporting remote workers facing challenges at home or guiding mid-level professionals toward leadership, Arc covers it all!\",\"sameAs\":[\"https:\\\/\\\/arc.dev\\\/developer-blog\\\/\",\"https:\\\/\\\/www.facebook.com\\\/arcdotdev\",\"https:\\\/\\\/www.instagram.com\\\/arcdotdev\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/arcdotdev\",\"https:\\\/\\\/x.com\\\/arcdotdev\",\"https:\\\/\\\/www.youtube.com\\\/c\\\/Arcdotdev\"],\"url\":\"https:\\\/\\\/arc.dev\\\/employer-blog\\\/author\\\/thearcteam\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Next.js interview questions that test real judgment - Arc Employer Blog","description":"Scenario-based Next.js interview questions on rendering, Server Components, caching, and the proxy layer, with strong-answer and red-flag notes.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/arc.dev\/employer-blog\/nextjs-interview-questions\/","og_locale":"en_US","og_type":"article","og_title":"Next.js interview questions that test real judgment - Arc Employer Blog","og_description":"Scenario-based Next.js interview questions on rendering, Server Components, caching, and the proxy layer, with strong-answer and red-flag notes.","og_url":"https:\/\/arc.dev\/employer-blog\/nextjs-interview-questions\/","og_site_name":"Arc Employer Blog","article_publisher":"https:\/\/www.facebook.com\/arcdotdev","article_author":"https:\/\/www.facebook.com\/arcdotdev","article_published_time":"2026-10-12T09:50:32+00:00","article_modified_time":"2026-10-12T09:51:05+00:00","og_image":[{"width":1672,"height":941,"url":"https:\/\/arc.dev\/employer-blog\/wp-content\/uploads\/2026\/10\/nextjs-interview-questions.png","type":"image\/png"}],"author":"The Arc Team","twitter_card":"summary_large_image","twitter_creator":"@arcdotdev","twitter_site":"@arcdotdev","twitter_misc":{"Written by":"The Arc Team","Est. reading time":"25 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/arc.dev\/employer-blog\/nextjs-interview-questions\/#article","isPartOf":{"@id":"https:\/\/arc.dev\/employer-blog\/nextjs-interview-questions\/"},"author":{"name":"The Arc Team","@id":"https:\/\/arc.dev\/employer-blog\/#\/schema\/person\/08dd4743f5c0f965590e77094c5579bc"},"headline":"Next.js interview questions that test App Router and RSC judgment","datePublished":"2026-10-12T09:50:32+00:00","dateModified":"2026-10-12T09:51:05+00:00","mainEntityOfPage":{"@id":"https:\/\/arc.dev\/employer-blog\/nextjs-interview-questions\/"},"wordCount":5081,"publisher":{"@id":"https:\/\/arc.dev\/employer-blog\/#organization"},"image":{"@id":"https:\/\/arc.dev\/employer-blog\/nextjs-interview-questions\/#primaryimage"},"thumbnailUrl":"https:\/\/arc.dev\/employer-blog\/wp-content\/uploads\/2026\/10\/nextjs-interview-questions.png","articleSection":["Hiring"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/arc.dev\/employer-blog\/nextjs-interview-questions\/","url":"https:\/\/arc.dev\/employer-blog\/nextjs-interview-questions\/","name":"Next.js interview questions that test real judgment - Arc Employer Blog","isPartOf":{"@id":"https:\/\/arc.dev\/employer-blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/arc.dev\/employer-blog\/nextjs-interview-questions\/#primaryimage"},"image":{"@id":"https:\/\/arc.dev\/employer-blog\/nextjs-interview-questions\/#primaryimage"},"thumbnailUrl":"https:\/\/arc.dev\/employer-blog\/wp-content\/uploads\/2026\/10\/nextjs-interview-questions.png","datePublished":"2026-10-12T09:50:32+00:00","dateModified":"2026-10-12T09:51:05+00:00","description":"Scenario-based Next.js interview questions on rendering, Server Components, caching, and the proxy layer, with strong-answer and red-flag notes.","breadcrumb":{"@id":"https:\/\/arc.dev\/employer-blog\/nextjs-interview-questions\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/arc.dev\/employer-blog\/nextjs-interview-questions\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/arc.dev\/employer-blog\/nextjs-interview-questions\/#primaryimage","url":"https:\/\/arc.dev\/employer-blog\/wp-content\/uploads\/2026\/10\/nextjs-interview-questions.png","contentUrl":"https:\/\/arc.dev\/employer-blog\/wp-content\/uploads\/2026\/10\/nextjs-interview-questions.png","width":1672,"height":941,"caption":"Next.js interview questions that test App Router and RSC judgment"},{"@type":"BreadcrumbList","@id":"https:\/\/arc.dev\/employer-blog\/nextjs-interview-questions\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/arc.dev\/employer-blog\/"},{"@type":"ListItem","position":2,"name":"Next.js interview questions that test App Router and RSC judgment"}]},{"@type":"WebSite","@id":"https:\/\/arc.dev\/employer-blog\/#website","url":"https:\/\/arc.dev\/employer-blog\/","name":"Arc Employer Blog","description":"Insights on hiring and remote work","publisher":{"@id":"https:\/\/arc.dev\/employer-blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/arc.dev\/employer-blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/arc.dev\/employer-blog\/#organization","name":"Arc.dev","url":"https:\/\/arc.dev\/employer-blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/arc.dev\/employer-blog\/#\/schema\/logo\/image\/","url":"https:\/\/arc.dev\/employer-blog\/wp-content\/uploads\/2022\/02\/Arc-alternate-logo.png","contentUrl":"https:\/\/arc.dev\/employer-blog\/wp-content\/uploads\/2022\/02\/Arc-alternate-logo.png","width":512,"height":512,"caption":"Arc.dev"},"image":{"@id":"https:\/\/arc.dev\/employer-blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/arcdotdev","https:\/\/x.com\/arcdotdev","https:\/\/www.instagram.com\/arcdotdev\/","https:\/\/www.linkedin.com\/company\/arcdotdev","https:\/\/www.youtube.com\/c\/Arcdotdev"]},{"@type":"Person","@id":"https:\/\/arc.dev\/employer-blog\/#\/schema\/person\/08dd4743f5c0f965590e77094c5579bc","name":"The Arc Team","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/c1380473325c827343a6d47c7b5d6916c147171af99760766d2acb56da62ed02?s=96&d=mm&r=pg","url":"https:\/\/secure.gravatar.com\/avatar\/c1380473325c827343a6d47c7b5d6916c147171af99760766d2acb56da62ed02?s=96&d=mm&r=pg","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c1380473325c827343a6d47c7b5d6916c147171af99760766d2acb56da62ed02?s=96&d=mm&r=pg","caption":"The Arc Team"},"description":"The Arc team provides articles and expert advice on tech careers and remote work. From helping beginners land their first junior role to supporting remote workers facing challenges at home or guiding mid-level professionals toward leadership, Arc covers it all!","sameAs":["https:\/\/arc.dev\/developer-blog\/","https:\/\/www.facebook.com\/arcdotdev","https:\/\/www.instagram.com\/arcdotdev\/","https:\/\/www.linkedin.com\/company\/arcdotdev","https:\/\/x.com\/arcdotdev","https:\/\/www.youtube.com\/c\/Arcdotdev"],"url":"https:\/\/arc.dev\/employer-blog\/author\/thearcteam\/"}]}},"_links":{"self":[{"href":"https:\/\/arc.dev\/employer-blog\/wp-json\/wp\/v2\/posts\/5416","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/arc.dev\/employer-blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/arc.dev\/employer-blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/arc.dev\/employer-blog\/wp-json\/wp\/v2\/users\/15"}],"replies":[{"embeddable":true,"href":"https:\/\/arc.dev\/employer-blog\/wp-json\/wp\/v2\/comments?post=5416"}],"version-history":[{"count":2,"href":"https:\/\/arc.dev\/employer-blog\/wp-json\/wp\/v2\/posts\/5416\/revisions"}],"predecessor-version":[{"id":5419,"href":"https:\/\/arc.dev\/employer-blog\/wp-json\/wp\/v2\/posts\/5416\/revisions\/5419"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/arc.dev\/employer-blog\/wp-json\/wp\/v2\/media\/5417"}],"wp:attachment":[{"href":"https:\/\/arc.dev\/employer-blog\/wp-json\/wp\/v2\/media?parent=5416"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/arc.dev\/employer-blog\/wp-json\/wp\/v2\/categories?post=5416"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/arc.dev\/employer-blog\/wp-json\/wp\/v2\/tags?post=5416"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}