Angular 性能优化实战
Angular 性能优化实战
Angular 是一个非常强大的前端框架,但是如果不注意性能优化,应用程序可能会变得非常慢并增加加载时间。
以下是一些Angular性能优化经验的实战建议:
1. 使用 OnPush 变更检测策略
默认情况下,Angular检查应用程序中发生的所有数据更改,从而导致性能下降。为了解决这个问题,可以使用OnPush变更检测策略,这将只在输入绑定值发生更改时才启动变更检测。这个策略只适用于具有@Input() properties的组件,并且需要手动设置。
import {Component, ChangeDetectionStrategy} from '@angular/core';@Component({selector: 'app-sample-component',templateUrl: './sample.component.html',styleUrls: ['./sample.component.scss'],changeDetection: ChangeDetectionStrategy.OnPush
})
export class SampleComponent {// ...
}
定义一个组件并设置 changeDetection 选项为 OnPush ,如上所述。
2. 使用轻量级的管道
Angular中的管道可以用来转换数据,并在模板中显示不同的输出。使用轻量级的管道可以提高Angular应用的性能。
一个经典的例子是将日期格式化为特定的字符串形式。我们可以使用内置的DatePipe管道来实现这一点,但是它可能会导致性能问题。相反,我们可以编写一个自定义的轻量级管道来执行相同的任务:
import { Pipe, PipeTransform } from '@angular/core';@Pipe({name: 'customDate'
})
export class CustomDatePipe implements PipeTransform {transform(value: any): string {const date = new Date(value);return `${date.getDate()}/${date.getMonth() + 1}/${date.getFullYear()}`;}
}
在模板中使用这个自定义管道:
<p>{{ myDate | customDate }}</p>
在 Angular 中使用管道来转换数据是很方便的,但是需要注意的是,某些管道可能会对性能产生负面影响。建议遵循以下规则使用轻量级的管道:
- 尽可能使用纯管道: 纯管道指输入不变时,输出永远不变的管道,它们只在输入发生变化时进行计算,在模板中绑定的表达式将不会多次被执行。
- 避免使用复杂管道: 复杂管道需要更多的计算资源,因此应该尽可能避免使用它们。当您必须使用复杂管道时,应该将其结果缓存起来,以便在需要时可以重用它们。
import {Pipe, PipeTransform} from '@angular/core';@Pipe({name: 'uppercase'})
export class UpperCasePipe implements PipeTransform {transform(value: string): string {return value.toUpperCase();}
}
这样做的好处是这个自定义管道没有过多的附加操作或计算,因此它比内置的DatePipe稍微快一些,从而提高了整个应用程序的性能。
3. 使用懒加载模块
在 Angular 中,懒加载模块可以帮助你分割应用程序并提高加载时间。使用懒加载模块可以将某些代码推迟到用户需要时才加载。
为了使模块成为懒加载模块,你需要在路由中使用 loadChildren 而不是 component 属性。
const routes: Routes = [{path: 'lazy',loadChildren: () => import('./lazy/lazy.module').then(m => m.LazyModule)}
];
4. 使用 trackBy 帮助 ngFor 优化
当使用 ngFor 循环渲染数组或列表时,如果数据发生变化,“脏检查”机制会触发重新渲染所有列表项。
通过使用 trackBy 函数,可以告诉 Angular 如何跟踪列表项的变化,从而避免不必要的渲染。
<ul><li *ngFor="let item of items; trackBy: itemTrackByFn">{{ item }}</li>
</ul>
itemTrackByFn(index, item) {return item.id;
}
5. 避免在引用类型中改变对象的属性
在 Angular 应用程序中,通过在组件和服务之间传递引用类型,可以轻松地共享数据。
但是,如果你试图修改已经在其他地方使用的对象的属性,则所有对该对象的引用都将受到影响,这可能导致不必要的变更检测。
为了避免这种情况,尽量避免直接修改对象的属性,而是使用 Object.assign() 或 spread 运算符创建新对象。
const user = { id: 1, name: 'John Doe', email: 'john@example.com' };// 不好的写法
this.userService.updateUser(user.id, user.name);
user.email = 'new-email@example.com';// 好的写法
this.userService.updateUser(user.id, user.name, { email: 'new-email@example.com' });
6. 使用虚拟滚动
当你需要处理大量数据时,虚拟滚动可以帮助你实现快速、流畅的滚动体验,而无需渲染整个列表。
Angular CDK 提供了一个名为 CdkVirtualScrollViewport 的指令,它可以帮助你实现虚拟滚动。
<cdk-virtual-scroll-viewport itemSize="50" class="example-viewport"><div *cdkVirtualFor="let item of items" class="example-item">{{item}}</div>
</cdk-virtual-scroll-viewport>
以上是一些 Angular 性能优化的实战,其中一些技术可以单独应用,同时使用全部技巧可以帮助你最大程度地提高 Angular 应用程序的性能并改善用户体验。
7. 开启 AOT 编译
开启 AOT 编译可以大大提高应用程序的性能。AOT 编译将在构建期间对组件/指令和模板进行编译,并将生成的 JavaScript 代码直接注入到 HTML 模板中。这意味着在运行时,浏览器不再需要编译模板,从而减少启动时间和加载时间。
具体来说,以下是如何开启 AOT 编译:
- 在 Angular CLI 中使用
--aot选项构建您的应用程序:ng build --aot - 在 Angular 应用程序中配置 JIT 编译器,以便像 AOT 所做的那样提前编译组件:
@NgModule({// ...providers: [{provide: COMPILER_OPTIONS,useValue: {providers: [{useClass: JitCompiler}]},multi: true}],// ...
})
export class AppModule {}
以上是一些 Angular 性能优化的实战,其中一些技术可以单独应用,也可以同时使用,它可以帮助你最大程度地提高 Angular 应用程序的性能并改善用户体验。
相关文章:
Angular 性能优化实战
Angular 性能优化实战 Angular 是一个非常强大的前端框架,但是如果不注意性能优化,应用程序可能会变得非常慢并增加加载时间。 以下是一些Angular性能优化经验的实战建议: 1. 使用 OnPush 变更检测策略 默认情况下,Angular检查…...
在vue项目使用数据可视化 echarts ,柱状图、折线图、饼状图使用示例详解及属性详解
官网地址:Apache ECharts 一、下载插件并在页面中引入 npm install echarts --save 页面导入: import * as echarts from echarts 全局导入: main.js 中,导入并注册到全局 import echarts from echarts Vue.prototype.$echart…...
九耶丨阁瑞钛伦特-井字棋html5代码
你想了解关于井字棋(Tic-Tac-Toe)的HTML代码吗?以下是一个简单的井子棋的HTML代码示例: <!DOCTYPE html> <html> <head><title>Tic-Tac-Toe</title><style>.board {display: flex;flex-wrap…...
Linux服务器上配置HTTP和HTTPS代理
本文将向你分享如何在Linux服务器上配置HTTP和HTTPS代理的方法,解决可能遇到的问题,让你的爬虫项目顺利运行,畅爬互联网! 配置HTTP代理的步骤 1. 了解HTTP代理的类型:常见的有正向代理和反向代理两种类型。根据实际需求…...
OpenZFS 2.2 发布 RC3,支持 Linux 6.4
导读之前的 OpenZFS 2.2 候选版本已致力于实现与 Linux 6.4 内核的兼容性,而在 2.2-rc3 中,Linux 6.4 支持的元跟踪器已标记为已完成。 OpenZFS 2.2 发布了第 3 个 RC 版本。 之前的 OpenZFS 2.2 候选版本已致力于实现与 Linux 6.4 内核的兼容性&#x…...
嵌入式 C 语言程序数据基本存储结构
一、5大内存分区 内存分成5个区,它们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 1、栈区(stack):FIFO就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。 …...
记录VS2022离线安装NuGet包的过程
离线安装NuGet包主要分为两个阶段:指定安装源及下载包及其依赖项。本文记录在VS2022中离线安装NuGet包的过程及注意事项。 离线安装NuGet包,主要有两种方式:1)搭建局域网或本机NuGet服务器,将VS2022的源指定为NuGe…...
tomcat的多实例和动静分离
目录 多实例 安装tomcat 配置 tomcat 环境变量 修改server.xml文件 修改开关文件,添加环境变量 tomcat1 tomcat2 启动 浏览器访问测试 nginxtomcat实现动静分离 Nginx实现负载均衡的原理 部署nginx的负载器 搭建第三台tomcat 配置多实例服务器 Tomcat…...
点成案例丨比浊仪用于乳酸菌抑菌活性测定
乳酸菌概述 自1929年英国科学家弗莱明发现青霉素以来,抗生素为人类医学的进步做出了巨大贡献。然而,抗生素在临床上广泛且持续的使用导致病原微生物产生了耐药性。目前,病原微生物对抗生素的耐药性正在威胁人们的健康,寻找具有抑…...
总结synchronized
一.synchronized的特性 synchronized 是 Java 语言中内置的关键字,用于实现线程同步,以确保多线程环境下共享资源的安全访问。 互斥性:synchronized保证了同一时刻只有一个线程可以执行被synchronized修饰的代码块或方法。当一个线程进入sync…...
react实现模拟弹框遮罩的自定义hook
需求描述 点击按钮用于检测鼠标是否命中按钮 代码实现 import React from react; import {useState, useEffect, useRef} from react;// 封装一个hook用来检测当前点击事件是否在某个元素之外 function useClickOutSide(ref,cb) {useEffect(()>{const handleClickOutside…...
直接在html中引入Vue.js的cdn来实现一个简单的博客
摘要 其实建立一个博客系统是非常简单的,有很多开源的程序,如果你不喜欢博客系统,也可以自己开发,也可以自己简单做一个。我这次就是用Vue.js和php做后端服务实现一个简单的博客。 界面 代码结构 代码 index.html <!DOCTYP…...
Android Studio瀑布流实现
效果: ImageDetail class package com.example.waterfallflow; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.widget.ImageView;public class ImageDetail extends Activity{Overrideprotected void …...
Java 中的 == 运算符、equals 方法和 hashcode 方法
一、 运算符 是 Java 中的一个运算符,用于比较两个对象,但在比较两个对象的时候需要根据比较类型分情况进行讨论。 1.1 基本数据类型与基本数据类型 基本数据类型之间通过 进行比较的时候,是直接比较它们的大小,而与它们的具体…...
第一个ArkTS项目实践-鸿蒙ArkTS
第一个ArkTS项目实践-ArkTS 第一个ArkTS项目实践-ArkTS自定义组件的组成配置属性与布局配置属性布局 改变组件状态循环渲染列表数据代码ToDoItem组件ToDoList页面 效果参考资料 第一个ArkTS项目实践-ArkTS 本篇文章是官网上视频对ArkTS开发实践的第一个视频,主要是引…...
【数据结构•堆】序列和的前n小元素(堆排序)
题目描述 问题:序列和的前 n n n小元素 给出两个长度为 n n n的有序表 A A A和 B B B, 在A和B中各任取一个, 可以得到 n 2 n^2 n2 个和. 求这些和最小的 n n n个。 输入输出格式 输入格式: 输入数据共三行。 第一行,一个整数值 n n …...
Keepalived+http高可用实战
环境准备: 两台安装了keepalived的服务器 ip:192.168.134.170;192.168.134.172 1、安装http服务 yum install httpd -y2、写一个测试页面 [rootlocalhost ~]# echo "hostname -I,web1 test page. " > /var/www/html/inde [rootlocalho…...
Linux文件系统管理
Linux文件系统管理 磁盘的组成与分区 计算机用于存取文件的硬件是磁盘,磁盘的组成主要有磁盘盘、机械手臂、磁盘读取头与主轴马达所组成, 而数据的写入其实是在磁盘盘上面。磁盘盘上面又可细分出扇区(Sector)与磁道(Track)两种单位, 其中扇区…...
MyBatis-Plugin源码全面分析
三、MyBatis-Plugin 1. 基本开发方式 需求:在MyBatis执行之前打印一行醒目的日志,携带参数 实现Interceptor接口: Intercepts(Signature(type Executor.class,method "query",args {MappedStatement.class,Object.class, RowB…...
Vscode 常用操作教程
一、语言换成中文 这是我们可以直接点击左边栏第四个图标搜索插件 chinese ,也可以直接ctrlshiftp快捷键也会出来如图所示图标,出来chinese 插件之后选择安装install,安装完成之后重新ctrlshiftp会出现如图所示页面 找到我的鼠标在的地方对应的中文,此时…...
利用 TaoToken 统一管理多个 AI 项目的 API 密钥与用量
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 利用 TaoToken 统一管理多个 AI 项目的 API 密钥与用量 当你手头同时运行着多个 AI 应用或实验项目时,管理分散的 API …...
HS2-HF Patch:从新手到高手,一站式解决HoneySelect2的三大核心困扰
HS2-HF Patch:从新手到高手,一站式解决HoneySelect2的三大核心困扰 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 如果你正在玩HoneySe…...
5步实现Realtek RTL8125网卡在VMware ESXi 6.7上的完整驱动适配解决方案
5步实现Realtek RTL8125网卡在VMware ESXi 6.7上的完整驱动适配解决方案 【免费下载链接】r8125-esxi Realtek RTL8125 driver for ESXi 6.7 项目地址: https://gitcode.com/gh_mirrors/r8/r8125-esxi 在虚拟化环境中,Realtek RTL8125 2.5G网卡驱动适配是许多…...
终极OneNote Markdown插件:3步让你的笔记焕然一新
终极OneNote Markdown插件:3步让你的笔记焕然一新 【免费下载链接】NoteWidget Markdown add-in for Microsoft Office OneNote 项目地址: https://gitcode.com/gh_mirrors/no/NoteWidget 还在为OneNote中繁琐的格式调整而烦恼吗?OneNote Markdow…...
Linuxptp从入门到排查:一份覆盖安装、配置与常见报错解决的保姆级指南
Linuxptp从入门到排查:一份覆盖安装、配置与常见报错解决的保姆级指南当你在数据中心里部署高精度时间同步服务时,突然发现日志里不断跳出master offset超限警告;或者当你按照教程配置完ptp4l后,时钟状态始终卡在s0无法锁定——这…...
深度解析Reloaded-II架构:高级模组依赖管理与循环依赖解决方案
深度解析Reloaded-II架构:高级模组依赖管理与循环依赖解决方案 【免费下载链接】Reloaded-II Universal .NET Core Powered Modding Framework for any Native Game X86, X64. 项目地址: https://gitcode.com/gh_mirrors/re/Reloaded-II Reloaded-II作为一款…...
DLSS Swapper完全指南:智能管理游戏DLSS版本的开源革命
DLSS Swapper完全指南:智能管理游戏DLSS版本的开源革命 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 你是否曾在《赛博朋克2077》中为DLSS版本过旧导致的画面闪烁而烦恼?是否因为《控制》中的…...
次梯度优化与最优传输:实现公平系统辨识的算法框架
1. 项目概述与核心问题系统辨识,简单来说,就是“教会”计算机理解一个物理或抽象系统的运作规律。比如,我们有一台复杂的工业反应釜,输入是原料的流速和温度,输出是最终产品的浓度。系统辨识的目标,就是通过…...
别再乱用apt --fix-broken了!详解Ubuntu下unixodbc依赖报错的根本原因与安全修复流程
深入解析Ubuntu中unixodbc依赖冲突的根源与系统化修复方案当你在Ubuntu终端中看到"未满足的依赖关系"和"试图覆盖文件"的错误提示时,是否曾盲目执行过apt --fix-broken install命令?这种条件反射式的操作可能暂时解决问题࿰…...
用while循环语句求和
在“用for循环语句求和”中,学习了for循环语句,这篇博文继续学习另一种形式的循环程序结构while循环语句。while循环语句一般用于事先不能确定循环次数的情况,格式为while 表达式循环体end如果表达式为真,就执行循环体的内容&…...
