While previous major versions have introduced a lot of changes to the framework itself, this version prides itself more on performance and improved developer experiences. In the rest of this post, I would be showing you the most interesting changes this release brings.
The latest and shiniest tools
Angular stands on the shoulder of other awesome projects and its 7th version have been updated to be compatible with the latest versions of those projects. The most interesting ones on this list have:
- Node 10.
- Typescript 3.1
- RxJS 6.3
This is probably one of the first places where developers would notice the available changes. The
ng tool has received a major upgrade in the sense that it now helps developers to speed up the process of starting a new project. For example, while starting a new project, you will be prompted for your preferred way of writing CSS (SCSS, SASS, LESS ) and if you would like to add routing to your app.
It even gets much more interesting when you try to add some other packages like
ng add @angular/material. The
ng tool would prompt the user to answer some questions to help it scaffold some changes. As at the time of writing this article, it would ask the following:
- Enter a prebuilt theme name, or “custom” for a custom theme:
- Set up HammerJS for gesture recognition? (Y/n)
- Set up browser animations for Angular Material? (Y/n)
This is possible via a tool called Schematics. Schematics is basically a way to apply changes to a project. This change might include the creation of a new component. So what about Schematics? The
ng cli now supports Schematics out of the box. This would allow any package that publishes Schematics to include prompts such as the above. Just add an
x-prompt key to a Schematics collection and all is good.
You can read more on Schematics here.
Budgets are one of the lesser known features of the framework. A budget is basically telling Angular “I know I am building this cool nifty app, but I don’t ever want to ship an X MB file to production”.
Budgets are not a new feature but they are getting more pronounced in this version as they are automatically set up in projects started by
ng new projectName.
Here is an example budget
With the above setup, a warning would be generated when the initial build size is greater than 1MB and an error when greater than 3MB. This is not the end of it all, you can configure the size of a specific bundle, the entire app e.t.c. Take a look at the available options here.
A common mistake made by developers is the inclusion of the reflect-metadata polyfill in the production build. And in all honesty, that is wrong since reflect-metadata is basically runtime reflection on types – obviously better for development, not production, it increases the size of the generated bundle and reduces performance. While it can be documented to make sure to remove reflect-metadata from the build, developers can still make such a mistake and since Angular 7 is extremely focused on speed and performance, it has gone ahead to automatically include them only when needed. The interesting part is how does Angular decide when to include or exclude it? It does that based on the build context. If making a JIT compilation – ng build or ng serve-, it includes them since this context is for development. But if making an AOT compilation – ng build –prod-, it doesn’t as this is a production bundle.
You can learn more about the available compilation types provided by Angular in its documentation.
DoModule lifecycle interface
Lifecycle hooks are a major part of Angular’s module and components. And this update makes that extremely clear for modules. Angular 7 adds a
DoBootstrap interface so as to compliment the already existing
ngDoBootstrap method that allows for manual bootstrapping. While this might pass as a trivial thing, it makes the
ngBootstrap compatible with other lifecycle events that do have backing interfaces. You can look through the motivation for this on the issue that requested this functionality.
The material design specification received major updates this year and it is just the right thing to adopt the changes for newer projects – except you have specific reasons not to. That is what Angular offers in this new release.
Angular material, the official material design implementation has been updated accordingly to match the specification.
It is a common scenario. You need to build a list that can potentially grow to thousands of items but needs to be displayed, take Tweets or Facebook’s posts as an example. There are multiple approaches to this: pagination, appending items to the list as soon as the user reaches the bottom of the page and virtual scrolling.
The major idea behind virtual scrolling is rendering only visible items that fit the current viewport and replacing them on the fly with newer ones thus building fast users’ experiences. The component dev kit now contains an implementation of virtual scrolling.
<cdk-virtual-scroll-viewport class="list-container list-group" autosize>
<div *cdkVirtualFor="let size of dataFromComponent; let i = index">
Drag and drop
This is another feature provided by the Angular CDK. This module allows the creation of a drag-drop UI which can be used for dragging, sorting and transferring items. It gives the user an API to interact with the item being dragged such as touch and mouse event detectors.
You can read more about drag and drop here.
Ivy template renderer
While this is not yet officially released as backward compatibility with existing applications is being investigated, it is worth discussing as this would be the third time Angular would change its renderer. In version 4, it switched to a new renderer (View Engine) from the original one.
View engine is awesome, why rewrite it?
There should no compatibility issues once this is finally released.
Updating to Version 7?
Updating for most users on version 6 should be
ng update @angular/cli @angular/core. But as always, it is best to check if dependencies of your application also include changes that need to be made.
More information and an upgrade guide can be found at the Angular update guide website.