On this page
Routes
Root.js uses filesystem based routing similar to Next.js. Routes are defined within the routes/ folder and render TSX files as server-rendered components.
Below are a few examples of routes files and the final serving path:
Route | Matching URL(s) |
---|---|
@/routes/index.tsx |
/ |
@/routes/about.tsx |
/about |
@/routes/blog/index.tsx |
/blog |
@/routes/blog/[slug].tsx |
|
Page
The route's default export is automatically rendered as a TSX server component.
Example:
// @/routes/index.tsx
export default function Page() {
return <h1>Hello, world!</h1>
}
If you need to fetch data to pass to your Page component, you can export a function called getStaticProps() (SSG) or handle() (SSR) from your route file. See more below.
getStaticProps()
If a exported function called getStaticProps exists in the route, the props returned from that function will be passed to the component.
Routes that use placeholder params like [slug].tsx will have these params passed into a context variable to getStaticProps().
Example:
// @/routes/[slug].tsx
import {GetStaticProps} from '@blinkk/root';
export default function Page(props) {
console.log('db content: ', props.content);
return <h1>The slug is {props.slug}</h1>;
}
export const getStaticProps: GetStaticProps = async (ctx) => {
const slug = ctx.params.slug;
const content = await fetchDataFromDatabase(slug);
return {props: {slug, content}};
};
getStaticPaths()
For routes that use placeholder params, projects that build sites using SSG will need to deterministically know what paths are available for that route. Export a getStaticPaths() function in the route and return a list of params.
Example:
// @/routes/[slug].tsx
import {GetStaticPaths} from '@blinkk/root';
export default function Page(props) {
return <h1>hello world</h1>;
}
export const getStaticPaths: GetStaticPaths = async (ctx) => {
const slugs = await listAllFromDb(slug);
return {paths: slugs.map((slug) => {params: {slug}})};
};
handle()
For routes that prefer to run in SSR mode, you can export a function called handle() that is similar to an Express.js request handler. Use req.ctx.render() to render the route's Page component.
// @/routes/[slug].tsx
import {Handler, HandlerContext} from '@blinkk/root';
export default function Page(props) {
const name = props.name || 'World';
return <h1>Hello, {name}!</h1>;
}
export const handle: Handler = async (req, res) => {
const name = req.query.name;
const ctx = req.handlerContext as HandlerContext;
return ctx.render({name: name});
};
404.tsx
To define a custom 404 page, add a route at routes/404.tsx. On prod, that route will be rendered when no other route matches the given request.