搜索
首页web前端js教程Angular 解析器有生命支持吗?

几个月前,我在浏览科技推特时,看到了臭名昭著的布兰登的这条推文:

如果你不知道,Brandon 创建了 AnalogJS,这是 Angular 的类似 NextJS 的元框架。我是他为 Angular 社区所做的事情的超级粉丝,所以我必须做出回应。他会第一个告诉你我想用解析器解决所有问题。

还有...

没有一个...单个...点赞或回复。

我在 Twitter 上发帖不多,也没有关注者,所以我没有多想。

然而,我再次偶然看到这篇文章并阅读了评论,我发现没有人同意我的观点!老实说,我想知道他们是否明白我在说什么。

加载数据的两种方式

JavaScript 中实际上有两种流行的范例来加载数据。

1. 组件内部

这是我学习 Angular 的第一个方法。当我第一次学习 Fireship 的原始 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>
  • 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的起源:探索其实施语言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语言在这些过程中发挥关键作用。

JavaScript的角色:使网络交互和动态JavaScript的角色:使网络交互和动态Apr 24, 2025 am 12:12 AM

JavaScript是现代网站的核心,因为它增强了网页的交互性和动态性。1)它允许在不刷新页面的情况下改变内容,2)通过DOMAPI操作网页,3)支持复杂的交互效果如动画和拖放,4)优化性能和最佳实践提高用户体验。

C和JavaScript:连接解释C和JavaScript:连接解释Apr 23, 2025 am 12:07 AM

C 和JavaScript通过WebAssembly实现互操作性。1)C 代码编译成WebAssembly模块,引入到JavaScript环境中,增强计算能力。2)在游戏开发中,C 处理物理引擎和图形渲染,JavaScript负责游戏逻辑和用户界面。

从网站到应用程序:JavaScript的不同应用从网站到应用程序:JavaScript的不同应用Apr 22, 2025 am 12:02 AM

JavaScript在网站、移动应用、桌面应用和服务器端编程中均有广泛应用。1)在网站开发中,JavaScript与HTML、CSS一起操作DOM,实现动态效果,并支持如jQuery、React等框架。2)通过ReactNative和Ionic,JavaScript用于开发跨平台移动应用。3)Electron框架使JavaScript能构建桌面应用。4)Node.js让JavaScript在服务器端运行,支持高并发请求。

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

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)