From fe4808c3b6871268a9084e4e665b7a64096bd98f Mon Sep 17 00:00:00 2001 From: thomas Date: Wed, 27 Sep 2023 22:09:01 +0200 Subject: [PATCH] feat(challenge35): memoization performance --- CONTRIBUTING.md | 23 +----- apps/performance/memoized/README.md | 33 ++------- .../34/profiler-record.png | Bin .../35/memoize-profiler.png | Bin 0 -> 89089 bytes .../profiler-tab.png | Bin .../angular-performance/12-scroll-cd.md | 24 +++--- .../angular-performance/34-default-onpush.md | 30 ++++---- .../angular-performance/35-memoize.md | 70 ++++++++++++++++++ .../challenges/angular-performance/index.mdx | 48 ++++++++++++ .../32-bug-cd.md | 4 +- docs/src/styles/custom-css.css | 4 + example.README.md | 45 ----------- package.json | 3 +- 13 files changed, 166 insertions(+), 118 deletions(-) rename docs/src/assets/{ => angular-performance}/34/profiler-record.png (100%) create mode 100644 docs/src/assets/angular-performance/35/memoize-profiler.png rename docs/src/assets/{34 => angular-performance}/profiler-tab.png (100%) create mode 100644 docs/src/content/docs/challenges/angular-performance/35-memoize.md create mode 100644 docs/src/content/docs/challenges/angular-performance/index.mdx rename docs/src/content/docs/challenges/{angular-performance => angular}/32-bug-cd.md (96%) delete mode 100644 example.README.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e8fe2e7..44469ae 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,24 +1,3 @@ # Contributing -> Thank you for considering contributing to this project. Your help is very much appreciated! - -When contributing, it's better to first explain the challenge/exercice you are thinking about in the issue tab. - -## Getting started - -Please follow those step in order to succesfully make your contribution to this repository. - -1. Fork the project -2. Install **Nx Console**, this will help you work with this repository -3. Run `npm ci` to install all dependencies -4. Generate a new app with Nx Console > Right Click on apps folder > `Nx Generate Application` -5. Copy/Paste **example.README.md** and fill it up. -6. Link the main **README** with your new challenge -7. Few days later, create a PR with your answer. -8. Optional: write a blog post explaining your Challenge and the solution you came up with. - -## Pull Request Process - -1. We follow [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0-beta.4/) - in our commit messages, i.e. `feat(core): improve typing` -2. When you are ready, create Pull Request of your fork into original repository with the title starting with **NEW CHALLENGE** +Learn how to contribute [here](https://angular-challenges.vercel.app/guides/contribute/) diff --git a/apps/performance/memoized/README.md b/apps/performance/memoized/README.md index c3ae1bc..4e250b9 100644 --- a/apps/performance/memoized/README.md +++ b/apps/performance/memoized/README.md @@ -1,32 +1,13 @@ -

memoized function

+# Memoization > Author: Thomas Laforge - +### Run Application -## Information +```bash +npx nx serve performance-memoized +``` -## Statement +### Documentation and Instruction -### Step 1 - -### Step 2 - -### Constraints: - -### Submitting your work - -1. Fork the project -2. clone it -3. npm ci -4. `npx nx serve memoized` -5. _...work on it_ -6. Commit your work -7. Submit a PR with a title beginning with **Answer:35** that I will review and other dev can review. - -memoized -memoized solution author - - - -_You can ask any question on_ twitter +Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/angular-performance/35-memoize/). diff --git a/docs/src/assets/34/profiler-record.png b/docs/src/assets/angular-performance/34/profiler-record.png similarity index 100% rename from docs/src/assets/34/profiler-record.png rename to docs/src/assets/angular-performance/34/profiler-record.png diff --git a/docs/src/assets/angular-performance/35/memoize-profiler.png b/docs/src/assets/angular-performance/35/memoize-profiler.png new file mode 100644 index 0000000000000000000000000000000000000000..0520fde4514337598a22638a5bb8120b6eabc8b5 GIT binary patch literal 89089 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/src/assets/34/profiler-tab.png b/docs/src/assets/angular-performance/profiler-tab.png similarity index 100% rename from docs/src/assets/34/profiler-tab.png rename to docs/src/assets/angular-performance/profiler-tab.png diff --git a/docs/src/content/docs/challenges/angular-performance/12-scroll-cd.md b/docs/src/content/docs/challenges/angular-performance/12-scroll-cd.md index d6b80c1..60d33c3 100644 --- a/docs/src/content/docs/challenges/angular-performance/12-scroll-cd.md +++ b/docs/src/content/docs/challenges/angular-performance/12-scroll-cd.md @@ -5,32 +5,36 @@ sidebar: order: 12 --- -:::note -WIP: The following documentation will be reviewed and improved. However, you can still take on the challenge. If you don't understand a certain part, please feel free to reach out or create an issue. -::: -

Challenge #12
## Information -In this challenge, you will need to optimize the change detection cycles run by Angular. +In Angular, there is a library called Zone.js that performs a lot of magic to simplify a developer's life. Zone.js monkey patches all DOM events so that it will recheck and rerender the view when something has changed inside the application. The developer doesn't have to manually trigger change detection. -Zone.js triggers a change detection cycle each time a scroll event is dispatched. However we only want to show or hide a button at a specific scroll position. Therefore, we only want to refresh our application once. +However, sometimes Zone.js triggers a lot more change detection than needed. For example, when you are listening to a scroll event, each scroll event will dispatch a new change detection cycle. -> You can vizualise how many times CD is triggered by installing the [Angular chrome devTool](https://chrome.google.com/webstore/detail/angular-devtools/ienfalfjdbdpebioblfackkekamfmbnh) and starting a new recording on the profiler tab. +In this challenge, we only need to refresh the view at a specific scroll position to display or hide a button. All other cycles are unnecessary. -The following video will explain what is the goal of this challenge. +To have a better visualization of the problem, profile your application with Angular Dev Tools. + +:::note +If you don't know how to use it, read [the performance introduction page](/challenges/angular-performance/) first and come back after. +::: + +You can learn more details about zone pollution and how to resolve it [here](https://angular.io/guide/change-detection-zone-pollution). + +The following video will explain more in-depth the issue of this application. ## Statement -Your goal for this challenge is to avoid all unnecessary change detection cycles and trigger a CD only when needed. +Your goal for this challenge is to avoid all unnecessary change detection cycles and trigger a change detection only when needed. ## Constraint: -You cannot opt-out of zone.js. If this code is part of a large project and you opt out of zone.js, you will break many things within your application. +You cannot opt-out of Zone.js globally. If this code is part of a large project and you opt out of Zone.js, you will break your application without any doubt. --- diff --git a/docs/src/content/docs/challenges/angular-performance/34-default-onpush.md b/docs/src/content/docs/challenges/angular-performance/34-default-onpush.md index 0ab9922..03bc446 100644 --- a/docs/src/content/docs/challenges/angular-performance/34-default-onpush.md +++ b/docs/src/content/docs/challenges/angular-performance/34-default-onpush.md @@ -5,33 +5,37 @@ sidebar: order: 34 --- -:::note -WIP: The following documentation will be reviewed and improved. However, you can still take on the challenge. If you don't understand a certain part, please feel free to reach out or create an issue. -::: -
Challenge #34
## Information -In this series of challenges, you will learn how to optimize and enhance the performance of your Angular Application. +In this challenge, we will explore the differences and impacts of using `ChangeDetectionStrategy.Default` versus `ChangeDetectionStrategy.OnPush`. -The first step is to download the [Angular DevTools Chrome extention](https://chrome.google.com/webstore/detail/angular-devtools/ienfalfjdbdpebioblfackkekamfmbnh) if you haven't already done so. This extension allows you to profile your application and detect performance issues. +You can read the [Angular documentation](https://angular.io/guide/change-detection-skipping-subtrees) to learn more about the differences between these strategies. -In this challenge, we will explore the differences and impacts of using `ChangeDetectionStrategy.Default` versus `ChangeDetectionStrategy.OnPush`. To provide a clearer demonstration, I have added color enlightment to each component and each row in our application. However, in real-world scenarios, you will not have such visualization. This is where the Angular DevTool profiler comes to the rescue. +In this challenge, all components start with the `Default` strategy. When you type letters inside the input field, you will notice that all components are highlighted in orange. -Start by serving this application by running: `npx nx serve performance-default-onpush` inside your terminal. Then open Chrome DevTool by pressing **F12** and switch to the Angular Tab. From there you can select the Profiler tab as shown below. +:::note +I added color highlighting to each component and each row to provide a better visualization of when a component is rerendered. +::: -![profiler tab](../../../../assets/34/profiler-tab.png 'Profiler tab') +As you can see, each letter triggers a new change detection cycle, and all components are rerendered, causing performance issues. -Start profiling your application and type some letters inside the input field. You will notice that each element of your application will flash at each change detection cycle and the profiler will show you a bar for each change detection cycle. +Let's use the Angular DevTool to profile our application and understand how this tool can help us understand what is happening inside our application. -If you click on one of the bars (indicated by the yellow arrow on the picture below), you can see that `PersonListComponent`, `RandomComponent` and all the `MatListItem` are impacted by the change detection cycle, even when we only interact with the input field. +:::note +If you don't know how to use it, read [the performance introduction page](/challenges/angular-performance/) first and come back after. +::: -![profiler record](../../../../assets/34/profiler-record.png 'Profiler Record') +Now, start profiling your application and type some letters inside the input field to trigger some change detection cycles. + +If you click on one of the bars (indicated by the yellow arrow in the picture below), you can see that `PersonListComponent`, `RandomComponent`, and all the `MatListItem` are impacted by the change detection cycle, even when we only interact with the input field. + +![profiler record](../../../../assets/angular-performance/34/profiler-record.png 'Profiler Record') ## Statement -The goal of this challenge is to improve the clustering of change detection within the application. +The goal of this challenge is to improve the clustering of change detection within the application using the `OnPush` change detection strategy, but not only... ## Hints: diff --git a/docs/src/content/docs/challenges/angular-performance/35-memoize.md b/docs/src/content/docs/challenges/angular-performance/35-memoize.md new file mode 100644 index 0000000..3139be0 --- /dev/null +++ b/docs/src/content/docs/challenges/angular-performance/35-memoize.md @@ -0,0 +1,70 @@ +--- +title: 🟢 Memoization +description: Challenge 35 is about learning +sidebar: + order: 35 +--- + +
Challenge #35
+ +## Information + +In Angular, pure Pipes are very powerful because the value is memoized, which means if the input value doesn't change, the `transform` function of the pipe is not recomputed, and the cached value is outputted. + +You can learn more about pipes in the [Angular documentation](https://angular.io/guide/pipes) and inside this [deep dive article](https://medium.com/ngconf/deep-dive-into-angular-pipes-c040588cd15d). + +In this challenge, we start with a button to load a list of people. Each person is associated with a number, and we will use the Fibonacci calculation to create a heavy computation that will slow down the application. + +Once the list is loaded, try typing some letters inside the input field. You will notice that the application is very slow, even though you are only performing very basic typing. + +:::note +We will not focus on the initial loading of the list in this challenge. +::: + +Let's use the Angular DevTool to profile our application and understand how this tool can help us understand what is happening inside our application. + +:::note +If you don't know how to use it, read [the performance introduction page](/challenges/angular-performance/) first and come back after. +::: + +Now, start profiling your application and type some letters inside the input field. You will see some red bars showing up inside the profiler panel. + +If you click on one of the bars (indicated by the yellow arrow in the picture below), you will see that the change detection cycle is taking more than 3s in `PersonListComponent`. + +![profiler record](../../../../assets/angular-performance/35/memoize-profiler.png 'Profiler Record') + +## Statement + +The goal of this challenge is to understand what is causing this latency and to improve it. + +## Hints: + +
+ Hint 1 + +Use `Pipes` to memoize the Fibonnaci computation. + +
+ +--- + +:::note +Start the project by running: `npx nx serve performance-memoized`. +::: + +:::tip[Reminder] +Your PR title must start with Answer:35. +::: + + diff --git a/docs/src/content/docs/challenges/angular-performance/index.mdx b/docs/src/content/docs/challenges/angular-performance/index.mdx new file mode 100644 index 0000000..58943ac --- /dev/null +++ b/docs/src/content/docs/challenges/angular-performance/index.mdx @@ -0,0 +1,48 @@ +--- +title: Angular Performance +prev: false +next: false +description: Challenge 34 is about learning the difference between Default and OnPush Change Detection Strategy. +sidebar: + order: 1 +--- + +import { LinkCard } from '@astrojs/starlight/components'; + +In this series of challenges about performance, you will learn how to optimize and enhance the performance of your Angular application. + +Before starting to resolve any challenge, I invite you to download the [Angular DevTools Chrome extention](https://chrome.google.com/webstore/detail/angular-devtools/ienfalfjdbdpebioblfackkekamfmbnh) if you haven't already done so. + +This extension allows you to profile your application and detect performance issues, which is very useful for understanding where performance issues can occur. + +## How to use it + +When you serve an Angular application, you can inspect a page by pressing F12, which will open the Chrome developer tools. Then navigate to the Angular tab. From there, you can select the Profiler tab as shown below. + +![profiler tab](../../../../assets/angular-performance/profiler-tab.png 'Profiler tab') + +You can now profile your application by clicking on the record button. You can play with your application and see when change detection is triggered and which components are rerendered. + +:::tip[Learn more] +You can learn more on the [documentation page](https://angular.io/guide/devtools). +::: + +Now that you know how to use the Angular DevTool, you can choose a challenge, profile it, and resolve it. + + + + + + diff --git a/docs/src/content/docs/challenges/angular-performance/32-bug-cd.md b/docs/src/content/docs/challenges/angular/32-bug-cd.md similarity index 96% rename from docs/src/content/docs/challenges/angular-performance/32-bug-cd.md rename to docs/src/content/docs/challenges/angular/32-bug-cd.md index 1632213..4da8d3e 100644 --- a/docs/src/content/docs/challenges/angular-performance/32-bug-cd.md +++ b/docs/src/content/docs/challenges/angular/32-bug-cd.md @@ -11,11 +11,13 @@ WIP: The following documentation will be reviewed and improved. However, you can
Challenge #32
+:::note This challenge is inspired by a real-life example that I simplified to create this nice challenge. +::: ## Information -In this small application, we have a navigation menu to route our application to either `barComponent` or `FooComponent`. However our application is not loading and no errors are displayed inside the console. +In this small application, we have a navigation menu to route our application to either `BarComponent` or `FooComponent`. However our application is not loading and no errors are displayed inside the console. ## Statement diff --git a/docs/src/styles/custom-css.css b/docs/src/styles/custom-css.css index ecf2950..2f365eb 100644 --- a/docs/src/styles/custom-css.css +++ b/docs/src/styles/custom-css.css @@ -94,6 +94,10 @@ b { color: var(--sl-color-accent-high); } +.starlight-aside--tip b { + color: var(--sl-color-asides-text-accent); +} + .main-page-footer { margin-top: 2rem !important; font-size: var(--sl-text-sm); diff --git a/example.README.md b/example.README.md deleted file mode 100644 index 070c246..0000000 --- a/example.README.md +++ /dev/null @@ -1,45 +0,0 @@ - -

{Title of your exercice}

- - - -> Author: {Your name} - - - -## Information - -## Statement - -### Step 1 - -### Step 2 - -### Constraints: - -### Submitting your work - - - -1. Fork the project -2. clone it -3. npm ci - -4. `npx nx serve {project app name}` -5. _...work on it_ -6. Commit your work - -7. Submit a PR with a title beginning with **Answer:{challenge number}** that I will review and other dev can review. - - - -{Project name} - - - - - - diff --git a/package.json b/package.json index 19fcd1d..2087947 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,8 @@ "start": "nx serve", "build": "nx build", "test": "nx test", - "prepare": "husky install" + "prepare": "husky install", + "doc:dev": "cd docs && npm run dev" }, "private": true, "dependencies": {