Routing Differences with PWA Kit

PWA Kit uses React Router 5 with programmatic route arrays and manual splitting patterns. Storefront Next uses React Router 7 file-based routing with native nested layouts, typed loaders/actions, and automatic route-level splitting. Migrating generally means converting centralized route configuration into route files and moving route data logic into exports.

Key Differences 

AspectPWA KitStorefront Next
Router VersionReact Router 5React Router 7 (framework mode)
Route DefinitionProgrammatic (array in routes.jsx)File-based (files in routes/)
Code SplittingManual via @loadable/componentAutomatic per route file
Data FetchingInside components (hooks)Outside components (loader/clientLoader)
Loading StatesManual isLoading flagsDeclarative via Suspense
Nested LayoutsManual component compositionBuilt-in via <Outlet />
Resource RoutesExpress routes in ssr.jsAction files (action.*.tsx)
Multisite URLsconfigureRoutes() expansionDeclarative config in config.server.ts (url.prefix, url.search) with automatic detection middleware
Type SafetyJavaScriptTypeScript with typed loaders

Route Definition Comparison 

PWA Kit:

1// Centralized route array
2export const routes = [
3  { path: "/product/:productId", component: ProductDetail },
4  { path: "/account", component: Account },
5  { path: "/account/orders", component: Orders },
6];

Storefront Next:

1src/routes/
2├── product.$productId.tsx    # /product/:productId
3├── account.tsx               # /account (layout)
4├── account._index.tsx        # /account (index)
5└── account.orders.tsx        # /account/orders

Navigation API Comparison 

PWA Kit (React Router 5):

1import { useHistory, useParams } from "react-router-dom";
2
3const history = useHistory();
4history.push("/cart");
5history.replace("/new-path");

Storefront Next (React Router 7):

1import { useNavigate, useParams } from "react-router";
2
3const navigate = useNavigate();
4navigate("/cart");
5navigate("/new-path", { replace: true });

Key Similarities 

  1. Dynamic Parameters: Both use :param syntax (PWA Kit in path string, Storefront Next in file name with $).
  2. Catch-All Routes: Both support wildcard routes (* in PWA Kit, $.tsx in Storefront Next).
  3. Programmatic Navigation: Both provide hooks for imperative navigation.
  4. Route Parameter Access: Both provide useParams() hook for accessing URL parameters.

Storefront Conversion Considerations 

  1. Route File Creation: Each route in routes.jsx becomes a separate file in src/routes/.
  2. Naming Convention: Learn the flat routes naming pattern ($ for params, . for nesting).
  3. Data Fetching: Move data fetching from component hooks to loader/clientLoader exports.
  4. Layout Routes: Use layout routes with <Outlet /> instead of manual nesting.
  5. Resource Routes: Convert Express API routes to action.*.tsx files.
  6. Loading States: Replace isLoading checks with Suspense boundaries via createPage.

References