提升 Angular 应用性能技巧
2020-06-22

以下是我在项目中实际使用到的优化方法,更多详情,请移步本文末尾 参考链接

ChangeDetectionStrategy.OnPush 策略:只有我的命令,让你刷新你才刷新 💗

1
2
3
4
5
6
7
8
9
10
11
12
13
@Component({
selector: 'app-gallery',
templateUrl: './gallery.component.html',
styleUrls: ['./gallery.component.css'],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class GalleryComponent implements OnInit, OnDestroy {
constructor(
private cdr: ChangeDetectorRef
) {

}
}

Subscription 记得及时取消订阅/销毁

特别的,目前 Angular 中发送 HTTP 请求都是使用的 HttpClient,该对象实例的 postget 方法默认返回 Observable<any>,这就是个坑,它不会自动销毁,在请求完成之后。我的解决办法是,在 HttpClient.post 方法之后,重新 pipe 一个 take(1)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
export class BaseService {
constructor(
private http: HttpClient
) {
this.BASE_URL = '/your-app-root-path-here/';
}
/** ApiController URL */
private BASE_URL: string;

/** sending post request to API */
_post(actionName: string, formData?: object): Observable<any> {
// const url = this._baseURL + actionName;
const url = `${this.BASE_URL}${actionName}/${Math.round(performance.now())}`;
return this.http.post(
url,
getRequestBody(formData), // custom
_HTTP_OPTIONS // options
).pipe(take(1));
}
}

更多请参考 此 gist 此 gist

ngFor 指令添加 trackBy

目的是让 Angular 刷新组件部分刷新,而不是全部。

不要在表达式中调用方法,包括 getter

使用组件的属性,它不香吗,既能缓存结果,提高页面渲染性能,又能规范书写,将业务处理规则放 js/ts 端,显示规则放页面端。

使用纯管道 (pure pipe)

上一点提到,使用组件的属性缓存结果,能够提高页面渲染性能。相应的,Angular 官方推荐使用 pure pipe。

缓存 💗

能缓存的地方,都缓存,包括但不限于 HTTP 请求、静态资源、JS Object 等。

性能差的组件,可以考虑用原生 HTML 控件实现 💗

有时候,打麻雀,一把 98K 就够了,没必要用大炮,你说呢 (好像还是大材小用了😄)。

其他常规页面优化方法 💗

High Performance website

参考链接:

本文链接:
content_copy https://zxs66.github.io/2020/06/22/improve-Angular-application-performance/