Maison >interface Web >js tutoriel >Les résolveurs angulaires sont-ils sous assistance respiratoire ?
Je parcourais Tech Twitter il y a quelques mois, quand j'ai vu ce tweet du tristement célèbre Brandon :
Si vous ne le savez pas, Brandon a créé AnalogJS, le méta-framework de type NextJS pour Angular. Je suis un grand fan de ce qu'il fait pour la communauté Angular, j'ai donc dû répondre. Il sera le premier à vous dire que je veux tout résoudre avec des résolveurs.
Et...
Pas un... un seul... like ou réponse.
Je ne publie pas beaucoup sur Twitter et je n'ai pas non plus d'abonnés, donc je n'y ai rien pensé.
Cependant, je suis tombé à nouveau sur ce post par hasard et j'ai lu les commentaires, et j'ai réalisé que personne n'était d'accord avec moi ! Honnêtement, je me demande s'ils comprennent même de quoi je parle.
Il existe en fait deux paradigmes populaires en JavaScript pour charger des données.
C'est la première façon dont j'ai appris Angular. Lorsque j'ai suivi pour la première fois le cours Angular original de Fireship, je n'ai même jamais entendu parler des résolveurs. Les résolveurs ne sont pas populaires et je pense qu'ils sont extrêmement mal compris.
L'exemple de Brandon ci-dessus montre les données chargées APRÈS le rendu du composant. C'est le même modèle pour les autres frameworks :<script> // Detect dark theme var iframe = document.getElementById('tweet-1836847595806732317-750'); if (document.body.className.includes('dark-theme')) { iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1836847595806732317&theme=dark" } </script>
Avez-vous remarqué une tendance ici ? Les frameworks côté serveur préfèrent les fonctions de chargement (résolveur), tandis que les frameworks clients récupèrent les données dans un signal de manière réactive. Mais...
Angular n'est PAS un framework côté serveur !
Le problème n'est pas qu'Angular n'est pas un framework SSR, le problème est qu'il prétend l'être.
Maintenant, je ne m'attends pas à ce que l'équipe Angular ajoute toutes mes demandes de fonctionnalités. Cependant, ce serait bien d'avoir une prise en charge de base de .env dans le constructeur principal et la possibilité de créer des points de terminaison avec le routeur angulaire. Brandon peut s’occuper du reste.
C'est aussi toujours fou pour moi de ne pas pouvoir déployer une application Angular SSR de base sur Vercel.
J'ai lu un article sur les résolveurs de 2019 qui dit que le cas d'utilisation des résolveurs est "très rare". Fondamentalement, vous ne devez les utiliser que lorsque vous récupérez des données pouvant se charger rapidement. D'accord, d'accord. En réalité, vous ne chargeriez des données lentes que dans de rares cas d'utilisation. Vous souhaitez que votre site ou votre application soit rapide.
? Qu'est-ce que c'est, mec...
Que dirait Josh Morony ?
Vous ne devez pas utiliser RxJS dans Angular, sauf si vous devez gérer des événements asynchrones avec des conditions de concurrence ou coordonner un flux de données complexe.
Il faisait là référence à Signals VS Observables, donc je n'en ai aucune idée. Néanmoins, j'aime penser que vous devriez simplement récupérer le résolveur par défaut JUSQU'à ce que vous ayez ces cas d'utilisation avancés.
Si vous créez une application SSR professionnelle, vous aurez besoin d'un référencement généré à partir d'une base de données. Vous DEVEZ utiliser un résolveur ou suspendre manuellement le chargement du composant avec PendingTask, ce qui est extrêmement génial.
En analogique, je soupçonne que les gens récupèrent uniquement à l'intérieur des points de terminaison basés sur des fichiers, ou qu'ils génèrent des pages statiques là où cela n'a pas d'importance.
Les modèles de programmation de mes deux frameworks préférés sont aux antipodes.
Une réponse populaire au chargement lent dans le résolveur est le streaming HTTP. NextJS et SvelteKit le prennent en charge, mais cela a été refusé pour Angular.
?
Actuellement, tout ce qui se trouve dans le résolveur sera récupéré deux fois (client serveur). Cela devra également être géré à l’avenir. ? Les résolveurs devraient transmettre l'état automatiquement... utilisez ma fonction useAsyncTrasferState dans un résolveur pour cela.
J'ai utilisé ngxtension pour la démo par souci de concision, mais le résultat est le même.
id = injectParams('id'); idNumber = computed(() => Number(this.id())); todo = derivedAsync<Todo>(() => fetch(`https://jsonplaceholder.typicode.com/todos/${this.id()}`).then( (response) => response.json() ) ); prevId = computed(() => Math.max(this.idNumber() - 1, 1)); nextId = computed(() => this.idNumber() + 1);
todo = injectRouteData<Todo>('data'); idNumber = computed(() => this.todo()!.id); prevId = computed(() => Math.max(this.idNumber() - 1, 1)); nextId = computed(() => this.idNumber() + 1);
Ceci est chargé depuis le résolveur.
import { ResolveFn } from '@angular/router'; export const routeResolverResolver: ResolveFn<boolean> = async (route) => { const todoId = route.paramMap.get('id'); if (!todoId) { throw new Error('Todo ID is missing in the route!'); } // Fetch the todo from the API const response = await fetch(`https://jsonplaceholder.typicode.com/todos/${todoId}`); if (!response.ok) { throw new Error('Failed to fetch the todo'); } return await response.json(); };
Dans cette démo particulière, il y a un "scintillement" dans la version effet, alors qu'il n'y a pas de scintillement dans la version résolveur. Je pense que le résolveur est meilleur dans ce cas d'utilisation.
Qu'en pensez-vous ?
? Étant donné que Vercel ne prend pas en charge le déploiement SSR, la démo charge le résolveur uniquement sur le client. Cela signifie que le routage ne fonctionne qu'à partir de la page d'accueil.
Je dirais qu'il est sous assistance respiratoire pour les récupérations asynchrones. En réalité, les utilisateurs d'Angular SSR devraient envisager davantage les résolveurs pour ce cas d'utilisation et les utilisateurs de SvelteKit devraient envisager de charger $effect() pour davantage de cas d'utilisation. Mais c'est peut-être là le but ? La base d'utilisateurs est différente.
J'apprends encore, mais ces questions me fascinent. Espérons que nous assistons à davantage de bouleversements dans les deux écosystèmes.
J
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!