Resource routes in Remix

I'm a full-stack developer from South Africa 🇿🇦. I love writing about JavaScript, HTML and CSS.
Search for a command to run...

I'm a full-stack developer from South Africa 🇿🇦. I love writing about JavaScript, HTML and CSS.
No comments yet. Be the first to comment.
Most of you know me for my consistency, a golden arrow in my blog series. I've written 1000 articles in 1008 days! Almost an article a day, and my honeymoon was the only holiday I ever took. I'm super proud of this achievement; it has been a fantasti...

It's not the first time I'll be talking about community. I think it's an essential aspect of any successful tool. This shows in my previous explorations of Astro, Medusa, and now Vendure as well. All these products thrive in a super open, welcoming, ...

The cool part about Vendure is how easy it is to set up and how abstract each layer is. Basically, we get the following elements: External database Server Worker Admin UI Frontend While this is amazing, it also brings a bit of complexity when it co...

The previous article looked at customizing Vendure on a data and process level. In this article, we'll look at customizing emails, as they are often a big part of a webshop system. We'll be looking at two different layers of customization for customi...

Even though Vendure is a pretty significant project out of the box, in some cases, we might want to go in and modify some elements to work to our specific use case. In this article, I'll take a high-level look at some elements we can customize within...

So far, we have been looking at routes in Remix, and they are always HTML-based output routes.
It means they render some HTML, but what happens if we want to have a different route type?
Some examples:
Don't worry. Remix got your back on that, as we can use their fantastic resource routes for this.
There are multiple ways of achieving the endpoint URL to create these routes.
You can create any of the following formats:
- app/routes/reports/$id/pdf.ts
- app/routes/reports/$id[.pdf].ts
- app/routes/reports/$id[.]pdf.ts
- app/routes/reports.$id[.]pdf.ts
All of these will have the same output format:
http://yourwebsite.com/reports/id.pdf
But let's see how we can output it as a file rather than plain HTML. To achieve this we have to use the loader function to change our output like this:
export async function loader({ params }) {
const report = await getReport(params.id);
const pdf = await generateReportPDF(report);
return new Response(pdf, {
status: 200,
headers: {
'Content-Type': 'application/pdf',
},
});
}
This example uses some functions we don't have, including the getReport and generateReportPDF functions.
This means it's only an example of how you can achieve it (taken from the official Remix docs).
Let's say we instead want to have a JSON format?
Let's change our document to the following format:
app/routes/reports.$id[.]pdf.ts
import { json } from '@remix-run/node';
export async function loader({ params }) {
return json({ foo: params.id });
}
We format the ID from our dynamic URL into a JSON object in this example.

This is pretty cool. This way, we can support all these different formats in Remix.
Thank you for reading my blog. Feel free to subscribe to my email newsletter and connect on Facebook or Twitter