What is supported
Next.js 16.3.6, 16.3.7, 16.3.8 and 16.4.0, App Router and Pages Router. Key:
- β works: verified in a browser or over HTTP;
- π‘ expected to work: not verified yet;
- π§ planned: not done yet; where it would otherwise fail silently, refused at install until it is;
- β not possible for a zone, and refused at install so it never fails silently.
Routing#
page, layout, dynamic routes, catch-all, optional catch-all, route groups, parallel routes |
β |
loading (streaming), error, not-found |
β |
| Intercepting routes (modals) | β |
Route handlers (route.ts) |
β |
A zone's metadata routes (/blog/sitemap.xml, /blog/opengraph-image) |
β
(the root /sitemap.xml and /robots.txt are the shell's) |
| Mounts and aliases | β |
The shell's proxy.ts in front of every zone |
β |
A zone's own proxy.ts |
β (move its logic into the shell's proxy) |
A zone's headers, redirects, rewrites (see routing rules) |
β |
basePath, i18n, trailingSlash, assetPrefix, skipTrailingSlashRedirect, cacheComponents, partialPrefetching different from the shell's |
β |
Navigation#
<Link> shell β zone and zone β zone, Back/Forward, prefetch (App Router pages) |
β soft, state kept |
<Link> to or from a zone's Pages Router page |
β soft inside that zone; a new document to anywhere else (Next's rule between the routers; see Zones on the Pages Router) |
useRouter, usePathname, useParams, useSearchParams, router.push into another zone |
β |
redirect() into another zone, notFound() |
β |
permanentRedirect, forbidden, unauthorized |
π‘ |
| New client code after a version swap, even for a page an open tab has cached | β
(with <ZoneUpdates />) |
| A shared package at different versions in different zones, in one page | β each zone runs its own version (concepts) |
Rendering and data#
| Server and client components, one React | β |
| Server actions (with bound arguments) | β |
Prerendered pages, ISR, generateStaticParams (with dynamicParams and fallback) |
β |
revalidateTag and revalidatePath across zones, unstable_cache |
β |
cookies, headers, connection |
β |
'use cache', cacheTag, cacheLife, Cache Components / PPR |
β
(cacheComponents must be the same in the shell and every zone) |
| Edge runtime in a zone | π§ refused at install today (use the Node.js runtime) |
Assets#
| Client chunks, CSS modules | β |
next/font |
β |
next/image with local images (imported, or from the zone's public/) |
β |
A zone's own images config (remote patternsβ¦) that differs from the shell's |
π§ refused at install today (put it in the shell's config, which serves every zone). A zone with no images config, or the shell's, installs |
A zone's public/ files, under its mount |
β (see assets) |
Process#
| Instrumentation, the shell's and each zone's | β |
A zone's instrumentation-client.ts |
β (put it in the shell) |
A zone's dependencies (serverExternalPackages included), wherever its build is stored |
β
(they resolve from the shell's node_modules) |
A package only in a zone's own node_modules (not hoisted by the workspace) |
β
bundled into the zone's build; π‘ as a serverExternalPackages entry, which must be in the shell's node_modules |
| Zones built with a different Next or React than the server's | β |
| Many requests at once across zones, several installs at once, and swaps under load | β |
A shell with its own cacheHandler (a remote cache) |
β (it keeps every key but the zones' pages, which stay per version) |
A zone run alone (next start, next dev), with its aliases |
β (running alone) |
next dev across zones |
β
next-zones dev: HMR and soft navigation, every zone at once |
Pages Router (pages/) in a zone: static pages, getStaticProps (prerendered, fallback, revalidate), getServerSideProps, its own _app and _document, live installs |
β in every mode (Zones on the Pages Router) |
A zone's pages/api/ (served at /api/β¦, outside its mount) |
β (route handlers under the mount, app/<mount>/β¦/route.ts, or the shell's) |
output: "export" |
β both modes: one static site, soft navigation between zones (build and start) |
output: "standalone" |
β both modes: the folder alone is the deploy (build and start) |
Zone images#
| Images entering the store by a pull from a source (HTTP, a folder, one's own), streamed and checked | β (zone images) |
| Uploading an image to Zones | β by design: endpoints only ask Zones to pull |
Pulls on a ping, for a zone with livePull |
β (live pulls) |
| Images of hundreds of MB | β streamed: memory does not grow with the image |
Images as .zip, and a repository's archive of a tag (one top-level folder) |
β |
Pulls over a shared link: stalls and dropped connections resumed with Range |
β |
service-connector as the source (fromConnector) |
β against its documented API |
| A pull that would fill the disk | β refused before it starts, or stopped while it runs (the disk) |
| Pruning old images, automatically or on request | β (pruning) |
One app#
Every zone built into one Next app (mode: "single"), served by next start |
β (build and start) |
Each zone's own @/* and its types, in that one app |
β
(types checked per zone, with its own tsconfig) |
| Instrumentation in that one app | β as on Zones: the shell's for every route, each zone's for its own |
| Installing a zone into it while it runs | β by design: that is what images and Zones are for |