构建现代Web应用:5个基本的前端架构原则

news2025/1/27 12:53:20

本文翻译自 Building modern Web Applications: 5 Essential Frontend Architecture Principles,作者:Patrick Roos, 略有删改。

在这篇文章中,我提出了构建现代前端的五个架构原则。我第一次听到这些原则是在Natalia Venditto的一次精彩演讲中。他们打开了我的视野,所以我试图更详细地解释这些原则和我的理解。

Photo by Tim Graf / Unsplash

在她的演讲中,她将前端架构的原则分为两部分。

  • 我们应该始终遵循的原则。

    • 原则1:异步或延迟加载
    • 原则2:有意识地进行Tree-shake、打包和清除无用代码
    • 原则3:设定和遵守性能预算
  • 可能的情况下我们应该遵循的原则。

    • 原则4:坚持Web平台API和Web标准
    • 原则5:使用新一代前端框架

原则1:异步或延迟加载

这是一个我们应该始终遵循的原则。

在前端开发中,图像、字体和JavaScript等Web资产的加载策略是关键。

值得一提的是,Google的核心价值观核心要素是定义Web应用程序用户体验的指标。这些指标也会被Google搜索引擎仔细检查。

特别是在客户端渲染场景中,JavaScript模块的加载至关重要。如果我们想加载JavaScript,有三种主要的方法可以做到这一点:

  • 标准方法(不推荐)
  • 使用defer关键字(根据此原则推荐)
  • 使用async关键字(根据此原则推荐)

标准的方式

让我们来看看标准的方法。标准的方式是在html标记中使用一个普通的<script>标签,如下所示:

<html>
  <head>
    ...
  </head>
  <body>
    ...
    <script src="script.js" />
    ...
  </body>
</html>

这种加载JavaScript的方式的缺点如下,如果我们看看时间轴和浏览器在这种情况下的行为。

以标准方式加载JavaScript

从这个角度来看,有两个缺点:

  • 加载和执行的脚本只能在加载之前读取DOM。
  • 如果脚本是“重量级”的,它可以阻止整个浏览器。

延迟方式

使用defer方式加载JavaScript文件或JavaScript代码是一种更加优雅的解决方案。defer告诉浏览器继续DOM解析并在后台加载脚本。在解析DOM并加载脚本之后再执行脚本。这样的首次初始渲染将是非阻塞的。

<p>...</p>
<script defer src="my-fancy-script.js"></script>
<!-- 这个 p 标签将直接加载 -->
<p>...</p>

使用defer加载脚本

异步方式

加载带有async属性的脚本会将加载标识为完全独立。这意味着浏览器不会等待JavaScript脚本。它完全独立地加载和执行。

<p>...</p>
<script async src="my-fancy-script.js"></script>
<!-- 这个 p 标签将直接加载 -->
<p>...</p>

原则2:有意识地进行Tree-shake、打包和清除无用代码

这是一个我们应该始终遵循的原则。

JS bundle 是将多个JavaScript文件打包到单个文件中的一种方法。捆绑减少了http请求的数量,方便了缓存。Tree-shaking是一种从JavaScript包中删除未使用代码的优化技术。这可以显著减少包的大小,从而可以改善页面加载时间和整体前端性能。

Tree-Shaking

  • 减少bundle大小:Tree-shaking可以显著减少JavaScript bundle的大小。这可以改善页面加载时间和整体性能。

  • 改进的缓存:较小的bundle更有可能被浏览器缓存。这可以进一步改善回访者的加载时间。

  • 减少带宽使用:较小的bundle使用较少的带宽。

如果你正在构建一个现代的JavaScript应用程序,你绝对应该使用Tree-shaking。这是提高应用程序性能的一种简单而有效的方法。

不同的现代JavaScript打包工具支持Tree-shaking优化:

  • Webpack:https://webpack.js.org/guides/tree-shaking/?ref=workingsoftware.dev
  • Parcel:https://parceljs.org/?ref=workingsoftware.dev
  • Rollup:https://rollupjs.org/introduction/?ref=workingsoftware.dev
  • Vite:https://vitejs.dev/?ref=workingsoftware.dev

原则3:设定和遵守性能预算

这是一个我们应该始终遵循的原则。

在前端开发中设定和遵守性能预算对于创建快速,响应和用户友好的Web应用程序至关重要。

使用webpack-bundle-analyzer进行依赖分析

性能预算为各种指标设置了可接受的性能目标,例如Google的Web生命周期,例如首次输入延迟(FID),最大内容绘制(LCP)和交互时间(TTI)。

通过设置这些指标,开发人员可以优先考虑性能优化工作,并确保他们的应用程序满足用户的期望。

制定和坚持性能预算的关键步骤:

  • 1.设定性能目标:确定对用户体验至关重要的关键性能指标。这些指标可以包括FID、LCP、TTI和其他基于用户需求和期望的指标。

  • 2.分析性能:使用Lighthouse等工具测量应用程序的当前性能。这将给予您在进行任何优化之前对应用程序的性能有一个基本的了解。

  • 3.识别大的和阻塞的bundle:使用bundle分析器(例如webpack-bundle-analyzer)来识别导致性能问题的前端特定bundle。

  • 4.确定优化的优先级:根据确定的性能瓶颈,确定优化的优先级,以首先解决最关键的问题。专注于改进对用户体验影响最大的指标。

  • 5.持续监控性能:持续监控Web应用的性能,以确保其保持在设定的性能预算范围内。在CI/CD管道中集成Lighthouse CI等工具,以自动执行性能测试和报告。

  • 6.根据需要调整性能预算:随着应用程序的发展和用户期望的变化,请查看性能预算并根据需要调整阈值。这将确保您的Web应用程序继续提供高质量的用户体验。

通过遵循这些步骤,您可以有效地设置和遵守性能预算,并确保您的前端应用程序在速度、响应能力和整体用户体验方面满足用户期望。

原则4:坚持Web平台API和Web标准

这是我们应该尽可能遵循的原则。

这个原则很容易理解。尽可能利用Web平台API和Web标准的强大功能。

首先要熟悉本地Web标准,如HTML,CSS和JavaScript。这听起来很简单,但真的吗?

它还涉及到对原生Web平台 API 的能力的了解,例如:

  • Web Storage API
  • Geolocation API
  • Media Capture and Streams API
  • Notifications API
  • Web RTC API
  • Payment Request API

有了这些知识,你将能够创建先进和强大的Web应用程序。

原则5:使用新一代前端框架

这是我们应该尽可能遵循的原则。

使用现代和创新的前端开发框架来创建用户界面是有益的。

与传统框架相比,这些框架提供了几个优势,包括:

  • 提高性能和效率:新一代框架旨在优化性能并减少创建高级用户界面所需的代码量。这样可以加快渲染速度、提高响应速度并更有效地使用资源。

  • 提高开发人员的生产力:这些框架通常提供一种更结构化的方法来创建和维护复杂的应用程序。这可以显著提高开发效率,并减少将新功能推向市场所需的时间。

  • 活跃和不断增长的社区:这些框架通常拥有庞大而活跃的开发人员社区,他们为开发做出贡献,提供支持并分享他们的知识。这促进了一个充满活力的工具、库和最佳实践生态系统,进一步增强了开发体验。

其中一些框架的列表:

  • React
  • Vue.js
  • Angular
  • Svelte
  • Solid.js
  • Lit
  • Qwik

看完本文如果觉得有用,记得点个赞支持,收藏起来说不定哪天就用上啦~

专注前端开发,分享前端相关技术干货,公众号:南城大前端(ID: nanchengfe)

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

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

相关文章

NTT 的各类优化:Harvey、PtNTT,Intel AVX2、ARM Neon、GPGPU

参考文献&#xff1a; [Har14] Harvey D. Faster arithmetic for number-theoretic transforms[J]. Journal of Symbolic Computation, 2014, 60: 113-119.[Sei18] Seiler G. Faster AVX2 optimized NTT multiplication for Ring-LWE lattice cryptography[J]. Cryptology ePr…

QDoubleSpinBox的使用示例

QDoubleSpinBox即可以做为数值型输入框使用&#xff0c;也可以使用只读型数据显示框&#xff0c;在作为输入框使用时比QLineEdit有以下几个方面的优势 1.可以设置范围&#xff0c;并且范围精确&#xff0c; 2.输入数据精确&#xff0c;自动屏幕非数值以外的字符。 3.设置步长后…

【LeetCode刷题】--77.组合

77.组合 class Solution {public List<List<Integer>> combine(int n, int k) {List<List<Integer>> ans new ArrayList<>();if( k < 0 || n < k){return ans;}Deque<Integer> list new ArrayDeque<>();dfs(ans,list,n,k,1)…

Panorama SCADA平台助力智能建筑管理,掌控未来建筑!

来源&#xff1a;宏集科技 工业物联网 宏集方案 Panorama SCADA平台助力智能建筑管理&#xff0c;掌控未来建筑&#xff01; 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; 前言 在现代智能建筑管理中&#xff0c;随着设施管理&#xff08;FM&#xff09;、建筑管理…

05_MySQL主从复制架构

任务背景 ##一、真实案例 某同学刚入职公司&#xff0c;在熟悉公司业务环境的时候&#xff0c;发现他们的数据库架构是一主两从&#xff0c;但是两台从数据库和主库不同步。询问得知&#xff0c;已经好几个月不同步了&#xff0c;但是每天会全库备份主服务器上的数据到从服务…

Hadoop数据仓库平台搭建

在这里是学习大数据的第一站 什么是数据仓库常见大数据平台组件及介绍 什么是数据仓库 在计算领域&#xff0c;数据仓库&#xff08;DW 或 DWH&#xff09;也称为企业数据仓库&#xff08;EDW&#xff09;&#xff0c;是一种用于报告和数据分析的系统&#xff0c;被认为是商业智…

Mysql安全之基础合规

一、背景 某次某平台进行安全性符合型评估时&#xff0c;列出了数据库相关安全选项&#xff0c;本文特对此记录&#xff0c;以供备忘参考。 二、安全配置 2.1、数据库系统登录时的用户进行身份标识和鉴别&#xff1b; 1&#xff09;对登录Mysql系统用户的密码复杂度是否有要…

智能优化算法应用:基于鸟群算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于鸟群算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于鸟群算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.鸟群算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

创建Asp.net MVC项目实现视图页面数据传值显示

MVC中视图传值 ViewData ViewBag TempData 举例创建三中传值方式实现页面数据展示 MVC中视图传值 Asp.net MVC中Controller向View传值有多种方式,这里简单说一下其中3种方式 ViewData、ViewBag和TempData ViewData ViewData存储数据&#xff0c;ViewData的声明和赋值方…

BGP笔记全

自治系统---AS 定义&#xff1a;由一个单一的机构或者组织所管理的一系列IP网络及其设备所构成的集合。 AS划分的原因 如果整张网络很大&#xff0c;路由数量进一步增加&#xff0c;路由表规模变得太大&#xff0c;会导致路由收敛速度变慢&#xff0c;设备性能消耗加大&#…

C++11——initializer_list

initializer_list的简介 initializer_list是C11新出的一个类型&#xff0c;正如类型的简介所说&#xff0c;initializer_list一般用于作为构造函数的参数&#xff0c;来让我们更方便赋值 但是光看这些&#xff0c;我们还是不知道initializer_list到底是个什么类型&#xff0c;…

【小聆送书第一期】让架构师的成神之路温暖你这个不景气的冬天

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言 书籍一览 ⛳️书籍一⛳️书籍二⛳️书籍三⛳️书籍四⛳️书籍五⛳️书籍六⛳️书…

Git和Git小乌龟安装

目录 Git简介 Git安装 Git小乌龟简介 Git小乌龟安装 Git简介 Git是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地进行从很小到非常大的项目的版本管理。它最初是由Linux Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。Git具有速度、…

LeetCode(42)有效的字母异位词【哈希表】【简单】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 有效的字母异位词 1.题目 给定两个字符串 *s* 和 *t* &#xff0c;编写一个函数来判断 *t* 是否是 *s* 的字母异位词。 **注意&#xff1a;**若 *s* 和 *t* 中每个字符出现的次数都相同&#xff0c;则称 *s* 和 *t* 互为字…

怎么样的软件测试工程师才算“大神”?

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

Bug 检查 0x7B:INACCESSIBLE_BOOT_DEVICE(未解决)

环境&#xff1a; HP ProDesk 480 G7 Win10 专业版 问题描述&#xff1a; INACCESSIBLE_BOOT_DEVICE bug 检查的值为0x0000007B。 此 bug 检查表明 Microsoft Windows 操作系统在启动过程中无法访问系统分区 原因&#xff1a; 1.INACCESSIBLE_BOOT_DEVICE bug 检查经常发生…

python基于YOLOv6最新0.4.1分支开发构建钢铁产业产品智能自动化检测识别系统

在前文中陆续基于不同类型的目标检测模型开发构建了钢铁产业产品缺陷质检系统&#xff0c;关于yolov6除了刚提出的时候有过使用&#xff0c;后续使用较少了&#xff0c;今天就以yolov6最新0.4.1分支模型为基准来开发实践目标检测项目开发。 首先看下实例效果&#xff1a; 官方…

2023最新的软件测试热点面试题(答案+解析)

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

uniapp小程序项目连接微信客服【最新/最全教程】

目录 文档微信官网文档图片微信小程序客服配置官网 效果图聊天地址手机微信电脑端 微信聊天功能实现微信小程序后台添加客服微信号以及配置代码实现参考最后 文档 微信官网文档 微信官网文档 图片 微信小程序客服配置官网 微信小程序客服配置官网 效果图 聊天地址 地址 手…

Findreport中框架图使用的注意事项

目录 简介 测试数据 闭环链路关系 解决办法&#xff1a; 根不唯一 解决办法&#xff1a; 简介 在框架图的应用中&#xff0c;一些表达上下游关系的数据非常适合用于做链路图相关的报表。可以展示成雪花图&#xff0c;普通架构图。但是在实际操作中有几点关于数据的注意事…