This application uses bun
as the package manager/tester/runtime to achieve exceptional performances:
Install the dependancies
bun i
Launch the application in dev mode:
bun dev
This project uses Panda CSS for styling.
This project uses TanStack Router. The initial setup is a file based router. Which means that the routes are managed as fiels in src/routes
.
To add a new route to your application just add another a new file in the ./src/routes
directory.
TanStack will automatically generate the content of the route file for you.
Now that you have two routes you can use a Link
component to navigate between them.
To use SPA (Single Page Application) navigation you will need to import the Link
component from @tanstack/solid-router
.
import { Link } from "@tanstack/solid-router";
Then anywhere in your JSX you can use it like so:
<Link to="/about">About</Link>
This will create a link that will navigate to the /about
route.
More information on the Link
component can be found in the Link documentation.
In the File Based Routing setup the layout is located in src/routes/__root.tsx
. Anything you add to the root route will appear in all the routes. The route content will appear in the JSX where you use the <Outlet />
component.
Here is an example layout that includes a header:
import { Outlet, createRootRoute } from '@tanstack/solid-router'
import { TanStackRouterDevtools } from '@tanstack/solid-router-devtools'
import { Link } from "@tanstack/solid-router";
export const Route = createRootRoute({
component: () => (
<>
<header>
<nav>
<Link to="/">Home</Link>
<Link to="/about">About</Link>
</nav>
</header>
<Outlet />
<TanStackRouterDevtools />
</>
),
})
The <TanStackRouterDevtools />
component is not required so you can remove it if you don't want it in your layout.
More information on layouts can be found in the Layouts documentation.
There are multiple ways to fetch data in your application. You can use TanStack Query to fetch data from a server. But you can also use the loader
functionality built into TanStack Router to load the data for a route before it's rendered.
For example:
const peopleRoute = createRoute({
getParentRoute: () => rootRoute,
path: "/people",
loader: async () => {
const response = await fetch("https://swapi.dev/api/people");
return response.json() as Promise<{
results: {
name: string;
}[];
}>;
},
component: () => {
const data = peopleRoute.useLoaderData();
return (
<ul>
{data.results.map((person) => (
<li key={person.name}>{person.name}</li>
))}
</ul>
);
},
});
Loaders simplify your data fetching logic dramatically. Check out more information in the Loader documentation.
This project uses Biome for linting and formatting. The following scripts are available:
bun run lint
bun run format
bun run check
To build this application for production:
bun run build