Mise en place du projet Remix et initialisation de Strapi 5 avec la configuration de base.
Dans ce chapitre, tu vas mettre en place ton frontend avec Remix et ton backend avec Strapi 5. À la fin, tu pourras lancer une appli Remix qui consomme l’API Strapi pour afficher des produits. Allez, on s’y met !
1npx create-remix@latest frontend2? Where to create your app: ./frontend3? TypeScript or JavaScript: TypeScript4? Server entry file type: remix.config.js5? Deploy target: Remix App Server
1cd frontend2npm install3npm run dev
Pars la doc des loaders Remix pour comprendre comment fetcher des données côté serveur.
1frontend/2├── app/3│ ├── entry.client.tsx4│ ├── entry.server.tsx5│ ├── root.tsx6│ └── routes/7│ └── index.tsx8├── public/9├── remix.config.js10├── package.json11└── tsconfig.json
Tu peux aussi organiser ton frontend et ton backend en monorepo :
1/apps/frontend2/apps/backend
Remix démarre sur le port 3000 et Strapi sur le 1337 par défaut : choisis bien ou ajoute un proxy.
1npm create strapi@5 backend --quickstart
Cette commande :
package.json
1{2"name": "backend",3"private": true,4"scripts": {5"develop": "strapi develop", // ^? démarre Strapi en mode dev6"start": "strapi start" // ^? build + start en prod7},8"dependencies": {9"@strapi/strapi": "5.0.0",10"@strapi/plugin-users-permissions": "5.0.0",11"better-sqlite3": "9.4.3"12}13}
1DATABASE_CLIENT=sqlite2DATABASE_FILENAME=./data/db.sqlite3STRAPI_JWT_SECRET=ta-clef-super-secrete
Génére un STRAPI_JWT_SECRET
avec :
1openssl rand -hex 32
1cd backend2npm run develop
Tu peux maintenant accéder à l’admin Strapi sur http://localhost:1337/admin et créer ta première collection (Produits, Catégories, …).
Dans frontend
, crée un fichier .env
:
1STRAPI_API_URL=http://localhost:1337/api
N’oublie pas d’ajouter frontend/.env
et backend/.env
à ton .gitignore
.
Dans app/routes/index.tsx
, on va récupérer la liste des produits :
1import type { LoaderFunction } from "@remix-run/node";2import { json, useLoaderData } from "@remix-run/react";34export const loader: LoaderFunction = async () => {5const res = await fetch(6`${process.env.STRAPI_API_URL}/products?populate=images`7);8// @callout: on récupère tous les produits et leurs images9const data = await res.json();10return json(data);11};1213export default function Index() {14const { data } = useLoaderData<typeof loader>();15return (16<main>17<h1>Nos produits</h1>18<ul>19{data.map((p: any) => (20<li key={p.id}>{p.attributes.name}</li>21))}22</ul>23</main>24);25}
Les routes Remix reposent sur React Router, mais enrichies de loaders et d’actions.
Pour forcer Remix à recharger l’API toutes les X secondes :
1export const loader: LoaderFunction = async () => {2const res = await fetch(3`${process.env.STRAPI_API_URL}/products`,4{ next: { revalidate: 60 } }5);6return json(await res.json());7};
Categories
avec un champ titre
.app/routes/categories.tsx
et utilise un loader pour fetcher /categories
.Ready ? Dans le prochain chapitre, tu verras comment gérer l’authentification et les permissions avec Strapi et Remix !