Next.js vs Remix, deux frameworks très populaires et ont des fans très dévoués dans la communauté des développeurs. Tous deux sont des frameworks JavaScript destinés à la création d’applications web et sont construits sur la base de React. Ils offrent des fonctionnalités telles que le rendu côté serveur, le routage et les optimisations de bundle. Cependant, ils diffèrent dans leur approche de ces fonctionnalités, dans leur philosophie globale et dans le soutien de la communauté. Comparons les deux.
Commençons par passer en revue quelques éléments clés.
SSR vs SSG vs CSR
Le rendu côté serveur (SSR), la génération de sites statiques (SSG) et le rendu côté client (CSR) sont trois méthodes différentes de rendu des pages web.
Le CSR consiste à générer du HTML côté client à l’aide de JavaScript, après le chargement initial de la page. Cette approche est couramment utilisée pour les applications web dynamiques qui nécessitent des mises à jour fréquentes et des données en temps réel. Elle permet une expérience utilisateur plus interactive, mais peut entraîner des temps de chargement initial des pages plus lents. React, la bibliothèque sur laquelle Next.js et Remix sont construits, est connue pour ses capacités solides en matière de CSR.
La SSR, quant à elle, consiste à générer du HTML côté serveur et à l’envoyer au client, où il est affiché dans le navigateur web de l’utilisateur. Cette méthode permet d’accélérer le chargement des pages et d’améliorer le référencement (SEO), car les moteurs de recherche peuvent indexer le contenu des pages plus facilement. Remix et Next.js sont tous deux connus pour leurs fonctionnalités SSG robustes, bien que Remix soit encore plus optimal à cet égard.
SSG signifie générer des fichiers HTML au moment de la construction, qui peuvent ensuite être servis de manière statique aux clients. Cette approche permet d’obtenir des temps de chargement de page encore plus rapides que la SSR, puisqu’il n’est pas nécessaire de générer la page sur le serveur pour chaque requête. Les sites statiques sont également plus sûrs et plus évolutifs. Le principal inconvénient de la SSG est que, si elle peut être une bonne option pour les petits sites qui ne changent pas souvent, elle est généralement assez fastidieuse pour les sites comportant de nombreuses pages avec des données qui changent souvent.
Qu’est-ce que Next.js ?
Next.js est un framework React open-source conçu par Vercel, connu pour ses robustes capacités de rendu côté serveur. Il permet le ‘automatic code splitting’, le ‘folder-based routing’, le ‘pre-rendering’, la génération de sites statiques et un support pour CSS en JS et Sass.
Qu’est-ce que Remix ?
Remix est un cadre d’application full-stack qui utilise React comme couche de visualisation et adopte les API Web standard. Il permet aux développeurs de créer d’excellentes expériences utilisateur en mettant l’accent sur les normes Web, en utilisant à la fois le rendu côté client et le rendu côté serveur. Les applications créées avec Remix peuvent être exécutées n’importe où et utilisent le rendu côté serveur pour manipuler les données et rendre le contenu HTML sur le serveur, en envoyant aussi peu de JavaScript que possible au client. Remix, qui était à l’origine un framework premium basé sur un abonnement, a été lancé en tant que framework open-source fin 2021 et n’a cessé de gagner en popularité depuis. En 2022, Remix a été racheté par Shopify.
Intéressons-nous maintenant à la comparaison Next.js vs Remix.
Routing
Next.js et Remix utilisent tous deux un système de routing basé sur les fichiers pour le rendu des pages. Cela signifie que chaque page est stockée dans un fichier séparé et est associée à un itinéraire basé sur son nom de fichier. Au final, chaque page est rendue sous la forme d’un composant React.
Dans Next.js, les fichiers à l’intérieur du dossier /pages deviennent automatiquement des routes, grâce à leur propre routeur utilisant le système de fichiers.
pages/index.js -> /
pages/products/index.ts -> /products
pages/products/create.ts -> /products/create
Remix utilise React Router v6 en interne et dispose d’un système de routing basé sur un système de fichiers. Dans Remix, les routes sont stockées dans un dossier routes/
et ont les mêmes URL que dans Next.js.
app/routes/index.js -> /
aps/routes/products/index.ts -> /product
app/routes/products/create.ts -> /products/create
Comment migrer d’un monolithe vers le headless commerce
Data Loading
Les deux frameworks offrent plusieurs façons de charger les données.
Next.js propose deux options pour le chargement des données, en fonction du type de page construit. La première option est getStaticProps
, qui récupère les données au moment de la construction et les fournit en tant que composant props. Cette option est utilisée pour la génération de sites statiques et la régénération statique incrémentale si l’intervalle de revalidation est défini.
export async function getStaticProps({ params }) {
const productList = await getProductList();
return {
props: {
productList,
slug: params.slug
}
}
}
La deuxième option est getServerSideProps (SSR) – elle récupère des données côté serveur au moment de l’exécution et fournit les données renvoyées en tant que composants de la page.
export async function getServerSideProps(context) {
return {
props: {}, // will be passed to the page component as props
}
}
Remix utilise une approche différente de Next.js pour charger les données. Il fournit une fonction loader
à utiliser sur chaque fichier d’itinéraire, qui fonctionne côté serveur au moment de l’exécution. Alternativement, sur le composant de la page, vous pouvez utiliser le crochet useLoaderData
pour rassembler ces données.
API Handling
Remix prend en charge les cookies et les sessions de manière native, tandis que Next.js dispose de fonctions intégrées beaucoup moins intuitives pour les gérer. Dans Remix et Next.js, les développeurs ont un contrôle total sur les demandes et les réponses de l’API.
Cookies
import { createCookie } from "@remix-run/node";
export const userPrefs = createCookie("user-prefs", {
maxAge: 604_800 // one week
});
Sessions
import { createCookieSessionStorage } from "@remix-run/node";
const { getSession, commitSession, destroySession } =
createCookieSessionStorage({
// a Cookie from `createCookie` or the CookieOptions to create one
cookie: {
name: "__session",
// all of these are optional
domain: "remix.run",
expires: new Date(Date.now() + 60),
httpOnly: true,
maxAge: 60,
path: "/",
sameSite: "lax",
secrets: ["s3cret1"],
secure: true
}
});
export { getSession, commitSession, destroySession };
Data Mutations
Alors que Next.js offre quelques moyens de charger des données, il n’y a pas de moyen intégré d’effectuer des mutations. Cela signifie que vous devriez créer un formulaire, attacher un onSubmit
, empêcher le comportement par défaut, obtenir les valeurs d’entrée, puis envoyer les données en utilisant l’API Fetch vers une route API, et ajouter quelques états pour gérer l’état de chargement, stocker toute erreur, etc.
D’un autre côté, Remix offre un composant Form
intégré qui vous permet de décider si la méthode est GET ou POST et de définir une action avec une URL pour envoyer les données. Vous pouvez alors placer les entrées dans le formulaire, et Remix se charge d’envoyer les valeurs du formulaire à l’action avec la bonne méthode et conserve un état de chargement. Il interrompt également les requêtes si le formulaire est envoyé à nouveau, et plus encore. La requête peut être envoyée à n’importe quelle route, pas seulement aux routes de ressources. Si la méthode est GET, Remix exécutera la fonction loader
, et si la méthode est POST, il exécutera la fonction action
. De plus, si vous avez besoin d’envoyer un formulaire de manière programmatique, vous pouvez utiliser le crochet useFetcher
ou useSubmit
, qui envoie des données à chaque frappe de touche ou après qu’une case à cocher soit cliquée.
Styling
Next.js est livré avec styled-jsx et des modules CSS. Des bibliothèques CSS supplémentaires ou des frameworks peuvent être ajoutés avec une certaine configuration ou des plugins. En revanche, le CSS dans Remix a longtemps reposé sur une approche bricolée avec les balises <link>
. En 2023, l’équipe Remix a apporté plusieurs améliorations et fournit maintenant des moyens de travailler avec les façons les plus courantes de styliser votre application. Derrière les drapeaux de fonctionnalité unstable_
, on peut maintenant utiliser TailwindCSS, PostCSS, CSS bundling, CSS Modules ou Vanilla extract.
Optimisation des images
Next.js a un composant intégré appelé next/image
qui permet l’optimisation des images, le chargement paresseux, le contrôle de la taille et l’intégration des chargeurs. Ce composant permet d’optimiser automatiquement les images.
En revanche, Remix n’a pas de support d’optimisation d’image intégré mais offre un moyen d’importer des images et d’obtenir une URL en retour. Alternativement, le préfixe img:
dans le chemin d’importation peut être utilisé pour obtenir l’URL de l’image et effectuer quelques transformations simples, récupérer plusieurs URL à utiliser dans srcset
, un URL de remplacement, et changer la qualité.
Gestion des erreurs
Alors que Next.js vous permet de définir des pages spéciales pour la gestion des erreurs, Remix vous permet d’exporter un composant ErrorBoundary
dans n’importe quel module de route pour gérer des erreurs de route spécifiques. Si une route est imbriquée, seule la route imbriquée verra ses erreurs gérées par le composant ErrorBoundary
, tandis que la route mère continuera à fonctionner normalement.
Alors, lequel est mieux ?
En fin de compte, le choix entre Next.js vs Remix dépend de vos besoins et objectifs spécifiques. Les deux frameworks sont opinionated et ont leur propre approche du développement web. Next.js est une excellente option pour les applications qui nécessitent un rendu côté serveur. Son ensemble de fonctionnalités robustes, y compris la génération de sites statiques, la division automatique du code et les importations dynamiques, en font un outil idéal pour les projets d’entreprise.
D’autre part, Remix est une excellente alternative pour les développeurs qui accordent de l’importance à l’expérience du développeur et à l’évolutivité. Son approche plus personnalisable et flexible, son puissant système de routing et l’accent mis sur la réutilisation des composants permettent aux développeurs de créer des applications complexes avec facilité. En outre, l’accent mis sur l’accessibilité et l’inclusivité en fait un excellent choix pour la création de sites web et d’applications destinés à un large public.
En définitive, les deux frameworks ont leurs forces et leurs faiblesses. Quel que soit le framework choisi, Next.js et Remix sont des outils puissants pour créer des applications web performantes, évolutives et accessibles.