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 應用程序的性能并改善用戶體驗。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/36310.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36310.shtml
英文地址,請注明出處:http://en.pswp.cn/news/36310.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vite跨域配置踩坑,postman鏈接后端接口正常,但是前端就是不能正常訪問

問題一&#xff1a;怎么都鏈接不了后端地址 根據以下配置&#xff0c;發現怎么都鏈接不了后端地址&#xff0c;proxy對了呀。 仔細看&#xff0c;才發現host有問題 // 本地運行配置&#xff0c;及反向代理配置server: {host: 0,0,0,0,port: 80,// cors: true, // 默認啟用并允…

爆肝整理,性能測試方法與關鍵指標以及瓶頸定位思路,一篇貫通...

目錄&#xff1a;導讀 前言一、Python編程入門到精通二、接口自動化項目實戰三、Web自動化項目實戰四、App自動化項目實戰五、一線大廠簡歷六、測試開發DevOps體系七、常用自動化測試工具八、JMeter性能測試九、總結&#xff08;尾部小驚喜&#xff09; 前言 性能測試方法 1、…

Python編程實現百度AI開放平臺的接口對接方法,詳解和實踐指南

Python編程實現百度AI開放平臺的接口對接方法,詳解和實踐指南 引言 百度AI開放平臺提供了豐富的人工智能接口,包括語音識別、圖像識別、自然語言處理等功能。本文將通過Python編程,詳解如何對接百度AI開放平臺的接口,并提供實際代碼示例。準備工作 在開始之前,我們需要先完…

智能家居(1)---工廠模式實現燈光控制(繼電器組)以及火災報警模組的封裝

采用工廠模式以面向對象的方式來封裝各種設備模塊&#xff0c;方便整合項目以及后期的維護和擴展 mainPro.c&#xff08;主函數&#xff09; #include <stdio.h> #include "controlDevice.h"struct Devices *pdeviceHead NULL; //設備工廠鏈…

抓包工具Fiddler下載與安裝

一、Fiddler介紹 1.Fiddler簡介 Fiddler 是一款免費、靈活、操作簡單、功能強大的 HTTP 代理工具&#xff0c;是目前最常用的 HTTP 抓包工具之一。可以抓取所有的 HTTP/HTTPS 包、過濾會話、分析請求詳細內容、偽造客戶端請求、篡改服務器響應、重定向、網絡限速、斷點調試等…

數據結構刷題訓練:隊列實現棧

目錄 前言 1. 題目&#xff1a;使用隊列實現棧 2. 思路 3. 分析 3.1 創建棧 3.2入棧 3.3 出棧 3.4 棧頂數據 3.5 判空和 “ 棧 ” 的銷毀 4. 題解 總結 前言 我們已經學習了棧和隊列&#xff0c;也都實現了它們各自的底層接口&#xff0c;那么接下我們就要開始棧和隊列的專項刷…

go內存管理機制

golang內存管理基本是參考tcmalloc來進行的。go內存管理本質上是一個內存池&#xff0c;只不過內部做了很多優化&#xff1a;自動伸縮內存池大小&#xff0c;合理切割內存塊。 基本概念&#xff1a; Page&#xff1a;頁&#xff0c;一塊 8 K大小的內存空間。Go向操作系統申請和…

2.Model、ModelMap和ModelAndView的使用詳解

1.前言 最近SSM框架開發web項目&#xff0c;用得比較火熱。spring-MVC肯定用過&#xff0c;在請求處理方法可出現和返回的參數類型中&#xff0c;最重要就是Model和ModelAndView了&#xff0c;對于MVC框架&#xff0c;控制器Controller執行業務邏輯&#xff0c;用于產生模型數據…

Spring Cloud構建微服務斷路器介紹

什么是斷路器 斷路器模式源于Martin Fowler的Circuit Breaker一文。“斷路器”本身是一種開關裝置&#xff0c;用于在電路上保護線路過載&#xff0c;當線路中有電器發生短路時&#xff0c;“斷路器”能夠及時的切斷故障電路&#xff0c;防止發生過載、發熱、甚至起火等嚴重后果…

【Redis】使用Docker鏡像配置集群時的Operation timed out問題

不知道有沒有小伙伴跟我一樣是使用的Docker鏡像進行Redis集群案例模擬的&#xff08;三臺虛擬機確實帶不動 &#xff09;&#xff0c;然后我遇到了一個問題&#xff1a;Could not connect to Redis at 172.17.0.2:6379: Operation timed out 172.17.0.2是我其中一個Redis實例的…

如何測試Linux磁盤的讀寫速度

在Linux系統中也有很多命令可以測試硬盤的讀寫速度指標。以下是幾個常用命令&#xff08;注意&#xff1a;在執行測試命令之前&#xff0c;請務必備份數據以避免數據丟失&#xff01; 1、dd 命令 首先掛載磁盤 mount /dev/sdb /testdd 命令可用于進行硬盤讀寫速度測試。 例…

uniapp踩坑之項目:判斷字符串長度自動調整選項卡寬度

利用動態:class來判斷字長調整選項卡uni-data-select 寬度 //html <view><view style"width:100%" :class"checkLength(text)>4 ? textexplode:textshrink"><uni-data-select v-model"value" :localdata"rangeTag"…

android 開發中常用命令

1.反編譯 命令&#xff1a;apktool d <test.apk> -o <folderdir> 其中&#xff1a;test.apk是待反編譯文件的路徑&#xff0c;folderdir是反編譯后的文件的存儲位置。 apktool d -f <test.apk> -o <folderdir> 注意&#xff1a;如果dir已經存在&am…

從零學算法34

34.給你一個按照非遞減順序排列的整數數組 nums&#xff0c;和一個目標值 target。請你找出給定目標值在數組中的開始位置和結束位置。 如果數組中不存在目標值 target&#xff0c;返回 [-1, -1]。 你必須設計并實現時間復雜度為 O(log n) 的算法解決此問題。 示例 1&#xff1…

React Native 在高IOS版本下無法顯示圖片的問題處理

圖片在低ios版本下可以看到圖片&#xff0c;在高版本ios下顯示不了圖片 直接上解決方法 找文件 /node_modules/react-native/Libraries/Image/RCTUIImageViewAnimated.m 修改源碼 原代碼 if (_currentFrame) {layer.contentsScale self.animatedImageScale;layer.contents…

php中nts和ts

PHP語言解析器:官方提供了2種類型的版本&#xff0c;線程安全(TS)版和非線程安全(NTS)版 TS: TS(Thread-Safety)即線程安全&#xff0c;多線程訪問時&#xff0c;采用了加鎖機制&#xff0c;當一個線程訪問該類的某個數據時進行數據加鎖保護&#xff0c;其他線程不能同時進行訪…

您的網站不應該只提供一套通用 API

后端應該提供兩套 API&#xff0c;一套是外部使用的通用 API&#xff0c;服務特定的數據&#xff0c;另一套是自家使用的應用 API&#xff0c;服務特定的頁面。 在當今的web開發中&#xff0c;構建一個提供JSON服務的后端和一個渲染應用程序的前端是很流行的。我不太喜歡&…

【Sklearn】基于決策樹算法的數據分類預測(Excel可直接替換數據)

【Sklearn】基于決策樹算法的數據分類預測&#xff08;Excel可直接替換數據&#xff09; 1.模型原理1.1 模型原理1.2 數學模型 2.模型參數3.文件結構4.Excel數據5.下載地址6.完整代碼7.運行結果 1.模型原理 決策樹是一種基于樹狀結構的分類和回歸模型&#xff0c;它通過一系列…

MySql(干貨)

寫這篇博客的目的不是為了將介紹原理&#xff0c;而是為了Sql中的代碼操作屬實太多了&#xff0c;在這里進行一個匯總&#xff0c;方便查閱&#xff01;&#xff01;&#xff01; Sql分類 分類全稱說明 DDL Data Definintion Language數據定義語言&#xff0c;用來定義數據庫對…

微信小程序(由淺到深)

文章目錄 一. 項目基本配置1. 項目組成2. 常見的配置文件解析3. app.json全局的五大配置4.單個頁面中的page配置5. App函數6.tabBar配置 二. 基本語法&#xff0c;事件&#xff0c;單位1. 語法2. 事件3. 單位 三. 數據響應式修改四 . 內置組件1. button2. image3. input4. 組件…