首頁 web前端 js教程 Angular 解析器有生命維持嗎?

Angular 解析器有生命維持嗎?

Nov 19, 2024 pm 08:34 PM

幾個月前,我在瀏覽科技推特時,看到了臭名昭著的布蘭登的這條推文:

如果你不知道,Brandon 創建了 AnalogJS,這是 Angular 的類似 NextJS 的元框架。我是他為 Angular 社群所做的事情的超級粉絲,所以我必須做出回應。他會第一個告訴你我想用解析器解決所有問題。

還有...

沒有一個...單一...按讚或回覆。

我在 Twitter 上發文不多,也沒有追蹤者,所以我沒有多想。

然而,我再次偶然看到這篇文章並閱讀了評論,我發現沒有人同意我的觀點!老實說,我想知道他們是否明白我在說什麼。

載入資料的兩種方式

JavaScript 中其實有兩個流行的範例來載入資料。

1. 組件內部

這是我學習 Angular 的第一個方法。當我第一次學習 Fireship 的原始角度課程時,我甚至從未了解過解析器。解析器並不流行,我認為它被極大地誤解了。

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>
  • React Query - Tanstack Query 在底層使用 useEffect。也許第一個獲取模式是在 React 中創建的。
  • Vue推薦觀看
  • SolidJS - 使用回傳訊號的 createResource
  • Qwik - 有 useResource$,它回傳一個訊號
  • Svelte - 不建議在 GH 上使用純 Svelte,儘管您需要使用 $effect 和 .then() 而不是非同步。 Svelte 4 使用商店,它將遵循商店內相同的不建議的模式。查看帶有 Firebase 的 Svelte 5
  • Angular - Angular 一直推薦可觀察/行為主題模式,現在您可以只使用effect()。然而,ngxtension 有一個衍生非同步來為你做這件事,Angular 19 將內建資源()。實際上,RxJS 仍然與 Angular、攔截器和老式 http 用戶端緊密地交織在一起。

2. 載入函數內部

  • NextJS - 先前的 getServerSideProps 現在只是伺服器元件內的非同步函數。您只是伺服器,或者是像 React Query 這樣的外部套件。
  • Nuxt - Nuxt 內建了獲取函數 $fetch,它處理在客戶端上的一次獲取並提供給瀏覽器。您也可以像 NextJS 一樣在伺服器元件內部取得。
  • SvelteKit - Svelte 或 SvelteKit 中唯一建議的方式是在載入函數內。它在安裝元件之前運行,並且可以在伺服器或客戶端上運行。它們不僅適用於伺服器。
  • QwikCity - QwikCity 有routeLoader$ 和server$ 用於預先載入資料。 Qwik“恢復”,不需要水合作用,只需符文一次。
  • SolidStart - 使用查詢功能並預先載入在每條路線上執行。
  • Angular - Angular 有解析器,非常適合此用例。然而,似乎沒有人再使用它們了。

你的觀點是什麼?

你注意到這裡的模式了嗎?伺服器端框架偏好載入函數(解析器),而客戶端框架則以反應方式取得訊號中的資料。但是...

Angular 不是伺服器端框架!

問題不在於 Angular 不是 SSR 框架,問題在於它假裝是。

  1. 添加@angular/ssr實際上並沒有添加任何除了水合作用和自動傳輸狀態之外的伺服器功能(當然解析器除外)。然而,從技術上講,React 具有伺服器元件,而 NextJS 利用了它們。缺少的功能包括但不限於 .env 支援、端點、伺服器元件、表單操作、伺服器快取、僅從伺服器預先載入資料、bun、deno、cloudflare、非 Nodejs 支持,當然還有基於檔案的路由。閱讀我之前的任何帖子以解決這些問題。
  2. 注意 Firebase 應用程式託管僅支援 Angular 和 NextJS,但不支援 Analog,這是實際的 Angular 伺服器端框架!

現在我不希望 Angular 團隊添加我的所有功能請求。然而,如果主建構器能夠提供基本的 .env 支持,並且能夠使用 Angular Router 建立端點,那就太好了。布蘭登可以處理剩下的事情。

我仍然很瘋狂,因為我無法將基本的 Angular SSR 應用程式部署到 Vercel。

為什麼不響應式獲取?

我在 2019 年讀過一篇關於解析器的文章,其中說解析器的用例「非常罕見」。基本上,您應該只在獲取可以快速加載的資料時使用它們。好的,同意。實際上,您只會在極少數用例中載入緩慢的資料。您希望您的網站或應用程式能夠快速運作。

?到底是怎麼回事老兄...

喬許莫羅尼會說什麼?

你不應該在 Angular 中使用 RxJS,除非你需要處理具有競爭條件的非同步事件或協調複雜的資料流。

他指的是 Signals VS Observables,所以我不知道。儘管如此,我認為您應該默認獲取解析器,直到您擁有這些高級用例。

你真的別無選擇...

如果您正在建立專業的 SSR 應用程序,您將需要從資料庫產生 SEO。您必須使用解析器,或者使用 PendingTask 手動暫停元件加載,這非常時髦。

在模擬中,我懷疑人們僅在基於文件的端點內部進行提取,或者他們在無關緊要的地方生成靜態頁面。

Svelte VS Angular

我最喜歡的兩個框架的程式模式是截然相反的。

  • Huntabyte 將向您展示建議的方法(沒有其他方法)使用頁面載入函數載入資料。
  • 與此同時,Angular 和 Analog 社群放棄了解析器,並展示了他們可以說更複雜的反應方式。

HTTP 串流

解決解析器載入緩慢的一個流行答案是 HTTP 流。 NextJS 和 SvelteKit 支持這一點,但 Angular 拒絕了。

反思這一點... TL;DR

  • Angular 並不是一個完整的 SSR 框架
  • 社群很少使用解析器來載入非同步資料
  • Angular 團隊成員常將 Analog 視為不改變事物的理由
  • 這不一定是壞事,只是與 Svelte 社群截然相反
  • 在組件中處理競爭條件、中止控制器、可觀察的操作或任何複雜的獲取總是更好
  • 在解析器中預先載入 SEO 資料總是比較好
  • Svelte 有時可以用一點 RxJS
  • 解析器應該能夠使用像 input() 這樣的訊號
  • Angular SSR 社群很小嗎?
  • 大多數人只是在使用另一種語言獲取資料時建立企業應用程式嗎?
  • SEO 對大多數 Angular SSR 使用者來說並不重要,還是只是事後的想法?
  • HTTP 流在 Angular 中會很酷,當 Wiz 結合使用時,可恢復性也會很酷。

狀態

目前,解析器中的任何內容都將被獲取兩次(伺服器客戶端)。這也需要在未來處理。 ?解析器應該會自動傳遞狀態...在解析器中使用我的 useAsyncTrasferState 函數。

比較兩種方法

Are Angular Resolvers on Life Support ?

為了簡潔起見,我使用 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 部署,因此此示範僅在用戶端載入解析器。這意味著路由只能在主頁上使用。

  • 示範:Vercel(SSR 不適用於 Vercel)
  • 倉庫:GitHub

回答

我想說它是非同步獲取的生命維持。實際上,Angular SSR 用戶應該更多地考慮此用例的解析器,而 SvelteKit 用戶應該考慮在 $effect() 中載入更多用例。但也許這就是重點?用戶群不同。

我仍在學習,但這些問題讓我著迷。希望我們在這兩個生態系統中看到更多的改變。

J

以上是Angular 解析器有生命維持嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1654
14
CakePHP 教程
1413
52
Laravel 教程
1306
25
PHP教程
1252
29
C# 教程
1225
24
前端熱敏紙小票打印遇到亂碼問題怎麼辦? 前端熱敏紙小票打印遇到亂碼問題怎麼辦? Apr 04, 2025 pm 02:42 PM

前端熱敏紙小票打印的常見問題與解決方案在前端開發中,小票打印是一個常見的需求。然而,很多開發者在實...

神秘的JavaScript:它的作用以及為什麼重要 神秘的JavaScript:它的作用以及為什麼重要 Apr 09, 2025 am 12:07 AM

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

誰得到更多的Python或JavaScript? 誰得到更多的Python或JavaScript? Apr 04, 2025 am 12:09 AM

Python和JavaScript開發者的薪資沒有絕對的高低,具體取決於技能和行業需求。 1.Python在數據科學和機器學習領域可能薪資更高。 2.JavaScript在前端和全棧開發中需求大,薪資也可觀。 3.影響因素包括經驗、地理位置、公司規模和特定技能。

如何實現視差滾動和元素動畫效果,像資生堂官網那樣?
或者:
怎樣才能像資生堂官網一樣,實現頁面滾動伴隨的動畫效果? 如何實現視差滾動和元素動畫效果,像資生堂官網那樣? 或者: 怎樣才能像資生堂官網一樣,實現頁面滾動伴隨的動畫效果? Apr 04, 2025 pm 05:36 PM

實現視差滾動和元素動畫效果的探討本文將探討如何實現類似資生堂官網(https://www.shiseido.co.jp/sb/wonderland/)中�...

JavaScript的演變:當前的趨勢和未來前景 JavaScript的演變:當前的趨勢和未來前景 Apr 10, 2025 am 09:33 AM

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

如何使用JavaScript將具有相同ID的數組元素合併到一個對像中? 如何使用JavaScript將具有相同ID的數組元素合併到一個對像中? Apr 04, 2025 pm 05:09 PM

如何在JavaScript中將具有相同ID的數組元素合併到一個對像中?在處理數據時,我們常常會遇到需要將具有相同ID�...

前端開發中如何實現類似 VSCode 的面板拖拽調整功能? 前端開發中如何實現類似 VSCode 的面板拖拽調整功能? Apr 04, 2025 pm 02:06 PM

探索前端中類似VSCode的面板拖拽調整功能的實現在前端開發中,如何實現類似於VSCode...

JavaScript引擎:比較實施 JavaScript引擎:比較實施 Apr 13, 2025 am 12:05 AM

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

See all articles