The drop-in replacement for everything routing wise in Next.js.
- Declaration of DRY and concise routes
- Two-way usage, works on both client and server
- Absolute, static and dynamic paths (using path-to-regexp)
- Opt-in routing system (via middleware)
- Next.js Router replacement
- Next.js Link replacement
$ npm install next-universal-route
or
$ yarn add next-universal-route
For fully featured demo check CodeSandbox or to get a quick peek take a look at example below.
// routes.js
const { Route } = require('next-universal-route');
const IndexRoute = new Route('/', 'index');
const PostRoute = new Route('/posts/:id/:slug', 'post');
const GitHubRoute = new Route('https://www.github.com');
module.exports = {
IndexRoute,
PostRoute,
GitHubRoute,
};
// server.js
const express = require('express');
const next = require('next');
const { getRequestHandler } = require('next-universal-route');
const routes = require('./routes');
const app = next({ dev: process.env.NODE_ENV !== 'production' });
const handler = getRequestHandler(app, routes);
app.prepare().then(() => {
express().use(handler).listen(3000);
});
// pages/index.js
import { Link } from 'next-universal-route';
import { IndexRoute, PostRoute, GitHub } from '../routes';
<Link href={IndexRoute.generateUrl()}>
<a>Index</a>
</Link>
<Link href={PostRoute.generateUrl({ id: 1, slug: 'first-post' })}>
<a>Post</a>
</Link>
<Link href={GitHubRoute.generateUrl()}>
<a>GitHub</a>
</Link>
When using a custom server with a server file, for example called server.js
, make sure you update the scripts key in package.json
to:
{
"scripts": {
"dev": "node server.js",
"build": "next build",
"start": "NODE_ENV=production node server.js"
}
}
Route.constructor(path: string, page?: string, urlFormatter?: Function, customHandler?: Function): Route
Instantiates a Route object to be used throughout the application.
-
To create the route with absolute path, it needs to start with
http
- page can/should be ommited as it won't be used
- urlFormatter can be ommited as it won't work on absolute paths
-
To create SPA friendly routes you have to pass relative paths.
- path either be static or dynamic (using path-to-regexp)
- page is required and it should correspond to page in
pages/
- it's possible to pass extra params using query strings syntax which can be accessed inside your page, but won't be shown to your user
- urlFormatter is optional and it takes a function which will run on every given parameter when
Route.generateUrl
is called - customHandler is optional and takes same arguments as the Next.js's app.render functions
Generates a NextRoute object which is used for client-side routing. It will generate both href
and as
via toHref
and toAs
methods.
- If using static routes,
Route.generateUrl
can be called without any arguments - If generating dynamic routes you'll have to pass params and optionally queryStringParams
- params is the object which corresponds to path-to-regexp params
- queryStringparams is the object with query string key/values pairs
Generates as
prop to pass to Next.js's Link Component.
Generates href
prop to pass to Next.js's Link Component.
Returns path-to-regexp string for given route.
Returns name of the page for given route.
Returns an object which contains both params and query strings.
Wraps Next.js's Router.push
.
Wraps Next.js's Router.prefetch
.
Wraps Next.js's Router.replace
.
Wraps Next.js's Router.push
and updates only passed params.