AngularAtlaséd. 22.2

Chap. 11Qualité et performance50 / 75

Performance — une checklist

Ce qui compte vraiment : OnPush + Signals, track, @defer, routes en Lazy Loading, images, bundles et Hydration.

Dans Angular moderne, les bonnes performances viennent surtout des valeurs par défaut : OnPush, Signals, zoneless, routes lazy, @defer. La checklist ci-dessous est ce que vous vérifiez quand quelque chose est lent, dans l’ordre où il vaut la peine de le faire. Si l’application ralentit à mesure que l’onglet reste ouvert, ce n’est généralement pas le rendu, mais une fuite de mémoire.

Checklist

RENDU
  [ ] Composants OnPush (par défaut en v22) + état dans des Signals
  [ ] @for avec track sur un id stable (pas l’identité sur des données rechargées)
  [ ] Calculs dans computed() / une pipe pure, pas dans des méthodes appelées depuis le template
  [ ] Très grandes listes → virtual scroll (CDK ScrollingModule) ou pagination

CHARGEMENT
  [ ] Toutes les pages en lazy (loadComponent / loadChildren)
  [ ] Composants lourds sous la ligne de flottaison → @defer (on viewport / interaction)
  [ ] Services lourds, rarement utilisés → injectAsync() (v22)
  [ ] Images avec NgOptimizedImage (ngSrc, width/height, priority sur le LCP)
  [ ] Budgets de bundle dans angular.json ; vérifiez ce qu’il contient avec source-map-explorer

SSR (le cas échéant)
  [ ] Hydration incrémentale (par défaut en v22) + @defer (hydrate on ...)
  [ ] Event replay pour les clics faits pendant l’hydration
  [ ] TransferCache pour les requêtes faites sur le serveur

track compte plus que vous ne le pensez

Quand des données rechargées depuis le serveur arrivent sous forme de nouveaux objets, track row (identité) fait considérer chaque ligne comme « nouvelle » à Angular, qui détruit et recrée tout le DOM. Avec track row.id, il réutilise les lignes existantes et ne met à jour que ce qui a changé.

Bonus : en mode dev, Angular détecte lui-même le problème et affiche l’avertissement NG0956 (« track by identity caused re-creation of the entire collection »).

Live3000 lignes : track id vs track identity
« Refetch » (NOUVEAUX objets, mêmes ids) pour 3000 lignes :
Element 0441
Element 1794
Element 2368
Element 3542
Element 4318
Element 5725
Element 6572
Element 7506
Element 8423
Element 9112
Element 10225
Element 11699
Element 12135
Element 13775
Element 14517
Element 15382
Element 16895
Element 17814
Element 18461
Element 1932
Element 20450
Element 21962
Element 22352
Element 23974
Element 24915
Element 25772
Element 2684
Element 27495
Element 28252
Element 29717
Element 30738
Element 3128
Element 32783
Element 33710
Element 34815
Element 3538
Element 36338
Element 37802
Element 38568
Element 39356
Element 40476
Element 41315
Element 42785
Element 43728
Element 44694
Element 4567
Element 46881
Element 47868
Element 4845
Element 49230
Element 5038
Element 51920
Element 52996
Element 53752
Element 5434
Element 55398
Element 56990
Element 57299
Element 58803
Element 59158
Element 60135
Element 61193
Element 62712
Element 63936
Element 64398
Element 65402
Element 66119
Element 67973
Element 68861
Element 69583
Element 70462
Element 71973
Element 72316
Element 73276
Element 74439
Element 75832
Element 76940
Element 77259
Element 78599
Element 79391
Element 80420
Element 81915
Element 82335
Element 83717
Element 84858
Element 85382
Element 86310
Element 87475
Element 88871
Element 8958
Element 90573
Element 91567
Element 92363
Element 93643
Element 94937
Element 95307
Element 96500
Element 97253
Element 98953
Element 99572
Element 100603
Element 101955
Element 102498
Element 103954
Element 10434
Element 105958
Element 106173
Element 107469
Element 108911
Element 109537
Element 110339
Element 111495
Element 112695
Element 11345
Element 11428
Element 115361
Element 116196
Element 117981
Element 118739
Element 119135
Element 120508
Element 121986
Element 122575
Element 123977
Element 124144
Element 125768
Element 126246
Element 12768
Element 128738
Element 129766
Element 13069
Element 131685
Element 132153
Element 133853
Element 1343
Element 135926
Element 136451
Element 137338
Element 138565
Element 139595
Element 140576
Element 141258
Element 142159
Element 143997
Element 144129
Element 145677
Element 146711
Element 147531
Element 148575
Element 149566
Element 150740
Element 151646
Element 152848
Element 153520
Element 154351
Element 155679
Element 156602
Element 157336
Element 158857
Element 159671
Element 160469
Element 161266
Element 162576
Element 163576
Element 164950
Element 165229
Element 166677
Element 167601
Element 1689
Element 16929
Element 170172
Element 171563
Element 172776
Element 173619
Element 174402
Element 175935
Element 176460
Element 177101
Element 178486
Element 179952
Element 180739
Element 181546
Element 182758
Element 1833
Element 184382
Element 185871
Element 186954
Element 187438
Element 188150
Element 189901
Element 190939
Element 191770
Element 192393
Element 193337
Element 194969
Element 195423
Element 196861
Element 197470
Element 198146
Element 199236
Element 200831
Element 201999
Element 202223
Element 2031
Element 204366
Element 205200
Element 206251
Element 207613
Element 20818
Element 209740
Element 210466
Element 211210
Element 212450
Element 213640
Element 2143
Element 215340
Element 216782
Element 217815
Element 218844
Element 219991
Element 220240
Element 221283
Element 222962
Element 223880
Element 224442
Element 225550
Element 226279
Element 2271
Element 228863
Element 229970
Element 230790
Element 231653
Element 232914
Element 233230
Element 234144
Element 235149
Element 236440
Element 237670
Element 238513
Element 239881
Element 240142
Element 241642
Element 242825
Element 243944
Element 244424
Element 245530
Element 246104
Element 247562
Element 248497
Element 24943
Element 250861
Element 251237
Element 252480
Element 253125
Element 254513
Element 255887
Element 256696
Element 257592
Element 258708
Element 259448
Element 260142
Element 261568
Element 26212
Element 263699
Element 264998
Element 265822
Element 266334
Element 267205
Element 268333
Element 269434
Element 270989
Element 271664
Element 272938
Element 273427
Element 274474
Element 275426
Element 276358
Element 277161
Element 278646
Element 279302
Element 280148
Element 281904
Element 282644
Element 283990
Element 284454
Element 285218
Element 286328
Element 28755
Element 288697
Element 289692
Element 290979
Element 291138
Element 29264
Element 293226
Element 294565
Element 295699
Element 296550
Element 297572
Element 298949
Element 299876
Element 300584
Element 30185
Element 302945
Element 303199
Element 304111
Element 3057
Element 306620
Element 307303
Element 308146
Element 30978
Element 310990
Element 311861
Element 312242
Element 313355
Element 314919
Element 315396
Element 3166
Element 31767
Element 318797
Element 319593
Element 320910
Element 321415
Element 322273
Element 3235
Element 324357
Element 325389
Element 326915
Element 327941
Element 328874
Element 329779
Element 330599
Element 331753
Element 332758
Element 333805
Element 334732
Element 335909
Element 336308
Element 337641
Element 338373
Element 339188
Element 340949
Element 341513
Element 342638
Element 343796
Element 344644
Element 345123
Element 346965
Element 347356
Element 348642
Element 349150
Element 3502
Element 351972
Element 352927
Element 353817
Element 354805
Element 355622
Element 356348
Element 357913
Element 358975
Element 3599
Element 360862
Element 361407
Element 362645
Element 363963
Element 364747
Element 365553
Element 366325
Element 36767
Element 368907
Element 36998
Element 370934
Element 371293
Element 372793
Element 373365
Element 37476
Element 37552
Element 376584
Element 377189
Element 378318
Element 379345
Element 380588
Element 381910
Element 382475
Element 383360
Element 384253
Element 385458
Element 386717
Element 38716
Element 388551
Element 389526
Element 390457
Element 391464
Element 392973
Element 393369
Element 39499
Element 395526
Element 396847
Element 39713
Element 398362
Element 39947
Element 400277
Element 401728
Element 402432
Element 403564
Element 404386
Element 405215
Element 406812
Element 407654
Element 408669
Element 409419
Element 410967
Element 411666
Element 412349
Element 413142
Element 414250
Element 415631
Element 41685
Element 417769
Element 418428
Element 419886
Element 42014
Element 421344
Element 422886
Element 423791
Element 424308
Element 425688
Element 426841
Element 427650
Element 428963
Element 429432
Element 430536
Element 431103
Element 432474
Element 433648
Element 434598
Element 435429
Element 436488
Element 437721
Element 438926
Element 43975
Element 440718
Element 441967
Element 442187
Element 443515
Element 444917
Element 445706
Element 446847
Element 447595
Element 448523
Element 449513
Element 450716
Element 451576
Element 452658
Element 453272
Element 454619
Element 455747
Element 456352
Element 457698
Element 458445
Element 459550
Element 460277
Element 461131
Element 462642
Element 463329
Element 464352
Element 465776
Element 466704
Element 467903
Element 46837
Element 469487
Element 470508
Element 471926
Element 47295
Element 473224
Element 474870
Element 475338
Element 476597
Element 477472
Element 478283
Element 479891
Element 480541
Element 481704
Element 482113
Element 483235
Element 484195
Element 4854
Element 486531
Element 48748
Element 488417
Element 489791
Element 490784
Element 491140
Element 492555
Element 493595
Element 49439
Element 495660
Element 496294
Element 497790
Element 498560
Element 499386
Element 500401
Element 501530
Element 502140
Element 503597
Element 504828
Element 505678
Element 506681
Element 507779
Element 508344
Element 509649
Element 510281
Element 511945
Element 512264
Element 513783
Element 514482
Element 51586
Element 516590
Element 517834
Element 518954
Element 519637
Element 520649
Element 521559
Element 522524
Element 523530
Element 52492
Element 525830
Element 526876
Element 527297
Element 528658
Element 529957
Element 53062
Element 531855
Element 532491
Element 533251
Element 534160
Element 535114
Element 536438
Element 537679
Element 538366
Element 539825
Element 540536
Element 54129
Element 542291
Element 543631
Element 54448
Element 545131
Element 546289
Element 547764
Element 548930
Element 549360
Element 550920
Element 551487
Element 552253
Element 553536
Element 554280
Element 555748
Element 556221
Element 557708
Element 558406
Element 559980
Element 560689
Element 561878
Element 562923
Element 563236
Element 564209
Element 565212
Element 56624
Element 567212
Element 568696
Element 569984
Element 570347
Element 571791
Element 572569
Element 573302
Element 574828
Element 575575
Element 576800
Element 577279
Element 578491
Element 579472
Element 580749
Element 581681
Element 582734
Element 583407
Element 584440
Element 585832
Element 586160
Element 587325
Element 588196
Element 589390
Element 590512
Element 591435
Element 592880
Element 593634
Element 594937
Element 595146
Element 596811
Element 59754
Element 598421
Element 599407
Element 600625
Element 601156
Element 602772
Element 603399
Element 604320
Element 605904
Element 60615
Element 607561
Element 608111
Element 609266
Element 610411
Element 611430
Element 612781
Element 613119
Element 61469
Element 615911
Element 61655
Element 617910
Element 618521
Element 619409
Element 620779
Element 621533
Element 622251
Element 623234
Element 624443
Element 625873
Element 626244
Element 627121
Element 628343
Element 629390
Element 630457
Element 631567
Element 632805
Element 633698
Element 634707
Element 635785
Element 636351
Element 637328
Element 638266
Element 639412
Element 640653
Element 641189
Element 642485
Element 643552
Element 644248
Element 645212
Element 646414
Element 647221
Element 648943
Element 649403
Element 650726
Element 651770
Element 652911
Element 653160
Element 654532
Element 655949
Element 656326
Element 657375
Element 658514
Element 659596
Element 660404
Element 661364
Element 662921
Element 663712
Element 664512
Element 665834
Element 666696
Element 667929
Element 668261
Element 669175
Element 670697
Element 671815
Element 672620
Element 673454
Element 674760
Element 675222
Element 676538
Element 677885
Element 678825
Element 679823
Element 680762
Element 681355
Element 682596
Element 683679
Element 684266
Element 685822
Element 68650
Element 687944
Element 688573
Element 689518
Element 690721
Element 691168
Element 692156
Element 693693
Element 694825
Element 695812
Element 696969
Element 697142
Element 698926
Element 699249
Element 700334
Element 701381
Element 702383
Element 703704
Element 704103
Element 705885
Element 706592
Element 707445
Element 708529
Element 709156
Element 710623
Element 711734
Element 712457
Element 71397
Element 71483
Element 715752
Element 716928
Element 717676
Element 718640
Element 719919
Element 72057
Element 721198
Element 722844
Element 723364
Element 724349
Element 725804
Element 726696
Element 727471
Element 728546
Element 729669
Element 730522
Element 731743
Element 732487
Element 733103
Element 734303
Element 735927
Element 736394
Element 737468
Element 738767
Element 739610
Element 740445
Element 741727
Element 742732
Element 743474
Element 744194
Element 745588
Element 746911
Element 747980
Element 748194
Element 749989
Element 750881
Element 751286
Element 752940
Element 753728
Element 754569
Element 755849
Element 756203
Element 757580
Element 75829
Element 759413
Element 760247
Element 761747
Element 762621
Element 763885
Element 76460
Element 765730
Element 766569
Element 767883
Element 768131
Element 769501
Element 770221
Element 771145
Element 772805
Element 773654
Element 774924
Element 775276
Element 776677
Element 777209
Element 778169
Element 779776
Element 780107
Element 781875
Element 782769
Element 783675
Element 784561
Element 785507
Element 78665
Element 787486
Element 788151
Element 789157
Element 790158
Element 791938
Element 792450
Element 793497
Element 794405
Element 795155
Element 796232
Element 797943
Element 798723
Element 799744
Element 800495
Element 801814
Element 802499
Element 803717
Element 804586
Element 805280
Element 806955
Element 80738
Element 808517
Element 809463
Element 810841
Element 811670
Element 812235
Element 813150
Element 814533
Element 815737
Element 81674
Element 817731
Element 818682
Element 81973
Element 820621
Element 821438
Element 822778
Element 823540
Element 824209
Element 825825
Element 826460
Element 827983
Element 82834
Element 829582
Element 830352
Element 831379
Element 832816
Element 833646
Element 834491
Element 835636
Element 836167
Element 837384
Element 838280
Element 839266
Element 840655
Element 841785
Element 842413
Element 843464
Element 8440
Element 845708
Element 846443
Element 847356
Element 848335
Element 849175
Element 850744
Element 851188
Element 852261
Element 853607
Element 854919
Element 855682
Element 856864
Element 857371
Element 858678
Element 859962
Element 860110
Element 861727
Element 862913
Element 863533
Element 864221
Element 865697
Element 866721
Element 867334
Element 868936
Element 869193
Element 870742
Element 87127
Element 872194
Element 873679
Element 874133
Element 875803
Element 8766
Element 877426
Element 878306
Element 879757
Element 880341
Element 881961
Element 882815
Element 883858
Element 884812
Element 885908
Element 886813
Element 887666
Element 888421
Element 889156
Element 890637
Element 891100
Element 89216
Element 893626
Element 894273
Element 895247
Element 89623
Element 897589
Element 89845
Element 899941
Element 900433
Element 901426
Element 902265
Element 90358
Element 904117
Element 90558
Element 906445
Element 907530
Element 908606
Element 909385
Element 910542
Element 91187
Element 91213
Element 913389
Element 914294
Element 915546
Element 916856
Element 917111
Element 918980
Element 91980
Element 920135
Element 921569
Element 92294
Element 923353
Element 9245
Element 925779
Element 926145
Element 927859
Element 928941
Element 92952
Element 930410
Element 931996
Element 932485
Element 933363
Element 934122
Element 935637
Element 936342
Element 937567
Element 938294
Element 939698
Element 940722
Element 941978
Element 942909
Element 943491
Element 944679
Element 94599
Element 94657
Element 947939
Element 948465
Element 949258
Element 950764
Element 951343
Element 952552
Element 953442
Element 954975
Element 955591
Element 956407
Element 957800
Element 958285
Element 959858
Element 960468
Element 961881
Element 962264
Element 963532
Element 964254
Element 965688
Element 966471
Element 967924
Element 968254
Element 969907
Element 970437
Element 971345
Element 972374
Element 973467
Element 97441
Element 975355
Element 976951
Element 977348
Element 978289
Element 979643
Element 980151
Element 981686
Element 982232
Element 983862
Element 984361
Element 985209
Element 986542
Element 987217
Element 988398
Element 989592
Element 990227
Element 99115
Element 992962
Element 993146
Element 994651
Element 995532
Element 996407
Element 997241
Element 998990
Element 99980
Element 1000966
Element 1001770
Element 1002771
Element 1003338
Element 1004816
Element 1005873
Element 1006481
Element 1007785
Element 1008195
Element 1009965
Element 1010614
Element 1011446
Element 1012961
Element 1013773
Element 101419
Element 1015352
Element 1016915
Element 1017877
Element 1018742
Element 1019225
Element 1020662
Element 1021630
Element 102281
Element 1023660
Element 102417
Element 1025580
Element 1026177
Element 1027707
Element 1028234
Element 102991
Element 1030261
Element 1031912
Element 1032765
Element 1033700
Element 1034546
Element 1035694
Element 1036943
Element 1037411
Element 1038171
Element 1039753
Element 1040755
Element 1041676
Element 1042799
Element 1043630
Element 1044198
Element 1045729
Element 1046322
Element 1047833
Element 104899
Element 1049631
Element 1050688
Element 1051847
Element 1052557
Element 1053551
Element 1054310
Element 1055210
Element 1056272
Element 1057524
Element 1058813
Element 1059299
Element 1060236
Element 1061582
Element 1062698
Element 1063313
Element 1064966
Element 1065240
Element 1066386
Element 1067917
Element 1068608
Element 1069593
Element 1070389
Element 1071455
Element 1072900
Element 1073275
Element 1074153
Element 1075580
Element 1076484
Element 1077756
Element 1078351
Element 1079564
Element 1080375
Element 1081882
Element 1082586
Element 1083349
Element 1084488
Element 1085326
Element 1086341
Element 1087537
Element 1088620
Element 1089501
Element 1090670
Element 1091733
Element 1092238
Element 1093979
Element 1094229
Element 1095660
Element 1096655
Element 1097527
Element 1098904
Element 1099746
Element 1100829
Element 1101849
Element 1102370
Element 1103615
Element 1104417
Element 1105250
Element 110652
Element 1107667
Element 1108674
Element 1109655
Element 1110257
Element 1111947
Element 1112782
Element 1113292
Element 111487
Element 1115717
Element 111614
Element 1117749
Element 1118280
Element 1119827
Element 1120763
Element 1121509
Element 1122282
Element 112374
Element 1124502
Element 1125966
Element 1126359
Element 1127395
Element 1128157
Element 1129931
Element 113032
Element 1131349
Element 1132945
Element 1133140
Element 1134169
Element 1135338
Element 113681
Element 1137910
Element 1138780
Element 1139694
Element 1140612
Element 1141446
Element 1142711
Element 114345
Element 1144801
Element 1145529
Element 1146665
Element 1147393
Element 1148212
Element 1149826
Element 1150869
Element 1151184
Element 115266
Element 115354
Element 1154843
Element 1155406
Element 1156218
Element 1157634
Element 115878
Element 1159121
Element 1160206
Element 1161838
Element 1162638
Element 1163150
Element 1164849
Element 1165267
Element 1166496
Element 1167394
Element 116879
Element 1169468
Element 1170189
Element 1171369
Element 1172789
Element 1173646
Element 1174849
Element 1175809
Element 1176750
Element 117710
Element 1178966
Element 1179402
Element 1180333
Element 1181905
Element 1182423
Element 1183813
Element 1184811
Element 1185923
Element 1186571
Element 1187121
Element 1188141
Element 1189775
Element 1190933
Element 119124
Element 1192937
Element 1193953
Element 1194506
Element 1195665
Element 1196593
Element 1197708
Element 1198892
Element 1199944
Element 1200273
Element 1201121
Element 1202309
Element 1203197
Element 1204124
Element 1205320
Element 1206793
Element 1207863
Element 1208344
Element 120953
Element 1210918
Element 1211183
Element 1212273
Element 1213873
Element 1214772
Element 1215920
Element 1216474
Element 1217295
Element 1218874
Element 121991
Element 1220135
Element 1221778
Element 1222405
Element 1223879
Element 1224461
Element 1225386
Element 1226561
Element 1227407
Element 1228242
Element 1229496
Element 1230340
Element 1231381
Element 1232365
Element 1233516
Element 1234791
Element 123536
Element 1236860
Element 123763
Element 1238948
Element 1239480
Element 1240770
Element 124150
Element 124241
Element 1243925
Element 1244548
Element 1245583
Element 1246200
Element 1247757
Element 1248474
Element 1249421
Element 1250174
Element 1251683
Element 1252497
Element 1253242
Element 1254310
Element 1255149
Element 12567
Element 1257334
Element 1258747
Element 1259325
Element 1260228
Element 1261129
Element 1262604
Element 1263407
Element 1264420
Element 126576
Element 1266782
Element 1267658
Element 1268177
Element 1269369
Element 127012
Element 1271768
Element 127236
Element 1273809
Element 1274479
Element 1275818
Element 1276865
Element 1277781
Element 1278452
Element 1279612
Element 1280104
Element 1281686
Element 1282631
Element 1283691
Element 1284274
Element 128598
Element 1286286
Element 1287164
Element 1288161
Element 1289827
Element 1290672
Element 1291728
Element 1292777
Element 1293583
Element 1294319
Element 1295766
Element 1296512
Element 1297699
Element 1298111
Element 129926
Element 1300880
Element 1301260
Element 1302512
Element 1303874
Element 1304743
Element 1305914
Element 1306637
Element 1307308
Element 1308684
Element 1309161
Element 1310894
Element 1311137
Element 1312763
Element 131396
Element 1314879
Element 1315574
Element 1316370
Element 1317493
Element 131896
Element 1319687
Element 1320445
Element 1321363
Element 1322921
Element 132330
Element 132476
Element 1325107
Element 1326623
Element 1327281
Element 1328614
Element 1329364
Element 1330636
Element 1331700
Element 1332145
Element 1333988
Element 1334621
Element 133515
Element 1336907
Element 1337334
Element 1338776
Element 1339681
Element 1340965
Element 1341306
Element 1342888
Element 1343607
Element 1344535
Element 1345698
Element 1346331
Element 1347275
Element 1348528
Element 1349380
Element 1350781
Element 1351461
Element 1352100
Element 1353662
Element 1354171
Element 1355237
Element 1356845
Element 1357702
Element 1358537
Element 1359340
Element 136093
Element 1361168
Element 1362634
Element 1363818
Element 1364352
Element 136533
Element 1366726
Element 1367400
Element 1368889
Element 1369269
Element 1370105
Element 1371133
Element 137274
Element 1373195
Element 1374525
Element 1375269
Element 1376674
Element 1377188
Element 1378766
Element 1379748
Element 1380375
Element 1381672
Element 1382636
Element 1383664
Element 1384717
Element 1385344
Element 1386244
Element 1387450
Element 1388174
Element 1389593
Element 1390595
Element 1391657
Element 139224
Element 1393363
Element 1394500
Element 1395117
Element 1396583
Element 1397808
Element 1398202
Element 1399800
Element 1400123
Element 140195
Element 1402431
Element 1403997
Element 1404602
Element 1405884
Element 1406140
Element 1407752
Element 1408280
Element 1409281
Element 1410855
Element 1411134
Element 1412637
Element 1413605
Element 1414777
Element 141540
Element 141666
Element 1417174
Element 1418445
Element 1419995
Element 1420786
Element 1421877
Element 1422127
Element 1423396
Element 1424251
Element 1425977
Element 1426264
Element 1427729
Element 1428167
Element 1429960
Element 1430592
Element 1431479
Element 1432601
Element 1433683
Element 1434335
Element 1435597
Element 1436761
Element 143761
Element 1438698
Element 1439447
Element 1440853
Element 1441632
Element 1442133
Element 1443977
Element 1444472
Element 1445358
Element 1446343
Element 1447312
Element 1448385
Element 1449860
Element 1450430
Element 1451961
Element 1452922
Element 1453816
Element 1454517
Element 1455469
Element 1456406
Element 1457635
Element 1458594
Element 1459846
Element 1460630
Element 1461856
Element 1462330
Element 1463903
Element 1464295
Element 1465388
Element 146622
Element 1467170
Element 1468652
Element 1469363
Element 147065
Element 1471770
Element 1472578
Element 1473664
Element 1474171
Element 147533
Element 1476411
Element 1477484
Element 1478771
Element 1479800
Element 148042
Element 1481635
Element 1482469
Element 1483934
Element 1484764
Element 1485315
Element 1486394
Element 1487234
Element 1488607
Element 1489301
Element 1490597
Element 1491872
Element 149232
Element 1493339
Element 1494937
Element 1495377
Element 1496886
Element 1497281
Element 1498881
Element 1499855
Element 1500724
Element 1501440
Element 1502760
Element 1503894
Element 1504648
Element 1505664
Element 1506169
Element 1507585
Element 1508922
Element 1509742
Element 1510430
Element 1511806
Element 1512855
Element 151311
Element 1514954
Element 1515617
Element 1516913
Element 1517333
Element 151813
Element 1519743
Element 1520227
Element 1521934
Element 152216
Element 1523388
Element 1524867
Element 1525176
Element 1526251
Element 1527394
Element 1528174
Element 1529117
Element 1530243
Element 153195
Element 1532546
Element 1533887
Element 1534777
Element 1535635
Element 1536776
Element 1537539
Element 1538717
Element 1539476
Element 1540666
Element 1541147
Element 154256
Element 1543441
Element 1544422
Element 1545360
Element 1546831
Element 1547686
Element 1548199
Element 1549861
Element 1550626
Element 1551753
Element 1552516
Element 1553477
Element 1554484
Element 1555436
Element 155695
Element 1557720
Element 1558296
Element 1559584
Element 1560822
Element 1561710
Element 1562541
Element 1563405
Element 1564900
Element 1565128
Element 15665
Element 1567956
Element 1568425
Element 1569671
Element 1570530
Element 1571239
Element 1572150
Element 157354
Element 15741
Element 1575954
Element 1576870
Element 1577367
Element 1578485
Element 1579417
Element 1580251
Element 158154
Element 1582810
Element 158318
Element 1584398
Element 1585528
Element 1586716
Element 1587818
Element 1588176
Element 1589279
Element 159029
Element 159150
Element 1592979
Element 159341
Element 1594978
Element 1595424
Element 1596274
Element 1597875
Element 1598941
Element 159972
Element 160023
Element 1601555
Element 1602693
Element 1603936
Element 1604945
Element 1605165
Element 1606888
Element 1607551
Element 1608778
Element 1609815
Element 1610121
Element 1611937
Element 1612572
Element 1613943
Element 1614329
Element 1615694
Element 1616359
Element 1617205
Element 1618578
Element 161932
Element 1620822
Element 1621591
Element 162247
Element 1623568
Element 1624440
Element 1625895
Element 1626496
Element 1627330
Element 1628239
Element 1629648
Element 163033
Element 1631500
Element 1632196
Element 1633832
Element 1634637
Element 1635446
Element 1636338
Element 1637662
Element 163894
Element 1639766
Element 1640428
Element 1641925
Element 1642487
Element 1643937
Element 1644117
Element 1645400
Element 1646969
Element 1647191
Element 1648683
Element 1649480
Element 1650939
Element 1651666
Element 165260
Element 1653749
Element 16543
Element 1655753
Element 1656910
Element 1657860
Element 1658644
Element 16594
Element 1660151
Element 166176
Element 1662114
Element 1663753
Element 1664749
Element 1665737
Element 1666432
Element 1667227
Element 1668994
Element 1669845
Element 1670441
Element 167159
Element 167255
Element 1673306
Element 1674438
Element 1675211
Element 1676698
Element 167770
Element 1678908
Element 1679582
Element 1680901
Element 1681996
Element 1682731
Element 1683686
Element 1684197
Element 1685930
Element 1686387
Element 1687344
Element 1688763
Element 1689189
Element 1690682
Element 169116
Element 1692953
Element 1693984
Element 1694190
Element 1695916
Element 1696189
Element 1697644
Element 1698539
Element 169973
Element 1700398
Element 1701825
Element 1702178
Element 1703457
Element 1704318
Element 1705624
Element 1706170
Element 1707772
Element 1708320
Element 1709430
Element 1710605
Element 1711718
Element 1712381
Element 1713255
Element 1714184
Element 171536
Element 1716243
Element 1717335
Element 1718275
Element 1719192
Element 1720933
Element 1721280
Element 172286
Element 1723251
Element 1724969
Element 1725480
Element 1726770
Element 1727740
Element 1728875
Element 1729414
Element 1730738
Element 1731822
Element 1732115
Element 1733495
Element 1734367
Element 1735646
Element 1736362
Element 1737630
Element 1738915
Element 1739694
Element 1740876
Element 1741582
Element 1742872
Element 1743756
Element 1744562
Element 1745391
Element 1746958
Element 1747518
Element 1748961
Element 1749729
Element 1750592
Element 1751155
Element 1752938
Element 1753412
Element 1754579
Element 1755704
Element 1756888
Element 1757887
Element 1758578
Element 1759175
Element 1760552
Element 1761222
Element 1762422
Element 1763370
Element 1764120
Element 1765220
Element 1766890
Element 176794
Element 1768754
Element 1769341
Element 177038
Element 1771257
Element 1772533
Element 1773260
Element 1774882
Element 1775578
Element 1776964
Element 1777515
Element 1778401
Element 1779926
Element 1780554
Element 1781428
Element 1782580
Element 1783592
Element 1784922
Element 1785148
Element 1786578
Element 1787962
Element 1788625
Element 1789538
Element 1790808
Element 1791939
Element 1792758
Element 1793595
Element 1794195
Element 1795671
Element 179659
Element 1797497
Element 1798681
Element 179910
Element 1800719
Element 1801496
Element 1802353
Element 1803639
Element 1804493
Element 1805579
Element 1806785
Element 1807161
Element 1808661
Element 1809849
Element 1810700
Element 1811452
Element 1812205
Element 1813701
Element 1814265
Element 1815630
Element 1816872
Element 181751
Element 1818961
Element 1819274
Element 1820687
Element 1821257
Element 1822179
Element 1823402
Element 1824670
Element 1825660
Element 1826330
Element 1827996
Element 1828620
Element 182996
Element 1830581
Element 1831664
Element 1832720
Element 1833153
Element 1834240
Element 1835990
Element 1836330
Element 1837362
Element 1838493
Element 1839955
Element 1840823
Element 1841553
Element 1842347
Element 1843965
Element 1844513
Element 1845606
Element 1846894
Element 1847492
Element 1848291
Element 1849142
Element 1850212
Element 1851498
Element 1852304
Element 1853975
Element 1854695
Element 1855800
Element 1856504
Element 1857366
Element 185872
Element 1859578
Element 1860843
Element 1861860
Element 1862266
Element 1863684
Element 1864248
Element 1865844
Element 1866262
Element 1867899
Element 1868370
Element 1869202
Element 187064
Element 1871733
Element 1872118
Element 1873476
Element 1874938
Element 1875682
Element 1876208
Element 1877218
Element 1878891
Element 1879440
Element 1880146
Element 1881247
Element 1882675
Element 1883872
Element 1884338
Element 1885575
Element 1886141
Element 1887340
Element 1888719
Element 1889564
Element 189048
Element 1891870
Element 1892793
Element 1893581
Element 1894183
Element 1895422
Element 1896169
Element 1897819
Element 1898724
Element 1899230
Element 1900158
Element 1901844
Element 1902254
Element 190395
Element 1904597
Element 1905431
Element 1906816
Element 1907799
Element 1908454
Element 1909393
Element 1910620
Element 1911466
Element 1912249
Element 191387
Element 1914728
Element 1915949
Element 1916844
Element 1917315
Element 1918161
Element 1919680
Element 1920362
Element 1921673
Element 1922916
Element 1923646
Element 1924830
Element 1925130
Element 1926407
Element 1927198
Element 1928791
Element 1929401
Element 1930675
Element 1931148
Element 1932295
Element 1933400
Element 1934197
Element 1935731
Element 1936962
Element 1937465
Element 1938224
Element 1939218
Element 1940408
Element 1941806
Element 1942311
Element 1943909
Element 1944322
Element 1945225
Element 194654
Element 1947424
Element 1948385
Element 1949397
Element 1950642
Element 1951767
Element 1952933
Element 195383
Element 1954492
Element 1955400
Element 1956392
Element 1957629
Element 1958231
Element 195988
Element 196013
Element 1961861
Element 1962269
Element 1963512
Element 1964226
Element 1965540
Element 1966351
Element 196791
Element 196892
Element 1969519
Element 197050
Element 1971987
Element 1972235
Element 197316
Element 197467
Element 1975601
Element 1976518
Element 1977476
Element 1978984
Element 1979172
Element 1980156
Element 1981587
Element 1982108
Element 1983145
Element 1984826
Element 1985812
Element 1986186
Element 1987745
Element 198872
Element 1989661
Element 1990692
Element 1991275
Element 1992373
Element 1993855
Element 1994261
Element 1995879
Element 199682
Element 1997293
Element 1998567
Element 19998
Element 2000126
Element 2001466
Element 2002140
Element 2003177
Element 2004546
Element 2005209
Element 2006453
Element 2007344
Element 2008644
Element 2009511
Element 2010177
Element 201184
Element 2012495
Element 2013475
Element 2014494
Element 2015849
Element 2016703
Element 2017371
Element 2018660
Element 2019341
Element 2020600
Element 2021755
Element 2022342
Element 2023941
Element 202472
Element 2025895
Element 2026113
Element 2027803
Element 2028936
Element 2029179
Element 2030949
Element 2031614
Element 2032672
Element 2033106
Element 2034814
Element 203542
Element 203688
Element 2037192
Element 2038534
Element 2039910
Element 2040704
Element 2041263
Element 2042673
Element 204338
Element 2044326
Element 204527
Element 2046455
Element 2047260
Element 2048964
Element 2049844
Element 205090
Element 2051431
Element 2052265
Element 205368
Element 2054347
Element 2055259
Element 2056690
Element 2057471
Element 2058738
Element 2059886
Element 2060148
Element 2061302
Element 2062293
Element 2063154
Element 2064516
Element 2065679
Element 2066509
Element 2067131
Element 20686
Element 2069434
Element 2070298
Element 2071573
Element 2072573
Element 2073698
Element 2074151
Element 2075903
Element 2076508
Element 2077868
Element 2078600
Element 2079834
Element 208023
Element 2081758
Element 2082975
Element 2083913
Element 2084523
Element 2085829
Element 20865
Element 2087358
Element 2088765
Element 2089899
Element 2090956
Element 2091508
Element 209273
Element 2093914
Element 2094978
Element 2095746
Element 2096447
Element 2097155
Element 2098946
Element 2099862
Element 2100506
Element 2101229
Element 210214
Element 2103933
Element 2104705
Element 2105792
Element 2106167
Element 2107419
Element 2108833
Element 2109473
Element 2110329
Element 2111869
Element 2112627
Element 2113162
Element 2114940
Element 2115830
Element 2116336
Element 211790
Element 2118250
Element 2119371
Element 2120497
Element 2121485
Element 2122694
Element 2123918
Element 2124152
Element 2125620
Element 2126210
Element 2127212
Element 2128282
Element 2129324
Element 2130777
Element 2131766
Element 2132850
Element 2133862
Element 2134448
Element 2135912
Element 2136828
Element 2137759
Element 2138963
Element 2139636
Element 2140325
Element 2141336
Element 214295
Element 2143820
Element 2144253
Element 2145666
Element 2146604
Element 2147682
Element 2148909
Element 214913
Element 2150620
Element 2151296
Element 2152732
Element 2153962
Element 2154704
Element 2155406
Element 2156580
Element 215730
Element 2158149
Element 2159520
Element 2160375
Element 2161349
Element 216274
Element 216316
Element 2164509
Element 2165640
Element 2166897
Element 2167925
Element 216837
Element 2169737
Element 2170488
Element 2171936
Element 2172919
Element 2173747
Element 2174891
Element 2175752
Element 2176802
Element 2177429
Element 2178250
Element 2179898
Element 218047
Element 2181453
Element 2182107
Element 2183248
Element 2184369
Element 2185219
Element 2186222
Element 2187839
Element 2188622
Element 2189221
Element 2190664
Element 21917
Element 2192823
Element 2193503
Element 2194755
Element 2195733
Element 2196298
Element 2197186
Element 21984
Element 2199769
Element 2200297
Element 2201806
Element 2202960
Element 2203117
Element 220458
Element 2205291
Element 2206926
Element 2207803
Element 2208659
Element 22090
Element 2210770
Element 2211395
Element 2212371
Element 2213727
Element 2214766
Element 2215128
Element 2216137
Element 2217616
Element 2218588
Element 221941
Element 2220826
Element 2221826
Element 2222118
Element 2223704
Element 2224239
Element 2225386
Element 2226389
Element 2227324
Element 2228867
Element 2229920
Element 223099
Element 2231132
Element 2232453
Element 2233140
Element 2234442
Element 2235118
Element 2236693
Element 2237502
Element 2238107
Element 2239788
Element 2240790
Element 2241534
Element 2242582
Element 22434
Element 2244924
Element 2245247
Element 2246773
Element 2247163
Element 2248863
Element 2249210
Element 2250536
Element 2251189
Element 2252351
Element 2253345
Element 2254455
Element 2255434
Element 2256842
Element 2257503
Element 2258276
Element 2259497
Element 2260718
Element 2261180
Element 2262135
Element 2263836
Element 2264537
Element 2265160
Element 2266969
Element 2267739
Element 2268730
Element 226998
Element 2270673
Element 2271249
Element 2272115
Element 227353
Element 2274410
Element 2275748
Element 2276675
Element 2277595
Element 2278272
Element 2279620
Element 2280655
Element 2281359
Element 2282262
Element 2283842
Element 228432
Element 2285466
Element 2286531
Element 2287437
Element 2288667
Element 2289398
Element 2290400
Element 2291304
Element 2292599
Element 2293225
Element 2294970
Element 2295631
Element 2296136
Element 2297661
Element 2298334
Element 2299935
Element 230030
Element 230182
Element 2302582
Element 2303918
Element 2304229
Element 2305506
Element 2306667
Element 2307935
Element 2308679
Element 2309281
Element 2310797
Element 2311685
Element 2312169
Element 2313925
Element 2314682
Element 2315742
Element 231680
Element 2317271
Element 2318231
Element 2319479
Element 2320897
Element 2321524
Element 2322871
Element 2323502
Element 2324311
Element 2325272
Element 2326209
Element 2327729
Element 2328405
Element 2329144
Element 2330188
Element 2331512
Element 2332486
Element 2333290
Element 2334139
Element 2335372
Element 2336817
Element 2337810
Element 2338169
Element 2339462
Element 2340968
Element 2341781
Element 234212
Element 2343292
Element 2344138
Element 2345203
Element 2346717
Element 2347875
Element 234824
Element 2349409
Element 2350254
Element 2351878
Element 235246
Element 235389
Element 2354516
Element 2355225
Element 2356446
Element 2357756
Element 23584
Element 2359357
Element 2360559
Element 2361624
Element 2362203
Element 2363949
Element 2364742
Element 2365410
Element 2366559
Element 2367679
Element 2368790
Element 2369494
Element 2370392
Element 237168
Element 2372928
Element 2373592
Element 23746
Element 2375104
Element 2376268
Element 2377309
Element 2378699
Element 237912
Element 2380583
Element 2381278
Element 2382960
Element 2383608
Element 2384750
Element 2385392
Element 2386686
Element 2387452
Element 2388208
Element 2389149
Element 2390720
Element 2391920
Element 2392992
Element 2393691
Element 2394942
Element 239526
Element 2396221
Element 2397710
Element 2398168
Element 2399425
Element 2400829
Element 2401141
Element 2402346
Element 2403161
Element 2404383
Element 2405620
Element 2406546
Element 2407411
Element 2408424
Element 2409592
Element 2410750
Element 2411808
Element 2412468
Element 2413208
Element 2414650
Element 2415837
Element 2416714
Element 2417941
Element 2418348
Element 241949
Element 2420778
Element 2421378
Element 2422406
Element 2423233
Element 242466
Element 2425900
Element 2426210
Element 2427615
Element 2428506
Element 2429957
Element 2430918
Element 2431704
Element 2432559
Element 2433493
Element 2434535
Element 2435220
Element 2436459
Element 2437646
Element 2438396
Element 2439811
Element 2440723
Element 2441114
Element 2442500
Element 2443906
Element 2444300
Element 2445247
Element 2446623
Element 2447691
Element 2448650
Element 2449462
Element 2450623
Element 2451591
Element 245260
Element 245344
Element 2454979
Element 2455113
Element 2456261
Element 2457419
Element 2458464
Element 2459586
Element 246032
Element 2461114
Element 24621000
Element 2463279
Element 2464885
Element 2465805
Element 2466954
Element 2467797
Element 2468904
Element 2469509
Element 2470908
Element 2471554
Element 2472726
Element 247360
Element 2474776
Element 2475959
Element 247689
Element 2477873
Element 247873
Element 2479657
Element 2480963
Element 2481165
Element 2482440
Element 2483422
Element 2484813
Element 2485937
Element 2486981
Element 2487986
Element 2488466
Element 2489602
Element 2490411
Element 2491882
Element 2492591
Element 2493274
Element 249440
Element 2495361
Element 2496796
Element 2497648
Element 2498303
Element 2499949
Element 2500847
Element 2501890
Element 2502383
Element 2503206
Element 2504126
Element 2505859
Element 2506426
Element 2507956
Element 2508497
Element 2509883
Element 2510995
Element 2511561
Element 2512177
Element 2513942
Element 2514623
Element 2515398
Element 2516498
Element 2517205
Element 2518184
Element 2519971
Element 2520367
Element 2521125
Element 2522438
Element 2523685
Element 2524113
Element 2525978
Element 2526316
Element 2527796
Element 2528714
Element 2529455
Element 2530724
Element 2531461
Element 2532916
Element 2533785
Element 25349
Element 2535927
Element 253685
Element 2537457
Element 2538662
Element 2539849
Element 254026
Element 2541460
Element 2542707
Element 2543562
Element 2544247
Element 2545441
Element 2546870
Element 2547940
Element 2548310
Element 2549482
Element 255070
Element 2551356
Element 2552888
Element 2553258
Element 255446
Element 2555475
Element 2556420
Element 2557503
Element 2558335
Element 2559999
Element 2560721
Element 2561292
Element 2562833
Element 2563909
Element 2564432
Element 2565883
Element 2566485
Element 256751
Element 2568606
Element 2569924
Element 2570834
Element 257182
Element 2572853
Element 2573987
Element 257472
Element 2575166
Element 257668
Element 2577824
Element 2578359
Element 2579728
Element 2580373
Element 2581946
Element 2582546
Element 2583360
Element 2584873
Element 2585698
Element 2586712
Element 2587747
Element 2588256
Element 2589537
Element 2590979
Element 2591946
Element 2592328
Element 2593192
Element 2594151
Element 2595157
Element 2596749
Element 2597884
Element 2598183
Element 2599505
Element 2600154
Element 2601925
Element 2602786
Element 2603631
Element 2604812
Element 2605842
Element 2606211
Element 2607720
Element 2608844
Element 2609837
Element 261022
Element 261116
Element 2612497
Element 2613782
Element 2614201
Element 2615632
Element 2616674
Element 2617659
Element 2618653
Element 2619240
Element 2620791
Element 2621112
Element 2622831
Element 2623158
Element 2624934
Element 2625294
Element 2626322
Element 2627380
Element 2628654
Element 2629205
Element 2630423
Element 2631638
Element 2632410
Element 2633970
Element 2634592
Element 2635669
Element 2636613
Element 2637655
Element 2638121
Element 2639441
Element 2640790
Element 2641358
Element 2642106
Element 2643952
Element 2644962
Element 2645774
Element 2646767
Element 2647187
Element 2648436
Element 2649348
Element 2650453
Element 2651523
Element 2652360
Element 2653552
Element 2654155
Element 2655487
Element 2656149
Element 2657503
Element 2658577
Element 2659343
Element 2660294
Element 2661852
Element 2662142
Element 2663780
Element 266420
Element 2665833
Element 2666942
Element 2667997
Element 266880
Element 2669695
Element 2670989
Element 2671142
Element 2672503
Element 2673486
Element 2674624
Element 2675747
Element 2676623
Element 2677856
Element 2678809
Element 2679610
Element 2680634
Element 2681710
Element 2682836
Element 2683368
Element 2684950
Element 268560
Element 2686654
Element 268721
Element 2688114
Element 2689799
Element 269088
Element 2691283
Element 2692241
Element 2693203
Element 2694959
Element 2695343
Element 2696921
Element 2697563
Element 269847
Element 2699116
Element 2700786
Element 2701824
Element 2702929
Element 2703263
Element 2704410
Element 2705118
Element 2706644
Element 2707210
Element 2708730
Element 2709253
Element 271080
Element 2711856
Element 2712168
Element 2713294
Element 2714794
Element 2715125
Element 2716995
Element 2717800
Element 2718360
Element 2719196
Element 2720200
Element 2721644
Element 2722813
Element 2723380
Element 27243
Element 2725105
Element 2726590
Element 2727416
Element 2728104
Element 2729417
Element 2730489
Element 2731486
Element 2732638
Element 2733182
Element 2734782
Element 273573
Element 2736621
Element 2737113
Element 2738815
Element 2739453
Element 2740630
Element 2741765
Element 2742945
Element 2743694
Element 2744576
Element 2745442
Element 2746453
Element 2747856
Element 2748318
Element 2749413
Element 2750821
Element 2751132
Element 275220
Element 2753619
Element 2754866
Element 2755758
Element 2756118
Element 2757786
Element 2758161
Element 2759620
Element 2760880
Element 2761653
Element 276249
Element 2763208
Element 2764731
Element 2765902
Element 2766567
Element 2767972
Element 2768876
Element 2769566
Element 2770918
Element 2771329
Element 2772274
Element 2773624
Element 2774325
Element 2775650
Element 2776109
Element 2777988
Element 2778724
Element 2779659
Element 2780114
Element 2781800
Element 2782977
Element 278311
Element 2784669
Element 2785153
Element 2786138
Element 2787357
Element 2788342
Element 2789383
Element 2790556
Element 2791176
Element 2792734
Element 2793191
Element 2794512
Element 27951000
Element 2796724
Element 2797820
Element 2798889
Element 2799177
Element 2800625
Element 2801303
Element 2802383
Element 2803410
Element 2804569
Element 2805479
Element 2806803
Element 280739
Element 2808408
Element 2809173
Element 2810353
Element 2811715
Element 2812790
Element 2813553
Element 2814661
Element 2815908
Element 2816931
Element 2817765
Element 2818862
Element 2819843
Element 2820247
Element 2821750
Element 2822202
Element 2823913
Element 2824615
Element 2825855
Element 2826271
Element 2827907
Element 2828206
Element 2829322
Element 2830744
Element 2831108
Element 2832444
Element 2833228
Element 2834352
Element 2835626
Element 2836229
Element 2837142
Element 2838291
Element 2839529
Element 2840557
Element 2841799
Element 2842597
Element 2843368
Element 2844102
Element 2845978
Element 2846615
Element 2847530
Element 284812
Element 2849431
Element 2850681
Element 2851437
Element 2852566
Element 2853931
Element 2854555
Element 2855336
Element 2856760
Element 2857740
Element 2858374
Element 285963
Element 2860952
Element 28617
Element 2862982
Element 2863745
Element 2864105
Element 2865837
Element 2866440
Element 2867178
Element 2868189
Element 2869447
Element 2870254
Element 287160
Element 2872869
Element 2873171
Element 2874809
Element 2875955
Element 2876872
Element 2877956
Element 2878611
Element 28791
Element 2880426
Element 2881411
Element 2882707
Element 288331
Element 288458
Element 2885748
Element 2886559
Element 2887762
Element 2888824
Element 2889304
Element 2890970
Element 2891122
Element 2892644
Element 2893723
Element 2894868
Element 2895281
Element 2896960
Element 2897517
Element 2898119
Element 2899367
Element 2900800
Element 2901938
Element 2902934
Element 2903388
Element 2904793
Element 2905390
Element 2906512
Element 2907312
Element 2908245
Element 2909585
Element 2910715
Element 2911988
Element 2912152
Element 2913877
Element 2914350
Element 291580
Element 2916145
Element 2917723
Element 2918388
Element 2919699
Element 2920663
Element 2921152
Element 2922524
Element 2923404
Element 2924477
Element 2925328
Element 2926292
Element 2927549
Element 2928175
Element 2929642
Element 2930504
Element 2931561
Element 293267
Element 2933649
Element 293411
Element 2935855
Element 2936128
Element 2937359
Element 2938637
Element 2939491
Element 2940718
Element 2941850
Element 294296
Element 2943314
Element 2944974
Element 2945452
Element 2946198
Element 2947972
Element 2948991
Element 2949951
Element 2950811
Element 2951891
Element 2952230
Element 2953957
Element 2954345
Element 2955629
Element 2956574
Element 2957218
Element 2958457
Element 2959236
Element 2960964
Element 2961276
Element 2962665
Element 2963825
Element 2964562
Element 2965758
Element 2966377
Element 2967596
Element 2968178
Element 2969642
Element 2970167
Element 2971608
Element 2972448
Element 2973421
Element 2974577
Element 2975891
Element 2976180
Element 2977680
Element 2978738
Element 297917
Element 2980871
Element 298150
Element 2982489
Element 2983495
Element 2984999
Element 2985807
Element 2986205
Element 2987397
Element 2988879
Element 2989867
Element 2990758
Element 2991674
Element 2992368
Element 2993561
Element 2994409
Element 2995425
Element 2996831
Element 2997585
Element 2998708
Element 2999727
Cliquez plusieurs fois sur chaque bouton. Les temps dépendent de votre machine, mais l’écart est constant.

Images

<!-- NgOptimizedImage: lazy par défaut, srcset automatique, avertissements si les dimensions manquent -->
<img ngSrc="/assets/hero.jpg" width="1200" height="600" priority />   <!-- l’image du LCP -->
<img ngSrc="/assets/avatar.jpg" width="48" height="48" />            <!-- lazy -->
<img ngSrc="product.jpg" fill />                                       <!-- remplit le conteneur -->

Très grandes listes

import { ScrollingModule } from '@angular/cdk/scrolling';

@Component({
  imports: [ScrollingModule],
  template: `
    <cdk-virtual-scroll-viewport itemSize="48" class="viewport">
      <div *cdkVirtualFor="let row of rows(); trackBy: trackById" class="row">{{ row.name }}</div>
    </cdk-virtual-scroll-viewport>
  `,
  styles: `.viewport { height: 480px; }`,
})
export class BigList {
  readonly rows = input.required<Row[]>();
  protected trackById = (_: number, r: Row) => r.id;
}

Bundle

// angular.json → configurations.production.budgets
"budgets": [
  { "type": "initial", "maximumWarning": "500kB", "maximumError": "1MB" },
  { "type": "anyComponentStyle", "maximumWarning": "4kB", "maximumError": "8kB" }
]

SSR et Hydration

// app.config.server / app.config.ts avec SSR
provideClientHydration(
  withEventReplay(),          // les clics faits pendant l’hydration ne sont pas perdus
  // withIncrementalHydration() — par défaut depuis la v22
);

Pièges fréquents

  • Optimiser sans mesurer : ouvrez le Profiler dans Angular DevTools avant de modifier le moindre code.
  • Méthodes coûteuses dans le template (sortedItems() en tant que méthode) → elles s’exécutent à chaque rendu. Transformez-les en computed.
  • Grosses bibliothèques importées « pour une seule fonction » (tout lodash, moment.js) → imports ciblés ou injectAsync.
  • @defer sur le contenu principal → un LCP dégradé. Ne différez que ce qui est sous la ligne de flottaison.

Chap. 11 · 0 sur 4 terminées

Leçon terminée ?

Marquez-la : elle apparaîtra sur votre carte, dans le sommaire et sur la page d’accueil.

Se marque toute seule une fois la leçon lue en entier.

  1. Performance — une checklist
  2. Tests avec Vitest
  3. DevTools : regarder dans votre application
  4. Angular Aria
Voir toute votre carte

Les 75 pages · tapez pour filtrer

  • 01Nouveautés d’Angular 21 & 22Tous les changements importants de la v21 et de la v22, en bref, avec un lien vers la page qui explique chacun.Départ
  • 01Votre première application, pas à pasUne liste de lecture construite d’un composant vide jusqu’à une application terminée — signals, @for, inputs et outputs, un service et un formulaire, pas à pas.Départ
  • 01Décisions rapides« Où mettre ça ? », « Signal ou Observable ? », « Shared ou feature ? » — des réponses courtes aux questions de tous les jours.Départ
  • 01Questions d’entretien Angular60 vraies questions d’entretien pour profils junior, confirmé et senior, avec la réponse à donner, la relance et les signaux d’alerte. Plus un entretien blanc.Départ
  • 02Standalone et bootstrapComment une application démarre sans NgModule : bootstrapApplication, app.config.ts, imports dans le composant.Fondamentaux modernes
  • 02Data binding et événementsInterpolation, bindings de propriétés et d’attributs, événements avec $event et filtres de touches, et comment [( )] est construit — ce qui entre dans le DOM et ce qui en revient.Fondamentaux modernes
  • 02Control Flow : @if, @for, @switchLa syntaxe de blocs qui remplace *ngIf/*ngFor/ngSwitch, avec track, @empty et vérifications d’exhaustivité.Fondamentaux modernes
  • 02@let et les nouvelles expressions de templateVariables locales avec @let, fonctions fléchées, spread, regex, instanceof, commentaires dans les balises.Fondamentaux modernes
  • 02@defer — Lazy Loading dans les templatesChargez les composants lourds uniquement quand c’est nécessaire : triggers, prefetch, placeholder, loading, error.Fondamentaux modernes
  • 02Bindings de classe et de stylePourquoi [class.x] et [style.x] ont remplacé ngClass et ngStyle (avec migration automatique depuis la v21).Fondamentaux modernes
  • 02Styles des composants et encapsulation:host, les trois modes d’encapsulation, les thèmes avec des variables CSS, et pourquoi ::ng-deep est un dernier recours.Fondamentaux modernes
  • 02Pipes : quand et commentPipes pures vs impures, pipes personnalisées, et comment choisir entre une pipe, computed() et une méthode.Fondamentaux modernes
  • 03signal() et computed()Les primitives réactives : état modifiable, état dérivé, égalité, untracked et règles d’immutabilité.Signals et réactivité
  • 03effect() — quand OUI, quand NONEffets de bord synchronisés avec les Signals : localStorage, logs, API impératives. Et leurs pièges.Signals et réactivité
  • 03linkedSignal() — état dérivé modifiableUn signal qui se réinitialise quand sa source change, mais que vous pouvez aussi modifier à la main.Signals et réactivité
  • 03resource, rxResource, httpResourceDes données asynchrones sous forme de Signals : status, value, error, reload, annulation automatique. Stable depuis la v22.Signals et réactivité
  • 03debounced() — signals différésLa version « debounce » d’un signal, sans RxJS. Parfait pour la recherche.Signals et réactivité
  • 03Listes : rechercher, filtrer, trier, paginerUne chaîne de signals computed qui ne recalcule que ce qui a changé, avec les filtres dans l’URL pour qu’un lien rouvre la même vue.Signals et réactivité
  • 03Les Observables depuis zéroCe qu’est un Observable, subscribe et unsubscribe, les opérateurs que vous utilisez chaque semaine, froid ou chaud — et quand un signal suffit.Signals et réactivité
  • 03Signals ↔ RxJStoSignal, toObservable, takeUntilDestroyed, outputFromObservable — et quand RxJS reste le bon choix.Signals et réactivité
  • 04input() et output()Les inputs comme Signals (required, transform, alias) et les outputs typés. Les données descendent, les événements remontent.Composants : communication
  • 04model() — binding bidirectionnelLe « banana-in-a-box » [( )] avec une seule API. Quand l’utiliser, et quand input + output est préférable.Composants : communication
  • 04viewChild et contentChildLes queries comme Signals : viewChild, viewChildren, contentChild, contentChildren, l’option read.Composants : communication
  • 04Lifecycle et DestroyRefQuels hooks comptent encore à l’ère des Signals, afterNextRender, DestroyRef et ngOnChanges typé.Composants : communication
  • 04Projection de contenung-content avec select, plusieurs slots, contenu par défaut et le piège de la projection conditionnelle.Composants : communication
  • 04ng-template et ngTemplateOutletLes templates comme valeurs : les render props en Angular, contexte typé et personnalisation des composants.Composants : communication
  • 05Smart vs DumbContainer vs présentation : qui détient l’état, qui se contente d’afficher, et comment bien les séparer.Conception des composants
  • 05Composants génériques <T>Un DataTable<T> ou un Select<T> correctement typé, avec des templates pour les cellules.Conception des composants
  • 05Composants dynamiquesNgComponentOutlet, createComponent avec inputBinding/outputBinding, et un tableau de bord construit à partir d’une configuration.Conception des composants
  • 05Directives et composition d’hôteLes directives d’attribut, les métadonnées host: {} et la Directive Composition API (hostDirectives).Conception des composants
  • 05Contrôles de formulaire personnalisésFormValueControl (Signal Forms) vs ControlValueAccessor : une notation par étoiles, dans les deux variantes.Conception des composants
  • 05Change DetectionOnPush est la valeur par défaut depuis la v22, Zone.js a disparu depuis la v21. Ce qui déclenche le rendu et comment éviter les mauvaises surprises.Conception des composants
  • 06inject() et @Service()Le nouveau décorateur @Service() de la v22, inject() vs le constructeur, et le contexte d’injection.Dependency Injection
  • 06Providers et hiérarchie des injecteursRoot vs route vs composant, useClass/useValue/useFactory/useExisting, et les modificateurs optional/self/skipSelf.Dependency Injection
  • 06InjectionToken et provideX()Configuration typée, fonctions provideFeature(), makeEnvironmentProviders et initializers.Dependency Injection
  • 06injectAsync() — services en Lazy LoadingChargez un service lourd uniquement quand vous en avez besoin, avec prefetch à l’idle.Dependency Injection
  • 07Structure des dossierscore / shared / features, ce que contient chacun, et à quoi ressemble l’intérieur d’une feature.Architecture d’application
  • 07Shared vs featureQuand déplacer un composant dans shared et (surtout) quand NE PAS le faire. Une checklist concrète.Architecture d’application
  • 07Interfaces et modèlesInterface en ligne ou fichier séparé ? DTO vs modèle de domaine, type vs interface, où les ranger.Architecture d’application
  • 07State Management avec les SignalsStores simples à base de Signals, facades, état local vs global, et quand NgRx devient nécessaire.Architecture d’application
  • 07Guide de style et nommageLes conventions officielles actuelles : noms de fichiers sans suffixes, protected, readonly, ordre des membres.Architecture d’application
  • 07Barrels, alias et frontièresindex.ts, alias de chemins, API publique d’une feature et règles de dépendances vérifiables automatiquement.Architecture d’application
  • 07Erreurs : @boundary et ErrorHandlerLe nouveau bloc @boundary de la v22.2, l’ErrorHandler global, les erreurs HTTP et les erreurs de resource.Architecture d’application
  • 08Routing moderne et Lazy LoadingloadComponent, routes enfants, paramètres comme inputs et héritage des paramètres (le nouveau comportement par défaut de la v22).Routing
  • 08Guards et resolverscanActivate, canMatch, canDeactivate et resolve sous forme de fonctions, avec redirections via UrlTree / RedirectCommand.Routing
  • 09Signal Forms — les basesDes formulaires bâtis sur les Signals : form(), [formField], validation par schéma. Stable depuis la v22.Formulaires
  • 09Signal Forms — avancéValidation personnalisée et inter-champs, async/HTTP avec debounce, listes dynamiques, désactivé/masqué, schémas réutilisables.Formulaires
  • 09Reactive Forms typésFormGroup typé, nonNullable, FormArray — et leur cohabitation avec les Signal Forms.Formulaires
  • 10HttpClient, interceptors et couche d’APIHttpClient sans configuration (v21), Fetch par défaut (v22), interceptors fonctionnels et une couche d’API avec mapping des DTO.HTTP et données
  • 11Performance — une checklistCe qui compte vraiment : OnPush + Signals, track, @defer, routes en Lazy Loading, images, bundles et Hydration.Qualité et performance
  • 11Tests avec VitestVitest est le runner par défaut depuis la v21. TestBed, composants avec Signals, services, HTTP et harnesses.Qualité et performance
  • 11DevTools : regarder dans votre applicationChrome DevTools et Angular DevTools pas à pas : ce que montre chaque panneau, avec des exercices qui fonctionnent sur ce site.Qualité et performance
  • 11Angular AriaDes composants headless et accessibles que vous stylez comme vous voulez : tabs, accordion, menu, listbox...Qualité et performance
  • 12SSR, Prerendering et modes de renduQuand rendre sur le serveur, quand au build et quand uniquement dans le navigateur : RenderMode par route, app.routes.server.ts et les coûts réels.SSR et Hydration
  • 12Hydration : event replay et incrémentaleComment le navigateur reprend le HTML du serveur sans le re-rendre : Hydration complète, event replay, @defer (hydrate on …) et erreurs de mismatch.SSR et Hydration
  • 12Code compatible serveurwindow n’existe pas sur le serveur : PLATFORM_ID, afterNextRender, DOCUMENT, TransferState, le cache HTTP et PendingTasks.SSR et Hydration
  • 13Micro frontendsQuand découper une application en plusieurs déploiements vaut le coup, et quand c’est juste de la complexité : Native Federation, Module Federation, iframes, Web Components.Architecture à grande échelle
  • 13Web Components avec Angular ElementscreateCustomElement : un composant Angular utilisé comme balise HTML n’importe où, plus la communication entre applications via des événements et BroadcastChannel.Architecture à grande échelle
  • 13Monorepo, bibliothèques et frontièresUn workspace avec plusieurs applications et bibliothèques : ng generate library, Nx, points d’entrée secondaires, publication et règles de dépendances.Architecture à grande échelle
  • 13Architecture hexagonale (ports et adapters)Un domaine sans Angular, des ports sous forme de classes abstraites et des adapters interchangeables : HTTP, localStorage ou en mémoire, sans toucher à l’UI.Architecture à grande échelle
  • 14Les Signals sous le capotLe graphe réactif : producteurs et consommateurs, push-pull, pourquoi computed est lazy et sans glitch, le problème du diamant et quand les effects s’exécutent.Réactivité avancée
  • 14RxJS avancé : opérateurs d’ordre supérieurswitchMap, mergeMap, concatMap et exhaustMap sur un diagramme interactif, plus retry avec backoff, shareReplay et comment éviter les fuites.Réactivité avancée
  • 14NgRx SignalStoreState Management à grande échelle sur les Signals : withState, withComputed, withMethods, rxMethod, entités et hooks — et quand un store simple suffit.Réactivité avancée
  • 14Machines à états avec les signalsFini les états impossibles : une machine typée sur des signals, avec transitions, gardes et un diagramme d’états en direct.Réactivité avancée
  • 15WebSockets : un temps réel qui résiste au réseauUn socket typé sous forme de signals : reconnexion avec backoff et jitter, heartbeat, file d’attente hors ligne et sécurité SSR.Temps réel et hors ligne
  • 15Mises à jour optimistes et rollbackUne UI instantanée qui reste honnête : snapshot et rollback, réponses dans le désordre, clés d’idempotence.Temps réel et hors ligne
  • 15Offline-first : Service Worker et cacheLe Service Worker d’Angular : stratégies de cache, annonce des nouvelles versions et file d’attente pour les modifications faites hors ligne.Temps réel et hors ligne
  • 16Web WorkersDes calculs lourds sans bloquer l’UI : un vrai worker dans la page, l’échange de messages et quand ça n’en vaut pas la peine.UI avancée et performance
  • 16Listes géantes : virtual scroll100 000 lignes sans latence : le virtual scroll du CDK, itemSize, trackBy et les alternatives (pagination, scroll infini).UI avancée et performance
  • 16Animations modernes et View Transitionsanimate.enter et animate.leave à la place de @angular/animations (déprécié), transitions CSS et View Transitions à la navigation.UI avancée et performance
  • 16Fuites mémoire : les trouver et les corrigerAbonnements, timers et listeners qui survivent à leur composant — comment les repérer dans les DevTools et les fermer.UI avancée et performance
  • 17Sécurité : XSS, sanitisation et CSPCe qu’Angular fait automatiquement contre le XSS, quand bypassSecurityTrust devient dangereux, plus la CSP avec nonce, Trusted Types et XSRF.Sécurité et internationalisation
  • 17Authentification : tokens et refreshUn interceptor qui ajoute le token, le renouvelle une seule fois sur une 401 et rejoue les requêtes en attente — plus où conserver le token.Sécurité et internationalisation
  • 17OAuth 2.1 et OpenID Connect avec PKCELe flux authorization code avec PKCE, pas à pas : verifier et challenge, state et nonce, l’ID token, et pourquoi un BFF est plus sûr.Sécurité et internationalisation
  • 17Internationalisation (i18n)$localize, l’attribut i18n, ICU plural/select, un build par langue vs des traductions à l’exécution, et le formatage selon la locale.Sécurité et internationalisation