Ich habe vor ein paar Monaten durch Tech-Twitter gescrollt, als ich diesen Tweet des berüchtigten Brandon gesehen habe:
Wenn Sie es nicht wissen: Brandon hat AnalogJS erstellt, das NextJS-ähnliche Meta-Framework für Angular. Ich bin ein großer Fan dessen, was er für die Angular-Community tut, also musste ich antworten. Er wird Ihnen als Erster sagen, dass ich alles mit Resolvern lösen möchte.
Und...
Kein einziges... einziges... Like oder Antwort.
Ich poste nicht viel auf Twitter und habe auch keine Follower, also habe ich mir nichts dabei gedacht.
Allerdings bin ich zufällig wieder auf diesen Beitrag gestoßen und habe die Kommentare gelesen und festgestellt, dass mir niemand zustimmt! Ich frage mich ehrlich gesagt, ob sie überhaupt verstehen, wovon ich rede.
Es gibt tatsächlich zwei beliebte Paradigmen in JavaScript zum Laden von Daten.
Dies war die erste Art und Weise, wie ich jemals in Angular gelernt habe. Als ich zum ersten Mal den Original Angular-Kurs von Fireship belegte, lernte ich noch nicht einmal etwas über Resolver. Resolver sind nicht beliebt und werden meiner Meinung nach extrem missverstanden.
Brandons Beispiel oben zeigt, wie die Daten geladen werden, NACHDEM die Komponente gerendert wurde. Dies ist das gleiche Muster für andere 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>
Ist Ihnen hier ein Muster aufgefallen? Serverseitige Frameworks bevorzugen Ladefunktionen (Resolver), während Client-Frameworks Daten reaktiv in einem Signal abrufen. Aber...
Angular ist KEIN serverseitiges Framework!
Das Problem ist nicht, dass Angular kein SSR-Framework ist, sondern dass es so tut.
Jetzt erwarte ich nicht, dass das Angular-Team alle meine Funktionswünsche berücksichtigt. Es wäre jedoch schön, im Haupt-Builder eine grundlegende .env-Unterstützung zu haben und die Möglichkeit zu haben, Endpunkte mit dem Angular Router zu erstellen. Den Rest erledigt Brandon.
Ich finde es auch immer noch verrückt, dass ich keine einfache Angular SSR-Anwendung auf Vercel bereitstellen kann.
Ich habe einen Artikel über Resolver aus dem Jahr 2019 gelesen, in dem es heißt, dass der Anwendungsfall für Resolver „sehr selten“ sei. Grundsätzlich sollten Sie sie nur verwenden, wenn Sie Daten abrufen, die schnell geladen werden können. Ok, einverstanden. In der Realität würden Sie langsame Daten nur in seltenen Anwendungsfällen laden. Sie möchten, dass Ihre Website oder Anwendung schnell ist.
? Was zum Teufel, Mann...
Was würde Josh Morony sagen?
Sie sollten RxJS nicht in Angular verwenden, es sei denn, Sie müssen asynchrone Ereignisse mit Race Conditions verarbeiten oder einen komplexen Datenfluss koordinieren.
Er bezog sich dort auf Signale vs. Observablen, daher habe ich keine Ahnung. Dennoch bin ich der Meinung, dass Sie einfach den Resolver standardmäßig einholen sollten, BIS Sie über diese erweiterten Anwendungsfälle verfügen.
Wenn Sie eine professionelle SSR-Anwendung erstellen, benötigen Sie SEO, das aus einer Datenbank generiert wird. Sie MÜSSEN einen Resolver verwenden oder das Laden der Komponente manuell mit PendingTask anhalten, was äußerst unkonventionell ist.
In Analog vermute ich, dass die Leute nur innerhalb der dateibasierten Endpunkte abrufen oder statische Seiten generieren, wo es keine Rolle spielt.
Die Programmiermuster für meine beiden Lieblings-Frameworks sind polare Gegensätze.
Eine beliebte Antwort auf langsames Laden im Resolver ist HTTP-Streaming. NextJS und SvelteKit unterstützen dies, aber für Angular wurde es abgelehnt.
?
Derzeit wird alles im Resolver zweimal abgerufen (Server-Client). Dies muss auch in Zukunft gehandhabt werden. ? Resolver sollten den Status automatisch übergeben. Verwenden Sie dazu meine Funktion „useAsyncTrasferState“ in einem Resolver.
Der Kürze halber habe ich ngxtension für die Demo verwendet, aber das Ergebnis ist das gleiche.
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);
Dies wird vom Resolver geladen.
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(); };
In dieser speziellen Demo gibt es ein „Flackern“ in der Effektversion, während es in der Resolver-Version kein Flimmern gibt. Ich glaube, dass der Resolver in diesem Anwendungsfall besser ist.
Was denkst du?
? Da Vercel die SSR-Bereitstellung nicht unterstützt, lädt die Demo den Resolver nur auf dem Client. Das bedeutet, dass das Routing nur von der Startseite aus funktioniert.
Ich würde sagen, dass es sich um lebenserhaltende Maßnahmen für asynchrone Abrufe handelt. Tatsächlich sollten Angular SSR-Benutzer für diesen Anwendungsfall eher Resolver in Betracht ziehen, und SvelteKit-Benutzer sollten das Laden von $effect() für weitere Anwendungsfälle in Betracht ziehen. Aber vielleicht ist das der Punkt? Die Nutzerbasis ist unterschiedlich.
Ich lerne noch, aber diese Fragen faszinieren mich. Hoffentlich erleben wir weitere Umwälzungen in beiden Ökosystemen.
J
Das obige ist der detaillierte Inhalt vonSind Winkelresolver lebenserhaltend?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!