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

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

如果你不知道,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>

解析器版本

  todo = injectRouteData<todo>('data');

  idNumber = computed(() => this.todo()!.id);

  prevId = computed(() => Math.max(this.idNumber() - 1, 1));
  nextId = computed(() => this.idNumber() + 1);
</todo>

這是從解析器載入的。

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();
};
</boolean>

哪個更好?

在這個特定的演示中,效果版本中有“閃爍”,而解析器版本則沒有閃爍。我相信解析器在這個用例中更好。

你覺得怎麼樣?

?由於 Vercel 不支援 SSR 部署,因此此示範僅在用戶端載入解析器。這意味著路由只能在主頁上使用。

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

回答

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

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

J

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

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
JavaScript,C和瀏覽器之間的關係JavaScript,C和瀏覽器之間的關係May 01, 2025 am 12:06 AM

引言我知道你可能會覺得奇怪,JavaScript、C 和瀏覽器之間到底有什麼關係?它們之間看似毫無關聯,但實際上,它們在現代網絡開發中扮演著非常重要的角色。今天我們就來深入探討一下這三者之間的緊密聯繫。通過這篇文章,你將了解到JavaScript如何在瀏覽器中運行,C 在瀏覽器引擎中的作用,以及它們如何共同推動網頁的渲染和交互。 JavaScript與瀏覽器的關係我們都知道,JavaScript是前端開發的核心語言,它直接在瀏覽器中運行,讓網頁變得生動有趣。你是否曾經想過,為什麼JavaScr

node.js流帶打字稿node.js流帶打字稿Apr 30, 2025 am 08:22 AM

Node.js擅長於高效I/O,這在很大程度上要歸功於流。 流媒體匯總處理數據,避免內存過載 - 大型文件,網絡任務和實時應用程序的理想。將流與打字稿的類型安全結合起來創建POWE

Python vs. JavaScript:性能和效率注意事項Python vs. JavaScript:性能和效率注意事項Apr 30, 2025 am 12:08 AM

Python和JavaScript在性能和效率方面的差異主要體現在:1)Python作為解釋型語言,運行速度較慢,但開發效率高,適合快速原型開發;2)JavaScript在瀏覽器中受限於單線程,但在Node.js中可利用多線程和異步I/O提升性能,兩者在實際項目中各有優勢。

JavaScript的起源:探索其實施語言JavaScript的起源:探索其實施語言Apr 29, 2025 am 12:51 AM

JavaScript起源於1995年,由布蘭登·艾克創造,實現語言為C語言。 1.C語言為JavaScript提供了高性能和系統級編程能力。 2.JavaScript的內存管理和性能優化依賴於C語言。 3.C語言的跨平台特性幫助JavaScript在不同操作系統上高效運行。

幕後:什麼語言能力JavaScript?幕後:什麼語言能力JavaScript?Apr 28, 2025 am 12:01 AM

JavaScript在瀏覽器和Node.js環境中運行,依賴JavaScript引擎解析和執行代碼。 1)解析階段生成抽象語法樹(AST);2)編譯階段將AST轉換為字節碼或機器碼;3)執行階段執行編譯後的代碼。

Python和JavaScript的未來:趨勢和預測Python和JavaScript的未來:趨勢和預測Apr 27, 2025 am 12:21 AM

Python和JavaScript的未來趨勢包括:1.Python將鞏固在科學計算和AI領域的地位,2.JavaScript將推動Web技術發展,3.跨平台開發將成為熱門,4.性能優化將是重點。兩者都將繼續在各自領域擴展應用場景,並在性能上有更多突破。

Python vs. JavaScript:開發環境和工具Python vs. JavaScript:開發環境和工具Apr 26, 2025 am 12:09 AM

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

JavaScript是用C編寫的嗎?檢查證據JavaScript是用C編寫的嗎?檢查證據Apr 25, 2025 am 12:15 AM

是的,JavaScript的引擎核心是用C語言編寫的。 1)C語言提供了高效性能和底層控制,適合JavaScript引擎的開發。 2)以V8引擎為例,其核心用C 編寫,結合了C的效率和麵向對象特性。 3)JavaScript引擎的工作原理包括解析、編譯和執行,C語言在這些過程中發揮關鍵作用。

See all articles

熱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

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

熱工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3 Mac版

SublimeText3 Mac版

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

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。