数か月前、Tech Twitter をスクロールしていたとき、悪名高い Brandon による次のツイートを見つけました。
ご存知ないかと思いますが、Brandon は、Angular 用の NextJS に似たメタ フレームワークである AnalogJS を作成しました。私は彼が Angular コミュニティのために行っている活動の大ファンなので、返信する必要がありました。私がリゾルバーですべてを解決したいと最初に言うのは彼でしょう。
そして...
1 つも...1 つも...いいねも反応もありません。
私は Twitter にあまり投稿しないし、フォロワーもいないので、何も考えていませんでした。
しかし、偶然この投稿を再び見つけてコメントを読んだところ、誰も私に同意していないことに気づきました。正直、彼らは私の言っていることが理解できるだろうかとさえ思っています。
実際、JavaScript にはデータをロードするための 2 つの一般的なパラダイムがあります。
これは私が Angular で学んだ最初の方法でした。私が初めて Fireship の Original Angular コースを受講したときは、リゾルバーについてさえ学びませんでした。リゾルバーは人気がありませんし、非常に誤解されていると思います。
上記の Brandon の例は、コンポーネントがレンダリングされた後にデータがロードされることを示しています。これは他のフレームワークでも同じパターンです:<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>
ここにパターンがあることに気づきましたか?サーバー側フレームワークはロード関数 (リゾルバー) を優先しますが、クライアント フレームワークはシグナル内のデータをリアクティブにフェッチします。でも…
Angular はサーバー側のフレームワークではありません!
問題は、Angular が SSR フレームワークではないということではなく、問題は、Angular が SSR フレームワークであるふりをしていることです。
現在、Angular チームが私の機能リクエストをすべて追加してくれるとは思っていません。ただし、メイン ビルダーで基本的な .env サポートがあり、Angular Router でエンドポイントを作成できる機能があれば便利です。残りはブランドンに任せてください。
基本的な Angular SSR アプリケーションを Vercel にデプロイできないことも、私にはいまだに頭がおかしいです。
2019 年のリゾルバーに関する記事を読みましたが、リゾルバーの使用例は「非常にまれ」であると書かれていました。基本的に、これらは、高速にロードできるデータをフェッチする場合にのみ使用してください。わかりました、同意しました。実際には、低速データをロードするのはまれな使用例のみです。サイトやアプリケーションを高速にしたいと考えています。
?一体何者だ...
ジョシュ・モロニーなら何と言うでしょうか?
競合状態のある非同期イベントを処理したり、複雑なデータ フローを調整したりする必要がない限り、Angular で RxJS を使用しないでください。
彼はそこでシグナル VS オブザーバブルについて言及していたので、私にはわかりません。それでも、このような高度な使用例ができるまでは、デフォルトでリゾルバーをフェッチするだけでよいと思います。
プロフェッショナルな SSR アプリケーションを構築している場合は、データベースから生成された SEO が必要になります。リゾルバーを使用するか、PendingTask を使用してコンポーネントのロードを手動で一時停止する必要がありますが、これは非常にファンキーです。
アナログでは、ファイルベースのエンドポイント内でのみフェッチしているか、関係のない静的ページを生成しているのではないかと思います。
私のお気に入りの 2 つのフレームワークのプログラミング パターンは正反対です。
リゾルバーでの読み込みが遅いことに対する一般的な解決策の 1 つは、HTTP ストリーミングです。 NextJS と SvelteKit はこれをサポートしていますが、Angular では拒否されました。
?
現在、リゾルバー内のすべてのものが 2 回フェッチされます (サーバー クライアント)。これも今後の対応が必要です。 ?リゾルバーは状態を自動的に渡す必要があります...そのためにはリゾルバーで useAsyncTrasferState 関数を使用してください。
簡潔にするためにデモには ngxtension を使用しましたが、結果は同じです。
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);
これはリゾルバーからロードされます。
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(); };
この特定のデモでは、エフェクト バージョンには「ちらつき」がありますが、リゾルバ バージョンにはちらつきがありません。このユースケースではリゾルバーの方が優れていると思います。
どう思いますか?
? Vercel は SSR デプロイメントをサポートしていないため、デモではクライアントのみにリゾルバーがロードされています。これは、ルーティングがホームページからのみ機能することを意味します。
非同期フェッチのための生命維持装置が付いていると言えます。実際には、Angular SSR ユーザーはこのユースケースについてはリゾルバーをより考慮する必要があり、SvelteKit ユーザーはさらに多くのユースケースについて $effect() でのロードを検討する必要があります。しかし、おそらくそれがポイントでしょうか?ユーザーベースが違います。
私はまだ勉強中ですが、これらの質問は私を魅了します。両方のエコシステムにさらなる変革が起こることを願っています。
J
以上がAngular リゾルバーは生命維持装置にありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。