【Angular开发】Angular在2023年之前不是很好

news2024/11/29 22:36:07
  • 做一个简单介绍,年近48 ,有20多年IT工作经历,目前在一家500强做企业架构.因为工作需要,另外也因为兴趣涉猎比较广,为了自己学习建立了三个博客,分别是【全球IT瞭望】,【架构师酒馆】和【开发者开聊】.
  • 企业架构师需要比较广泛的知识面,了解一个企业的整体的业务,应用,技术,数据,治理和合规。之前4年主要负责企业整体的技术规划,标准的建立和项目治理。最近一年主要负责数据,涉及到数据平台,数据战略,数据分析,数据建模,数据治理,还涉及到数据主权,隐私保护和数据经济。 因为需要,最近在学习财务,金融和法律。打算先备考CPA,然后CFA,如果可能可以学习法律,备战律考。
  • 欢迎爱学习的同学和朋友关注,也欢迎大家交流。微信小号【ca_cea】

你可能经常听到有人这么说

Angular在3年后等你。

Angular更适合大型或企业项目

Angular提供了出色的更新体验

在这篇文章中,我将向您展示为什么我认为Angular不如您在2023 Angular 15、16之前听到的那么好。

当然,在将Angular与其他框架/lib进行比较时,我不可能做到100%公平。此外,因为我试图在2023年之前演示Angular并不是那么好,所以我会过多地关注缺点。这对Angular来说是不公平的。2023年之后,Angular变得更好了,但我将在其他文章中介绍这些部分。

公平地说,我将在2023/8/15创建两个项目,一个用于Angular,另一个用于Vue。

For Angular, I’m creating with ng new my-app-angular with @angular/cli@16.2.0.
For Vue, I’m creating with npm create vue@latest with create-vue@3.7.2.

我将一步一步地演示它。

创建新项目时模板过于简单

使用Angular CLI创建新项目时,我有两个选项

  • 需要路由
  • CSS格式

While with Vue CLI,

除了2个选项,我还有4个以上的选项

  • state-management lib
  • e2e test lib
  • ESLint
  • Prettier for code formatting
  • ……

老实说,在我看来,对于一个大型或企业项目来说,配置以上4个选项很重要。

如果开发人员不是高级或专业的前端工程师,或者只是想节省一些时间,而CLI不提供这些选项,那么它们很容易丢失。

如果他们不是在一个大项目开始时建立的,那么让所有团队成员就一个特定的解决方案达成一致并不容易。有些人喜欢这个国家管理库,而另一些人则喜欢另一个。有些人喜欢半成品,而另一些人则不…

即使幸运的是,开发人员在迭代中设置了它,仍然有一些遗留代码需要迁移。

顺便说一句,Angular直到现在还没有官方的状态管理解决方案。由于这个问题,Angular在2022年将此功能添加到了积压工作中。到目前为止,Angular最出色的状态管理解决方案是ngrx。还有许多人将自己设计的状态管理库与RxJs和DI一起使用。

默认项目文件夹结构过于简单

对于Angular,在找到CodingStyleGuide一章之前,我甚至不知道如何使用模板进行编码。

  • 路由器视图放在哪里?
  • 将共享代码放在哪里?

而对于Vue,我认为开发人员可以立即编写代码。

无论如何,我将按照Angular样式指南创建一个英雄特性模块。

演示代码是从Angular主页演示中复制的。

这是UI:

默认更改检测策略是性能杀手

你有没有注意到当页面被加载时,这个函数在控制台被调用了多少次?6*9=54次!这是代码

And if you move your mouse from top to bottom, the function will be triggered 2*9*9 times!

在这种情况下,我们可以使用OnPush策略。

isSensitiveHeroName will be triggered 9 times in the first time and 9*9 times for mouseenter event.

因此,使用OnPush策略,性能提高了1200%。事实上,如果我们想将默认策略更改为OnPush,我们需要应用更多的更改,而不仅仅是这个演示中的一行。

对于这种情况,Angular有一个更好的解决方案。

现在,我们有了更好的表现,也许是最好的表现。这就是为什么你经常可以在Angular社区中看到这一点。

从不调用模板中的函数

好的。这是我关心的问题

避免在模板中使用函数真的好吗?

为了获得更好的性能,我们定义了一个派生状态isSensitive。所以,每次我们更改英雄的名字时,我们都需要更新isSensitive。

在实际应用程序中,会有许多派生状态依赖于2个或多个其他状态。因此,我们需要添加越来越多的代码来保持当前的性能,这将很快带来错误和维护问题。

可能还有其他方法可以在不编写更多代码的情况下保持性能。但这是我关心的问题

Angular开发人员编写高性能、易于维护的代码需要多长时间?1个月还是1年?

幸运的是,Angular在2023年推出了Signals,目前正在开发者预览中。Signals允许您编写高性能且易于维护的代码。

复杂的NgModule

现在,让我们假设我想使用HeroesModule之外的HeroListComponent。我需要将其从HeroesModule导出,然后将HeroesMode导入另一个模块(假设为AppModule)。

我只能看到一个优点。如果我想使用从HeroesModule导出的组件,我不需要再次将组件导入AppModule。

然而,我看到了许多缺点。

对于开发人员来说,要知道AppModule从HeroesModule导入了多少东西并不容易。只有Angular知道。

因为组件必须在模块中声明,所以开发人员很难知道组件在模块中依赖于多少东西。例如,HeroListComponent是否依赖于CommonModule和HeroesRoutingModule?我们需要检查一下。

因此,如果您将组件从一个模块移动到另一个模块,但它不起作用,这是很常见的,因为您需要找出组件需要什么依赖项,并移动依赖项。因为依赖项没有在组件中声明。

总之,一个组件本身无法工作,如果你来自其他框架,这很难想象。

幸运的是,我们在中获得了独立组件angular@15到2022年底。Angular团队甚至为您提供了一个从NgModule迁移到独立组件的工具。

与RxJs深度绑定

许多Angular API都是通过Observable公开的,甚至是HttpClient。然而,对于初学者来说,用RxJs编写bug较少的代码并不容易。

RxJs声明风格中需要注意的事项

例如,以前的HeroListComponent是用声明性样式实现的。如果我们删除模板中的英雄$|async,那么service.getHeroes将永远不会被再次调用。如果你是Angular或RxJs的新手,这可能会让你大吃一惊。

此外,如果service.getHeroes抛出一次错误,该函数将不再工作。这就是为什么您经常可以在声明性代码中看到catchError(() => EMPTY) 。

RxJs命令式风格中需要谨慎的事情

事实上,许多开发人员都在使用命令式编程。在这种情况下,HeroListComponent会像

在模板中,需要将heroes$|async更改为heroes。

然而,它有错误。就像我们在addEventListener之后需要removeEventListener一样,我们也需要取消订阅或使用takeUntilDestroyed。

然而,直到现在,takeUntilDestroyed还在开发者预览中。在2023年之前,我们需要添加更多的代码。还有一点,这种方式对OnPush策略不友好。

简短结论

正如您所看到的,与RxJs的深度绑定使开发人员更容易出错或编写性能较差的代码。

我确实认为RxJs功能强大,特别适合边缘情况。然而,拥有强大的工具并不意味着我们需要在所有情况下都使用它。许多没有RxJ的框架/libs/项目都运行得很好。

此外,我没有提到开发人员需要从RxJ中了解的内容以及它带来的非常侵入性的代码风格。

Angular的当前状态

正如您所看到的,Angular带来了许多新的解决方案。这是一件好事,但如果他们不及时指出建议的解决方案,那可能是一件坏事。社区可能会比以前更加分裂。

  • 声明式或命令式编程
  • 更少或更多RxJ
  • 默认或OnPush
  • NgModule或独立
  • zone.js或Singals

在它们之间进行选择将导致不同的样式,这也使得代码难以维护。

前两个选择已经使社区分裂。现在我们有更多。

在我看来,

  • 独立+Singals是Angular的未来。
  • RxJs对于Angular是可选的。
  • 将提供官方的国家管理解决方案。
  • Angular将更像其他框架/lib。

Angular已经做出了很好的选择,比如选择typescript,但选择NgModule和zone.js可能并没有那么成功。即使是内置的RxJs API也可能不是一个好的解决方案。

Angular在3年内不会等待其他框架/lib。

他正在做出进步和选择。许多框架和开发人员没有选择的一些解决方案往往意味着它们可能不太适合前端开发。在这些情况下,Angular也在向其他框架/lib学习,而不是等待并坚持自己的方向是正确的。

实际上,框架/lib都在相互学习。学习和提高自己比认为我是最好的要好得多。

  • Issue
  • Source

文章链接

【Angular开发】Angular在2023年之前不是很好 | 程序员云开发,云时代的程序员.

欢迎收藏【架构师酒馆】或者【开发者开聊】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1299837.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

eclipse中maven的配置

Maven下载地址:https://maven.apache.org/download.cgi 下载完成以后解压到非中文目录,建议放一个比较大的盘符下,因为Maven会一直从网上更新各种库存放在这个目录下,慢慢的会变得很大。 Maven环境变量配置 创建环境变量 在桌…

Diary22-全网最全的CSS3.0讲解

CSS学习 1.认识CSS 1.1什么是CSS CSS:Cascading Style Sheet——层叠级联样式表 CSS:表现(美化网页) 字体;颜色;边距;高度;宽度;背景图片;网页定位&…

再见了Future,图解JDK21虚拟线程的结构化并发

Java为我们提供了许多启动线程和管理线程的方法。在本文中,我们将介绍一些在Java中进行并发编程的选项。我们将介绍结构化并发的概念,然后讨论Java 21中一组预览类——它使将任务拆分为子任务、收集结果并对其进行操作变得非常容易,而且不会不…

【图片版】计算机组成原理考前复习题【第2章 运算方法和运算器-1】

目录 前言 考前复习题(必记) 结尾 前言 在计算机组成原理的学习过程中,我们深入探索了计算机系统概述这一重要领域。计算机系统作为现代科技的核心,是整个计算机科学的基石。我们将学到的知识与理论转化为了能够解决现实问题的…

3DMAX关于显示驱动问题的解决方法大全

3DMAX与显卡驱动有关的问题主要有以下几种情况: 1.3DMAX启动弹出这样的界面: 2.主工具栏按钮不显示,或者鼠标移上去才显示(刷新问题)。 3.视口菜单不显示或显示不全。 问题分析: 首先&#x…

AspNetCore 中使用 Knife4jUI 更加友好的Swagger界面

🚀介绍 aspnetcore.knife4j是一个基于.NET Core平台的Swagger UI库,它提供了API文档的生成和管理功能。这个库的前身是swagger-bootstrap-ui,在Java项目中广泛使用,由于其优秀的界面和易用性被许多开发者所推崇。现在&#xff0c…

一文学会使用 PyInstaller 将 Python 脚本打包为 .exe 可执行文件

文章目录 前言PyInstaller特点跨平台支持自动依赖项处理单文件发布支持图形用户界面(GUI)和命令行界面(CLI)应用支持多种打包选项 基本用法常用参数其它参数 版本 & 环境实现步骤安装 PyInstaller创建 Python 脚本使用 PyInst…

C++学习笔记之五(String类)

C 前言getlinelength, sizec_strappend, inserterasefindsubstrisspace, isdigit 前言 C是兼容C语言的,所以C的字符串自然继承C语言的一切字符串,但它也衍生出属于自己的字符串类,即String类。String更像是一个容器,但它与容器还…

HJ103 Redraiment的走法

题目: HJ103 Redraiment的走法 题解: dfs 暴力搜索 枚举数组元素,作为起点如果后续节点大于当前节点,继续向后搜索记录每个起点的结果,求出最大值 public int getLongestSub(int[] arr) {int max 0;for (int i 0…

MySQL - 表达式With as 语句的使用及练习

目录 8.1 WITH AS 的含义 8.2 WITH AS语法的基本结构如下: 8.3 练习题1 8.4 牛客练习题 8.1 WITH AS 的含义 WITH AS 语法是MySQL中的一种临时结果集,它可以在SELECT、INSERT、UPDATE或DELETE语句中使用。通过使用WITH AS语句,可以将一个查…

flstudio21.3完整高级版怎么下载?有哪些新功能

flstudio高级版是一款适用于广泛领域的音频编辑软件。它支持多通道混音器和VST插件,包括数百种乐器和效果插件。它还为您提供了一个乐谱编辑器,需要对不同乐器的节奏进行必要的编辑。Flstudio具有许多内置电子合成声音,可提供更广泛的电子声音…

运维06:监控

监控生命周期 1.服务器上架到机柜2.基础设施监控 服务器温度,风扇转速 ipmitool命令,只能用在物理机上 存储的监控(df, fdisk, iotop) cpu(lscpu, uptime, top, htop, glances) 内存情况(free&…

CSS-自适应导航栏(flex | grid)

目标:实现左右各有按钮,中间是内容,自适应显示中间的内容导航栏,即 根据中间的宽度大小显示内容。 自适应导航栏 总结:推荐 flex布局 / grid布局 flex布局: 两侧 flex:1; ----->中间自适应 grid布局&…

【MATLAB】基于EEMD分解的信号去噪算法(基础版)

代码操作 【MATLAB】基于EEMD分解的信号去噪算法(基础版) 代码的主要内容 基于EEMD(集合经验模态分解)的信号去噪算法通常可以结合相关系数、信号的熵值或者方差贡献率来完成去噪处理。这些指标可以用于确定阈值,从而…

Java线程概念详解

线程 概念 1.程序:未解决某种问题,使用计算机语言编写的一些列指令(代码)的集合 2.进程:正在运行的程序(被加载到内存中),是操作系统进行资源分配的最小单位 3.线程:进程可以进一步细化为线程(比进程更小)且线程是隶属于进程的,是操作系统执行的最小的执行单元 也是cpu进行任…

整合,降价,官司……2023休闲零食行业大变局

休闲零食行业正从暗战走向明战。 11月27日,宁波广源聚亿投资有限公司(以下简称“广源聚亿”)因被投企业宜春赵一鸣食品科技有限公司(以下简称“赵一鸣”)在双方合作期内,刻意隐瞒公司重大事项,…

Matlab数学建模算法之小波神经网络详解

🔗 运行环境:Matlab 🚩 撰写作者:左手の明天 🥇 精选专栏:《python》 🔥 推荐专栏:《算法研究》 🔐#### 防伪水印——左手の明天 ####🔐 💗 大家…

PHP使用mkcert本地开发生成HTTPS证书 PhpEnv集成环境

PHP使用mkcert本地开发生成HTTPS证书 PhpEnv集成环境 前言一、介绍 mkcert二、安装/使用 mkcert1. 安装2. 使用 总结 前言 本地开发时有些功能只有在 https 证书的情况下才能使用, 例如一些 Web API 一、介绍 mkcert Github地址 mkcert 是一个制作本地可信开发证书的简单工具。…

基于以太坊的智能合约开发Solidity(事件日志篇)

//声明版本号(程序中的版本号要和编译器版本号一致) pragma solidity ^0.5.17; //合约 contract EventTest {//状态变量uint public Variable;//构造函数constructor() public{Variable 100;}event ValueChanged(uint newValue); //事件声明event Log(…

无人零售店,凭借黑科技引领,它的前景如何?

无人零售店,凭借黑科技引领,它的前景如何? 近年来,无人新零售行业快速兴起,引起了广泛的关注和兴趣。尤其是在疫情之后,人们才真正认识到了无人零售的概念。如今,无人零售行业正在以直线的方式高…