构建现代Web应用时究竟是选择传统web应用还是SPA

640?wx_fmt=png

在大前端盛行的今天,似乎前后端分离的开发模式才是大势所趋,而SPA的概念更是应运而生。现在随便构建一个web应用程序如果你不是使用SPA的话,就会感觉有点low,但是真的是这样吗?今天这篇文章我们就来一起探讨下,构建现代web应用时该如何进行选择。

目前大伙都知道的是可通过两种通用方法来构建 Web 应用程序:在服务器上执行大部分应用程序逻辑的传统 Web 应用程序,以及在 Web 浏览器中执行大部分用户界面逻辑的单页应用程序 (SPA),后者主要使用 Web API 与 Web 服务器通信。 也可以将两种方法混合使用,最简单的方法是在更大型的传统 Web 应用程序中承载一个或多个丰富 SPA 类子应用程序。
但合适使用传统 Web 应用程序,何时使用SPA呢?针对这个问题最近在看微软《使用 ASP.NET Core 和 Azure 构建新式 Web 应用程序》白皮书的时候。里面如是说:

何时应使用传统 Web 应用程序:

  • 应用程序的客户端要求简单,甚至要求只读。

  • 应用程序需在不支持 JavaScript 的浏览器中工作。

  • 团队不熟悉 JavaScript 或 TypeScript 开发技术。

何时应使用 SPA:

  • 应用程序必须公开具有许多功能的丰富的用户界面。

  • 团队熟悉 JavaScript 或 TypeScript 开发。

  • 应用程序已为其他(内部或公共)客户端公开 API。

此外,SPA 框架还需要更强的体系结构和安全专业知识。 相较于传统 Web 应用程序,SPA 框架需要进行频繁的更新和使用新框架,因此改动更大。 相较于传统 Web 应用,SPA 应用程序在配置自动化生成和部署过程以及利用部署选项(如容器)方面的难度更大。

所以如果你要使用 SPA 模型改进用户体验时必须权衡这些注意事项。

Razor 组件

ASP.NET Core 3.0 引入了一种新模型,用于构建称为 Razor 组件的丰富的、交互式和可组合的 UI。 Razor 组件允许开发者在服务器上使用 Razor 构建 UI,并使用名为 WebAssembly 的 JavaScript 库将此代码传递到浏览器和执行客户端。 ASP.NET Core 3.0 仍在开发中,但你应该会期望在本电子书的 3.0 更新中看到有关此技术的详细信息。 有关 Razor 组件(名为 Blazor 的代码)的详细信息,请参阅 Blazor 入门。

何时选择传统 Web 应用

以下内容详细介绍前面提到的选择传统 Web 应用程序的原因。

应用程序的客户端要求简单,可能要求只读

对许多 Web 应用程序而言,其大部分用户的主要使用方式是只读。 只读(或以读取为主)应用程序往往比那些维护和操作大量状态的应用程序简单得多。 例如,搜索引擎可能由一个带有文本框的入口点和用于显示搜索结果的第二页组成。 匿名用户可以轻松提出请求,并且很少需要使用客户端逻辑。 同样,一般而言,博客或内容管理系统中面向公众的应用程序主要包含的内容与客户端行为关系不大。 此类应用程序容易构建为基于服务器的传统 Web 应用程序,在 Web 服务器上执行逻辑,并呈现要在浏览器中显示的 HTML。事实上,网站的每个独特页面都有自己的 URL,搜索引擎可以将其存为书签和编入索引(默认设置,无需将其添加为应用程序的单独功能),这也是此类情况的一个明显优势。

应用程序需在不支持 JavaScript 的浏览器中工作

如需在有限或不支持 JavaScript 的浏览器中工作的 Web 应用程序,则应使用传统的 Web 应用工作流编写(或至少可以回退到此类行为)。 SPA 需要客户端 JavaScript 才能正常工作;如果没有客户端 JavaScript,SPA 不是好的选择。

团队不熟悉 JavaScript 或 TypeScript 开发技术

如果团队不熟悉 JavaScript 或 TypeScript,但熟悉服务器端 Web 应用程序开发,那相较于 SPA,他们交付传统 Web 应用的速度可能更快。 除非以学习 SPA 编程为目的,或需要 SPA 提供用户体验,否则对已经熟悉构建传统 Web 应用的团队而言,选择传统 Web 应用的工作效率更高。

何时选择 SPA

以下内容详细介绍何时为 Web 应用选择单页应用程序开发样式。

应用程序必须公开具有许多功能的丰富用户界面

SPA 可支持丰富客户端功能,当用户执行操作或在应用的各区域间导航时无需重新加载页面。 SPA 很少需要重新加载整个页面,因此加载速度更快,可在后台提取数据,并且对单个用户操作的响应更快。 SPA 支持增量更新,可保存尚未完成的窗体或文档,而无需用户单击按钮提交窗体。 SPA 支持丰富的客户端行为,例如拖放,比传统应用程序更容易操作。 可以将 SPA 设计为在断开连接的模式下运行,对客户端模型进行更新,并在重新建立连接后将更新最终同步回服务器。 如果应用要求包括丰富的功能,且超出了典型 HTML 窗体提供的功能,则应选择 SPA 样式应用程序。

请注意,SPA 通常需要实现内置于传统 Web 应用中的功能,例如在反映当前操作的地址栏中显示有意义的 URL(并允许用户将此 URL 存为书签或对其进行深层链接以便返回此 URL)。 SPA 还应允许用户使用浏览器的后退和前进按钮寻找用户意料之中的结果。

团队熟悉 JavaScript 和/或 TypeScript 开发

编写 SPA 需要熟悉 JavaScript 和/或 TypeScript 以及客户端编程技术和库。 团队应有能力像使用 Angular 一样使用 SPA 框架编写新式 JavaScript。

参考 - SPA 框架

  • Angular
    https://angular.io

  • JavaScript 框架的比较
    https://jsreport.io/the-ultimate-guide-to-javascript-frameworks/

应用程序已为其他(内部或公共)客户端公开 API

如果已提供一个 Web API 供其他客户端使用,则相较于在服务器端窗体中复制逻辑,创建一个利用这些 API 的 SPA 实现更加容易。用户与应用程序交互时,SPA 广泛使用 Web API 来查询和更新数据。

决策表 - 选传统 Web 或 SPA

下面的决策表总结了在传统 Web 应用程序和 SPA 之间进行选择时要考虑的一些基本因素。

因素传统 Web 应用单页面应用程序
需要团队熟悉 JavaScript/TypeScript最低必需
支持不带脚本的浏览器支持不支持
客户端应用程序行为极少适合不必要
丰富而复杂的用户界面要求受限适合

总结

今天给大家介绍了在构建现代Web应用时究竟是选择传统web应用还是spa的一些参考,希望对大家在进行现代web开发时技术选型时有所帮助。如果你有不同的看法可以在下面留言。

640?wx_fmt=jpeg


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

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

相关文章

[ZJOI2007] 时态同步(拓扑序)

problem 洛谷链接 solution 结论:使用道具的导线深度越浅越好。 显然,如果有两个终止节点都需要增加 xxx,那么在他们的 lca\text{lca}lca 到根的路径中任意一条边增加 xxx 即可,各自增加 xxx 显然不优。 所以我们不妨倒过来&…

P2571 [SCOI2010]传送带

P2571 [SCOI2010]传送带 题意: 你要从 A 点到 D 点。有两条传送带:第一条从 A 到 B,速度为 pp,第二条从 C 到 D,速度为 q。不走传送带时速度为 r。求从 A 到 D 的最少时间。 题解: 很明显,答…

你所不知道的ASP.NET Core MVC/WebApi基础系列(二)

冒个泡,算起来估计有很长时间没更新公众号了,估计是我第一次停更如此之久,人总有懒惰的时候,时间越长越懒惰,但是呢,不学又不行,持续的惰性是不行dei,要不然会被时光所抛弃&#xff…

[ZJOI2007]报表统计(链表法+set)

problem 洛谷链接 solution 纯纯不理解要搬用平衡树的那些做法,使我们可可爱爱的链表不香不好写吗?? 众所周知,链表法是可以进行删除和增加的,只需要维护每个点的前驱和后继。 相邻两个的差绝对值的最小值&#x…

POJ-2069 Super Star(最小球覆盖)

POJ-2069 Super Star 题意&#xff1a; 给你n个点&#xff0c;求覆盖所有点的最小球的半径 4<n<30 题解&#xff1a; 求最小球覆盖的步骤&#xff1a; &#xff08;1&#xff09;对于一个点&#xff1a;球心就是这个点&#xff0c;且半径无穷小。 &#xff08;2&…

kubernetes 客户端KubeClient使用及常用api

KubeClient是kubernetes 的C#语言客户端简单易用&#xff0c;KubeClient是.NET Core&#xff08;目标netstandard1.4&#xff09;的可扩展Kubernetes API客户端&#xff0c; github地址&#xff1a;https://github.com/tintoy/dotnet-kube-client/&#xff0c;还有一个官方的SD…

OR(牛客第八场)

OR 题意&#xff1a; 给你一个数组b和c(数值位于下标2到n) 问是否存在一个a序列&#xff0c;biai−1oraibia_{i-1} or a_{i}biai−1​orai​ , ciai−1aic_{i}a_{i-1}a_{i}ci​ai−1​ai​ 题解&#xff1a; 我是这样想的&#xff0c;对于每一个bi和ci(i从2开始)&#xff0…

[ZJOI2008]泡泡堂(田忌赛马贪心)

problem 洛谷链接 solution 田忌赛马孪生兄弟。 浙江选手最坏情况就是外省最好情况&#xff0c;所以本质上两个子问题是同一个做法。 相信所有人都是读完题后就有田忌赛马的思想了。&#xff08;如果还没上过小学语文课的当我没说&#xff09; 实力强的去虐实力菜的&…

ASP.NET Core 3.0 上的gRPC服务模板初体验(多图)

早就听说ASP.NET Core 3.0中引入了gRPC的服务模板&#xff0c;正好趁着家里电脑刚做了新系统&#xff0c;然后装了VS2019的功夫来体验一把。同时记录体验的过程。如果你也想按照本文的步骤体验的话&#xff0c;那你得先安装.NET Core3.0预览版的SDK。至于开发工具我用的时VS201…

[ZJOI2010] 基站选址(线段树优化dp)

problem luogu-P2605 solution 首先&#xff0c;肯定都能想到最暴力的 dpdpdp。 dpi,j:idp_{i,j}:idpi,j​:i 个村庄为止一共选了 jjj 个基站&#xff0c;且第 iii 个村庄一定建立基站的最小费用。 通过我们的定义可知第 nnn 个村庄一定被选&#xff0c;实际上未必。 所以…

cf1553E. Permutation Shift

cf1553E. Permutation Shift 题意&#xff1a; 给出一个1到n的排列&#xff0c;每次可以交换两个数&#xff0c;问在交换最多m次(m < n/3)之后能不能得到由1 2 3 … n循环右移所得到的的排列&#xff0c;输出所有能得到的排列和循环右移的次数。 数据范围&#xff1a;n &l…

结合使用 Draft 与 Tencent Kubernetes Engine (TKE)

Draft 是一种开源工具&#xff0c;有助于在 Kubernetes 群集中打包和部署应用程序容器&#xff0c;让你专注于开发周期 - 专注开发的“内部循环”。 在开发代码期间&#xff0c;但尚未将代码提交到版本控制之前&#xff0c;Draft 将会运行。 借助 Draft&#xff0c;可在代码发生…

[ZJOI2010] 贪吃的老鼠(二分+差分+神仙建图网络流)

problem luogu-P2570 solution 卧槽网络流尼玛神题 首先这个最小延长时间 TTT &#xff0c;套路地考虑二分&#xff0c;将问题转化为判定性问题。 其次 n,mn,mn,m 和奶酪存在时间 [l,r][l,r][l,r] 的量级差很大&#xff0c;我们肯定会猜想一段时间内选择吃奶酪的老鼠是一样…

cf1553D. Backspace

cf1553D. Backspace 题意&#xff1a; 有一个字符串A,现在将其一个一个输入至B中,在输入一个字符时,如果按下backspace,那么这个字符不会被键入,而且如果B不为空,则前一位(B.back)也会被删除,现给出一个字符串C,问能否得到一个B&#xff0c;使得BC 题解&#xff1a; 为了通…

基于IdentityServer的系统对接微信公众号

业务需求公司有两个业务系统&#xff0c;A和B&#xff0c;AB用户之间属于多对一的关系&#xff0c;数据库里面也就是两张表&#xff0c;A表有个外键指向B。现在需要实现以下几个功能。A用户扫描B的二维码&#xff0c;填写相关的注册信息&#xff0c;注册完成之后自动属于B。也就…

[TJOI2012] 旅游(树的直径)

problem 写的什么jb题意&#xff01;这个语文水平。。。。 洛谷的一堆题解看下来也没懂他们懂得题目大意&#xff0c;真是给我蚌埠住了 luogu评测链接 一句话题意&#xff1a;给定一个三角剖分&#xff0c;求任意两顶点穿过的最多三角形个数&#xff08;只经过某三角形顶点…

Python知识(4/20):Python条件判断

任何一个复杂的系统都是由三种基本结构组成&#xff1a;顺序结构、分支结构、循环结构。其中 顺序结构最简单&#xff0c;程序从上到下依次执行&#xff0c;就如同生活中一条笔直的大马路&#xff0c;一路畅行无阻&#xff1b; 分支结构是指当程序执行到某步时&#xff0c;需根…

Ocelot Api网关教程(9)- QoS

本文介绍Ocelot中的QoS(Quality of Service)&#xff0c;其使用了Polly对超时等请求下游失败等情况进行熔断。1、添加Nuget包添加 Ocelot.Provider.Polly 到OcelotGetway项目中2、修改 Startup.ConfigureServices 如下来添加Polly&#xff1a;services .AddOcelot(new Confi…

cf1553F. Pairwise Modulo

cf1553F. Pairwise Modulo 题意&#xff1a; 给你一个数组a&#xff0c;a由n个不同的数组成,让你求出对应的数组p 数组p的定义为&#xff1a; pk∑1≤i,j≤kaimodajp_{k}\sum_{1\leq i,j\leq k}a_{i} \mod a_{j}pk​∑1≤i,j≤k​ai​modaj​ 题解&#xff1a; 官方题解 首…

[ZJOI2011]营救皮卡丘(费用流 + 最短路)

problem luogu-P4542 solution 刚开始就直观感觉 dpdpdp 不动&#xff0c;却有个看似“理所当然”的贪心&#xff1a;每次跑 kkk 个人所在点到扩展据点的最短距离&#xff0c;然后让最近的人去破环那个据点。 啪啪敲完后小样例&#xff08;实在太水&#xff09;就过了&…