Angular 16+ 高级教程 – Angular 和其它技术方案的比较
前言
上一篇我有提到 Angular 适合用于哪些项目,但讲的太含糊,什么大中小项目的...这篇我将更具体的去讲解,Angular 的定位,还有它和其它方案的优缺点。
Web 技术可以用来做许许多多不同种类的项目。这里我抽出 4 种最常见的,并且拿几种不同的方案来看看各自的优缺点。
企业网站
企业网站相对其它类型是最简单也是最早的 Web 技术应用。
它的主要功能是呈现企业的信息,如:产品、服务、公司规模、人员等等,访客如果对企业有兴趣,就填表格提交,等待企业回复,very simple,没有复杂的交互。
虽然简单,但如果我们只是单纯使用 HTML、CSS、JS,那可不一定能完成所有的功能,而且即便可以完成大部分功能,代码也不容易维护。
技术难题和解决方案
难题一:Duplicated HTML
比如,我们要显示企业的所有分行信息。它是一个 list + card 的设计。这时我们会发现每一张 card 的 HTML 都是重复的。只有中间的一些信息不同而已。
这就是 duplicated HTML。解决方案就是使用 template engine. 比如 ASP.NECT Core 的 Razor Pages
难题二:Duplicated Page
/products/product-a.html
/products/product-b.html
a 和 b 产品设计都是一样的,只是图片,名字,价钱不同而已。这就叫 duplicate page.
解决方案就是使用 router。比如 ASP.NECT Core 的 Razor Pages
难题三:数据库
template engine 不仅解决了 duplicated HTML 问题,它也顺带把设计和数据分开了。这对管理是加分了。
我们再进一步思考,是否要把数据和代码也分开管理呢?显然这也是加分的。解决方案是 SQL Server + EF Core
难题四:Handle HTTP POST
表单提交的解决方案是 ASP.NET Core Web API
难题五:游览器兼容和不友好的 DOM API
这个是以前的问题,目前的游览器已经没有太多兼容问题了,而且 DOM API 也完善了很多。以前的解决方案是用 jQuery.
难题六:交互功能
企业网站主要功能是游览,由于信息多,空间少,所以在设计上会先做一些隐藏,然后通过交互来呈现。
比如:Slideshow、Modal Images。这些插件一般都是用 vanilla JS 来完成。
其它解决方案
Template Engine – ASP.NET Core Razor Pages
Router – ASP.NET Core Razor Pages
Database – SQL Server + EF Core
HTTP Post – ASP.NET Core Web API
交互体验 – Vanilla JS
除了 Vanilla JS 以外,其余的都是后端技术。ASP.NET Core 只是其中一种,你可以把它换成 PHP, Java 等等其它语言框架,其解决方式都大同小异。
这套方案我们给它个名字叫 backend + frontend
它的优点是,职责分配的好。缺点是双语言。一个开发人员要掌握 2 套技术会有点吃力。
所以近年来,随着 Node.js 越来越普及。出现了单语言方案。我们可以叫它 frontend + frontend.
Template Engine – React
Router – Next.js
Database – MySql + Prisma
HTTP Post – Express.js
交互体验 – React
这个技术方案的特点有 2 个,第一个是单语言,第二个是用 React 写交互体验会比 Vaniila JS 更好开发和管理。
我目前没有看到这个方案有哪些缺陷,可能唯一的缺陷是还不够成熟,正真用起来可能会发现还不如 ASP.NET Core 和 PHP 开发体验好。
虽然方案是好,但是我觉得针对企业网站领域很难有市场。因为企业网站更多的是用 Web Builder (Webflow、WordPress) 来开发的。除非有人先做一个基于 React + Next.js 的 Web Builder。
后台管理系统
上面我们提到,数据和代码是分离的,这也意味着我们可以在不修改代码的情况下修改网站内容,比如产品的价格。
直接修改数据库对程序员来说很容易,但这个难度太小,所以更好的方式是再往前一步,做一个网站内容管理系统 (CMS),这样普通员工就可以修改网站内容了。
若我们依然采用 backend + frontend 方案来实现这个系统,我们会遇到一个问题。
难题一:动态 HTML 内容
管理系统有一个常见的交互体验 – 添加数据。用户填写表格,提交,页面的内容发生变化。
在 backend + fronend 方案中,template engine 是由 backend 技术实现的,这意味着当用户添加新数据后,要嘛 reload page 让后端重新渲染新页面,要嘛通过 Web API 返回局部的 HTML,前端用 DOM API 做插入修改页面。
这两个方案都有缺陷,reload page 体验差,ajax + response HTML + append 代码繁琐。
解决方案
既然问题出在渲染,那就把渲染让前端负责呗。Angular、React 都可以替代后端的 template engine 技术。
另外 Angular 也可以替代后端的 Router 技术。
至此后端技术就只负责 Web API 输出数据就好。其它的都让前端负责。
这个就是经典的前后端分离方案。Angular 就超级适合这个方案。你看看 Gmail、Google Ads、Google Analytics、Google Cloud Console 等等,
哪一个不是这类的管理系统?
这套方案有 3 个弱点
1. 双语言。这个是老问题了。
如果想单语言,也可以考虑 Blazor。
2. SEO 差。因为把渲染搬到前端负责了,而有些爬虫是不运行 JS 的。
但巧的是,管理系统不需要 SEO,所以无感。
3. 首屏渲染慢,也是因为渲染搬到前端的关系,首屏渲染变慢了。不过巧的是,管理页面一般不关心首屏渲染速度。
难题二:JS 多了需要被管理
我们加重前端的职责,可能导致 JS 变得复杂。这时就需要引入 TypeScript、Sass、Webpack 等等工具。幸好 Angular 已经 build-in 了。
如果用 React 则需要在社区找到对应的方案。
总结
管理页面目前是 Angular 的最佳使用场景。Google 自己也是这样用的。
电子商务网站
企业网站做大以后通常会晋升成为电子商务网站。不管是卖产品,还是预约服务,都可以称为电子商务。
电商网站比起企业网站多了一些交互,比如 add to cart。
不要小看这一个 add to cart。它可是动态 HTML 内容哦。也就是说,我们会遇到和管理页面一样的难题。
那我们可以用同样的前后端分离方案来解决吗?Angular + Web API?
很遗憾,上面我们提到了这个方案有几个弱点。
1. SEO 问题,要解决这个问题就必须在服务端渲染。哪怕你用的是前端技术做 template engine。
ASP.NET Core 可以启动 Node.js 并且使用 Angular server side render 来完成这个任务。只是这个方案不是很热门。所以正真操作时很可能会遇到很多鬼问题。
2. 首屏渲染慢,Angular 也有一些技术是针对首屏渲染的。
显然,目前 Angular 用于电商还不是很稳定。可能 React + Next.js 会更理想。但是不管怎么样,我觉得大部分电子商务网站并没有那么复杂。
我们可以退回到企业网站 backend + frontend 的方法。它的缺陷只是在 ajax + response HTML + append 代码非常烂而已,只要不要太多那么还是可以接受的。
应用程序
比如 e-learning system,老师学生线上教课。学习做题等等。这样的系统就是应用程序。
显然它比电子商务复杂 (交互多),比管理系统稍微简单一些。这类项目也蛮适合前后端分离方案。
同样的,它们对 SEO 和 首屏渲染速度不那么重要。
总结
我的选择
企业网站
我个人觉得用 ASP.NET Core + JS 就够了.
你可以配上 Webpack / Vite、TypeScript、Sass、RxJS 等等相关技术。但核心就是让后端技术负责 template engine。
如果要单语言,可以考虑 React + Next.js
后台管理系统
Angular 的最佳战场,如果要单语言则可以考虑 Blazor。
电子商务网站
我个人会选择 React + Next.js 方案,或者 ASP.NET Core + JS。其次才会考虑 Blazor 或 Angular。
应用程序
我个人会选 React + React Native,大于 Angular + Native Script,最后是 Blazor。
我的感想
上面几种类型的项目,笼统的看都是交互页面。只是大家注重的点不一样。而且很多技术其实是重叠的,
它们只是语言不一样,实现手法不一样而已。
每个技术都想占领市场,都想让更多开发者使用。
像 Blazor 想吃 Angular / React 管理系统的蛋糕,React 结合 Next.js 想吃 ASP.NET Core / PHP 企业网站的蛋糕。
React Native / Angular Native Script 想吃 IOS / Android 的蛋糕。
Angular server side render 想吃电商网站的蛋糕。
每种技术的起点都不一样,但都慢慢去吃其它人的蛋糕。对于只会 C# 的人来说,Blazor 是个好东西。因为随着它的成长你的能力也在提升。
但对于会 C# 也会 JS 的人来说。用 C# 去搞 JS 的东西反而会让 C# 变得很奇怪。倒不如分开 2 种技术去实现。
同样的,IOS 和 Android 本来是 2 套技术,但为了让开发者少学一点,搞出了 Flutter,Native Script,Ionic。
这到底是好还是不好呢?我也说不上。
Angular 16+ 高级教程 – Angular 和其它技术方案的比较的更多相关文章
- NgRx/Store 4 + Angular 5使用教程
		这篇文章将会示范如何使用NgRx/Store 4和Angular5.@ngrx/store是基于RxJS的状态管理库,其灵感来源于Redux.在NgRx中,状态是由一个包含action和reducer ... 
- Angular CLI 使用教程指南参考
		Angular CLI 使用教程指南参考 Angular CLI 现在虽然可以正常使用但仍然处于测试阶段. Angular CLI 依赖 Node 4 和 NPM 3 或更高版本. 安装 要安装Ang ... 
- angular.js高级程序设计书本开头配置环境出错,谁能给解答一下
		server.jsvar connect=require('connect');serveStatic=require('serve-static');var app=connect();app.us ... 
- Pandas之:Pandas高级教程以铁达尼号真实数据为例
		Pandas之:Pandas高级教程以铁达尼号真实数据为例 目录 简介 读写文件 DF的选择 选择列数据 选择行数据 同时选择行和列 使用plots作图 使用现有的列创建新的列 进行统计 DF重组 简 ... 
- 【读书笔记】.Net并行编程高级教程(二)-- 任务并行
		前面一篇提到例子都是数据并行,但这并不是并行化的唯一形式,在.Net4之前,必须要创建多个线程或者线程池来利用多核技术.现在只需要使用新的Task实例就可以通过更简单的代码解决命令式任务并行问题. 1 ... 
- 分享25个新鲜出炉的 Photoshop 高级教程
		网络上众多优秀的 Photoshop 实例教程是提高 Photoshop 技能的最佳学习途径.今天,我向大家分享25个新鲜出炉的 Photoshop 高级教程,提高你的设计技巧,制作时尚的图片效果.这 ... 
- Siki_Unity_2-9_C#高级教程(未完)
		Unity 2-9 C#高级教程 任务1:字符串和正则表达式任务1-1&1-2:字符串类string System.String类(string为别名) 注:string创建的字符串是不可变的 ... 
- 这是一套Java菜鸟到大牛的学习路线之高级教程,由工作了10年的资深Java架构师整理。
		这是一套Java菜鸟到大牛的学习路线之高级教程,由工作了10年的资深Java架构师整理. 01-java高级架构师设计-基础深入 J2SE深入讲解 Java多 ... 
- ios cocopods 安装使用及高级教程
		CocoaPods简介 每种语言发展到一个阶段,就会出现相应的依赖管理工具,例如Java语言的Maven,nodejs的npm.随着iOS开发者的增多,业界也出现了为iOS程序提供依赖管理的工具,它的 ... 
- 【读书笔记】.Net并行编程高级教程--Parallel
		一直觉得自己对并发了解不够深入,特别是看了<代码整洁之道>觉得自己有必要好好学学并发编程,因为性能也是衡量代码整洁的一大标准.而且在<失控>这本书中也多次提到并发,不管是计算机 ... 
随机推荐
- Java-用户登录验证案例
			用户登录验证 1.案例需求: 1.访问带有验证码的登录页面login.jsp 2.用户输入用户名,密码以及验证码 * 如果用户名和密码输入有误,跳转登录页面,提示:用户名或密码错误 * 如果验证码输入 ... 
- Mysql中where条件自动类型转换的坑
			我有张表,其主键id字段为varchar(5),内容是5位随机不重复字符串表的内容大概是这样的 id name s8bk2 admin 9f0ps username 在一个方法中我查询了这张表,代码大 ... 
- [oeasy]python0100_wintel联盟_intel_微软_microsoft_msDOS_基尔代尔
			wintel联盟 回忆上次内容 上次 了解了IBM的 背水一战 IBM 已经不在乎 软硬一体全自主的设计 了 而采用了 开放的架构 任何 硬件厂商和软件厂商 都可以来合作 以丧失 自主控制力的方式 获 ... 
- [oeasy]python0014_二进制_binary_bin
			 二进制(binary) 回忆上次内容 上次我们了解了ASCII码表 ASCII 码表就是 American Standard Code for Inf ... 
- VUE小知识~作用域插槽
			作用域插槽可以为我们向组件内插入特定的标签,方便修改维护. 组件内需要使用 <slot></slot>进行插槽站位. 组件标签内需要使用<template > &l ... 
- Python 函数中箭头 (->)的用处
			Python 3 -> 是函数注释的一部分,表示函数返回值的类型. def useful_function(x) -> int: # Useful code, using x, here ... 
- ComfyUI插件:ComfyUI Impact 节点(一)
			前言: 学习ComfyUI是一场持久战,而 ComfyUI Impact 是一个庞大的模块节点库,内置许多非常实用且强大的功能节点 ,例如检测器.细节强化器.预览桥.通配符.Hook.图片发送器.图片 ... 
- 【Java】Reflection 反射机制 02获取类的一切
			先创建一个可演示的类 注解类 package cn.dai.Reflection.demo; import java.lang.annotation.ElementType; import java. ... 
- 【Docker】01 概述
			什么是Docker? 一个开源的应用容器引擎 由Go语言开发而成,遵循Apache2.0开源协议 允许开发者打包自己的应用或者依赖包组件到一个轻量级可移植的容器中 Docker容器采用沙箱机制,相互之 ... 
- 普通用户权限运行docker
			docker安装后默认权限是管理员,在Ubuntu系统中需要使用sudo命令,但是很多时候docker的拉取操作都是写在脚步里面的,因此执行的时候十分的难搞,如果给脚本sudo权限后那么整个的环境路径 ... 
