What's new in Angular 19.1?

Angular 19.1.0 is here!

Angular logo

This is a minor release with some nice features: let’s dive in!

TypeScript 5.7 support

Angular v19.1 now supports TypeScript 5.7. This means that you can use the latest version of TypeScript in your Angular applications. You can check out the TypeScript 5.7 release notes to learn more about the new features.

Automatic removal of unused standalone imports

Since Angular v19.0, there is an extended diagnostic that warns you if you import a standalone component, or pipe, or directive, but don’t actually use it (making this import unnecessary). Angular v19.1 goes further: it provides a schematic that removes all those unnecessary imports for you. You simply need to execute ng generate @angular/core:cleanup-unused-imports to clean all your imports.

NgComponentOutlet

You know it’s not a big release when one of the most interesting feature is a new property on a not-very-often-used directive. But here it is: the ngComponentOutlet directive now has a componentInstance property, allowing to access the instance of the component created by the directive. The directive is now also exposed as ngComponentOutlet, allowing to reference it in templates:

<ng-container
  [ngComponentOutlet]="component"
  #myDynamicComponent="ngComponentOutlet"
/>

Devtools

The devtools now have a router graph to view the routes that are loaded in the application.

Some internal work has also been done to add a “tracing” service, that the framework calls to trace what triggers change detection. This could be leveraged by the devtools to provide more information about change detection in the future.

Another addition in v19.1 is the ability to inspect the signal graph of the application. Currently, it is a private debug function called ɵgetSignalGraph that you can use via window.ng.ɵgetSignalGraph() in the console if you enable the debug tools. We can safely bet that this will be exposed in the devtools in the future with a nice graph showing the signals and their dependencies.

Angular CLI

Templates HMR

As we hinted in our v19 blog post, the CLI now has HMR for templates enabled by default!

v19 enabled HMR for styles, and now it’s also enabled for templates in v19.1, both for inline and external templates. As for the styles, this required some internal changes in the compiler. As it is still a fairly new feature, you may have to manually refresh the page sometimes or restart your server. The HMR feature itself can bail out and do a full rebuild, for example, if too many files were modified (currently 32). It can be disabled with --hmr=false or --live-reload=false in the serve command, or by using NG_HMR_TEMPLATES=0.

i18n subPath

It is now easier to specify a customized URL segment for internationalized applications, like /fr for French or /es for Spanish. It was already possible to use baseHref in the i18n configuration, but it was still necessary to manually put the generated files in the proper sub-directory yourself. The baseHref option is now deprecated in favor of subPath, which acts as a base href and the name of the folder where the localized version is built:

"locales": {
  "fr": {
    "subPath": "fr", // can be omitted if it's the same as the locale
    "translation": "src/i18n/messages.fr.json"
  },
  "es": {
    "subPath": "es",
    "translation": "src/i18n/messages.es.json"
  }

The generated files will be in dist/my-app/browser/fr and dist/my-app/browser/es.

SSR redirection to preferred locale

If your application supports several languages, the server will now redirect your users to their preferred locales, based on their browser settings. This leverages the Accept-Language header to determine the preferred locales (ranked by their quality value, for example, en-US;q=0.8,fr-FR;q=0.9) and redirect the user to the corresponding URL segment based on the supported locales. It tries to find the exact locales first, then the locales without the region, then falls back to first supported locale if none of the previous ones are supported. This works out of the box without needing to configure anything.

SSR preload lazy-loaded routes

The CLI now preloads lazy-loaded routes during server-side rendering, by adding modulepreload links in the generated HTML. This is limited to 10 modules and does not work when the chunk optimization option is enabled (see our blog post about Angular v18.1).

ng-packagr builder

The ng-packagr package is now available as a builder in the CLI (@angular/build:ng-packagr) and can now be used to build libraries. It is used by default when you create a library with ng generate library and removes the need to have the @angular-devkit/build-angular package installed as you can see in our angular-cli-library-diff Github repo that tracks changes in a generated library.

Speaking about repositories helping to track differences between CLI versions, we created a new one for the CLI when generating an application with the --ssr option: angular-cli-ssr-diff 🚀 (in addition to the one for libraries and the most popular one for basic CLI applications).

Warning about bad localize import

The CLI will now warn you if you import @angular/localize/init directly in your code:

Direct import of '@angular/localize/init' detected. This may lead to undefined behavior.

The proper way to add localize is to add it to your polyfills in angular.json (as ng add @angular/localize does).

Summary

That’s all for this release, stay tuned!

All our materials (ebook, online training and training) are up-to-date with these changes if you want to learn more!



blog comments powered by Disqus