{"id":6316,"date":"2023-01-05T07:42:48","date_gmt":"2023-01-05T07:42:48","guid":{"rendered":"https:\/\/www.ntspl.co.in\/blog\/?p=6316"},"modified":"2023-01-31T07:55:06","modified_gmt":"2023-01-31T07:55:06","slug":"angular-15-new-features-and-updates","status":"publish","type":"post","link":"https:\/\/www.ntspl.co.in\/blog\/angular-15-new-features-and-updates\/","title":{"rendered":"Angular 15 New Features and Updates"},"content":{"rendered":"<p>Over the past year we removed Angular\u2019s legacy compiler and rendering pipeline which enabled the development of a series of developer experience improvements in the past couple of months. <strong>Angular v15 is the culmination of this with dozens of refinements which lead to better developer experience and performance.<\/strong><img decoding=\"async\" src=\"https:\/\/cdn-images-1.medium.com\/max\/1024\/0*ziNf6Ao8VbShrzHM\" alt=\"Surise over San Francisco\" \/><\/p>\n<figure><figcaption>Sunrise photo by <a href=\"https:\/\/twitter.com\/mgechev\">Minko\u00a0Gechev<\/a><\/figcaption><\/figure>\n<h3>Standalone APIs are now out of developer preview!<\/h3>\n<p>In v14 we introduced new standalone APIs which enable developers to build applications without using NgModules. We\u2019re happy to share that these APIs graduated from developer preview and are now part of the stable API surface. From here on we will evolve them gradually following semantic versioning.<\/p>\n<p>As part of making sure standalone APIs were ready to graduate we have ensured that standalone components work across Angular, and they now fully work in HttpClient, Angular Elements, router and\u00a0more.<\/p>\n<p>The standalone APIs allow you to bootstrap an application using a single component:<\/p>\n<pre>import {bootstrapApplication} from '@angular\/platform-browser';\r\nimport {ImageGridComponent} from'.\/image-grid';\r\n\r\n@Component({\r\n  standalone: true,\r\n  selector: 'photo-gallery',\r\n  imports: [ImageGridComponent],\r\n  template: `\r\n    \u2026 &lt;image-grid [images]=\"imageList\"&gt;&lt;\/image-grid&gt;\r\n  `,\r\n})\r\nexport class PhotoGalleryComponent {\r\n  \/\/ component logic\r\n}\r\n\r\nbootstrapApplication(PhotoGalleryComponent);<\/pre>\n<h3>Router and HttpClient tree-shakable standalone APIs<\/h3>\n<p>You can build a multi-route application using the new router standalone APIs! To declare the root route you can use the following:<\/p>\n<pre>export const appRoutes: Routes = [{\r\n  path: 'lazy',\r\n  loadChildren: () =&gt; import('.\/lazy\/lazy.routes')\r\n    .then(routes =&gt; routes.lazyRoutes)\r\n}];<\/pre>\n<p>Where lazyRoutes are declared\u00a0in:<\/p>\n<pre>import {Routes} from '@angular\/router';\r\n\r\nimport {LazyComponent} from '.\/lazy.component';\r\n\r\nexport const lazyRoutes: Routes = [{path: '', component: LazyComponent}];<\/pre>\n<p>and finally, register the appRoutes in the bootstrapApplication call:<\/p>\n<pre>bootstrapApplication(AppComponent, {\r\n  providers: [\r\n    provideRouter(appRoutes)\r\n  ]\r\n});<\/pre>\n<p>Another benefit of the provideRouter API is that it\u2019s tree-shakable! Bundlers can remove unused features of the router at build-time. In our testing with the new API, we found that removing these unused features from the bundle resulted in an 11% reduction in the size of the router code in the application bundle.<\/p>\n<h3>Directive composition API<\/h3>\n<p>The directive composition API brings code reuse to another level! This feature was inspired by the most popular <a href=\"https:\/\/github.com\/angular\/angular\/issues\/8785\">feature request<\/a> on GitHub asking for the functionality to add directives to a host\u00a0element.<\/p>\n<p>The directive composition API enables developers to enhance host elements with directives and equips Angular with a powerful code reuse strategy, that\u2019s only possible thanks to our compiler. The directive composition API only works with standalone directives.<\/p>\n<p>Let\u2019s look at a quick\u00a0example:<\/p>\n<pre>@Component({\r\n  selector: 'mat-menu',\r\n  hostDirectives: [HasColor, {\r\n    directive: CdkMenu,\r\n    inputs: ['cdkMenuDisabled: disabled'],\r\n    outputs: ['cdkMenuClosed: closed']\r\n  }]\r\n})\r\nclass MatMenu {}<\/pre>\n<p>In the code snippet above we enhance MatMenu with two directives: HasColor and CdkMenu. MatMenu reuses all the inputs, outputs, and associated logic with HasColor and only the logic and the selected inputs from\u00a0CdkMenu.<\/p>\n<p>This technique may remind you of multiple inheritance or traits in some programming languages, with the difference that we have a mechanism for resolution of name conflicts and it\u2019s applicable to user interface primitives.<\/p>\n<h3>Image directive is now\u00a0stable!<\/h3>\n<p>We announced developer preview of the Angular <a href=\"https:\/\/developer.chrome.com\/blog\/angular-image-directive\/\">image directive<\/a> that we developed in collaboration with <a href=\"https:\/\/web.dev\/aurora\">Chrome Aurora<\/a> in\u00a0v14.2.<img decoding=\"async\" src=\"https:\/\/cdn-images-1.medium.com\/max\/1024\/0*Vyptsr-BPVMu43Nf\" alt=\"Image showing the performance improvements you can get with the Angular image directive\" \/><\/p>\n<figure><figcaption>Before and after of a demo application<\/figcaption><\/figure>\n<p>We\u2019re excited to share that it is now stable! <a href=\"https:\/\/www.landsend.com\/\">Land\u2019s End<\/a> experimented with this feature and observed 75% improvement in LCP in a <a href=\"https:\/\/philipwalton.com\/articles\/my-challenge-to-the-web-performance-community\/\">lighthouse lab\u00a0test<\/a>.<\/p>\n<p>The v15 release also includes a few new features for the image directive:<\/p>\n<ul>\n<li><strong>Automatic <\/strong><strong>srcset generation<\/strong>: the directive ensures that an appropriately sized image is requested by generating the srcset attribute for you. This can reduce download times for your\u00a0images.<\/li>\n<li><strong>Fill mode [experimental]<\/strong>: this mode causes the image to fill its parent container, removing the requirement to declare the image\u2019s width and height. It\u2019s a handy tool if you don\u2019t know the sizes of your images or if you\u2019d like to migrate CSS background images to use the directive.<\/li>\n<\/ul>\n<p>You can use the standalone <a href=\"https:\/\/angular.io\/api\/common\/NgOptimizedImage\">NgOptimizedImage<\/a> directive directly in your component or NgModule:<\/p>\n<pre>import { NgOptimizedImage } from '@angular\/common';\r\n\r\n\/\/ Include it into the necessary NgModule\r\n@NgModule({\r\n  imports: [NgOptimizedImage],\r\n})\r\nclass AppModule {}\r\n\r\n\/\/ ... or a standalone Component\r\n@Component({\r\n  standalone: true\r\n  imports: [NgOptimizedImage],\r\n})\r\nclass MyStandaloneComponent {}<\/pre>\n<p>To use it within a component just replace the image\u2019s src attribute with ngSrc and make sure you specify the priority attribute for your LCP\u00a0images.<\/p>\n<p>You can find more information in our <a href=\"https:\/\/angular.io\/guide\/image-directive\">documentation<\/a>.<\/p>\n<h3>Functional router\u00a0guards<\/h3>\n<p>Together with the tree-shakable standalone router APIs we worked on reducing boilerplate in guards. Let\u2019s look at an example where we define a guard which verifies if the user is logged\u00a0in:<\/p>\n<pre>@Injectable({ providedIn: 'root' })\r\nexport class MyGuardWithDependency implements CanActivate {\r\n  constructor(private loginService: LoginService) {}\r\n\r\n  canActivate() {\r\n    return this.loginService.isLoggedIn();\r\n  }\r\n}\r\n\r\nconst route = {\r\n  path: 'somePath',\r\n  canActivate: [MyGuardWithDependency]\r\n};<\/pre>\n<p>LoginService implements most of the logic and in the guard we only invoke isLoggedIn(). Even though the guard is pretty simple, we have lots of boilerplate code.<\/p>\n<p>With the new functional router guards, you can refactor this code down\u00a0to:<\/p>\n<pre>const route = {\r\n  path: 'admin',\r\n  canActivate: [() =&gt; inject(LoginService).isLoggedIn()]\r\n};<\/pre>\n<p>We expressed the entire guard within the guard declaration. Functional guards are also composable\u200a\u2014\u200ayou can create factory-like functions that accept a configuration and return a guard or resolver function. You can find an example for running router guards serially <a href=\"https:\/\/github.com\/angular\/angular\/blob\/8546b17adec01de69bf314a959ef2d12f6638eb9\/packages\/router\/test\/integration.spec.ts#L5157-L5194\">on\u00a0GitHub<\/a>.<\/p>\n<h3>Router unwraps default\u00a0imports<\/h3>\n<p>To make the router simpler and reduce boilerplate further, the router now auto-unwraps default exports when lazy\u00a0loading.<\/p>\n<p>Let\u2019s suppose you have the following LazyComponent:<\/p>\n<pre>@Component({\r\n  standalone: true,\r\n  template: '...'\r\n})\r\nexport default class LazyComponent { ... }<\/pre>\n<p>Before this change, to lazy load a standalone component you had\u00a0to:<\/p>\n<pre>{\r\n  path: 'lazy',\r\n  loadComponent: () =&gt; import('.\/lazy-file').then(m =&gt; m.LazyComponent),\r\n}<\/pre>\n<p>Now the router will look for a default export and if it finds it, use it automatically, which simplifies the route declaration to:<\/p>\n<pre>{\r\n  path: 'lazy',\r\n  loadComponent: () =&gt; import('.\/lazy-file'),\r\n}<\/pre>\n<h3>Better stack\u00a0traces<\/h3>\n<p>We get lots of insights from our annual developer surveys so we want to thank you for taking the time to share your thoughts! Digging deeper into the struggles with debugging experience developers face we found that error messages could use some improvement.<img decoding=\"async\" src=\"https:\/\/cdn-images-1.medium.com\/max\/1024\/0*-Mm7_tv7aw56MOso\" alt=\"A pie chart showing that majority of developers struggle to understand error messages in Angular\" \/><\/p>\n<figure><figcaption>Feedback about debugging challenges<\/figcaption><\/figure>\n<p>Debugging struggles for Angular developers<\/p>\n<p>We partnered with Chrome DevTools to fix this! Let\u2019s look at a sample stack trace that you may get working on an Angular\u00a0app:<\/p>\n<pre>ERROR Error: Uncaught (in promise): Error\r\nError\r\n    at app.component.ts:18:11\r\n    at Generator.next (&lt;anonymous&gt;)\r\n    at asyncGeneratorStep (asyncToGenerator.js:3:1)\r\n    at _next (asyncToGenerator.js:25:1)\r\n    at _ZoneDelegate.invoke (zone.js:372:26)\r\n    at Object.onInvoke (core.mjs:26378:33)\r\n    at _ZoneDelegate.invoke (zone.js:371:52)\r\n    at Zone.run (zone.js:134:43)\r\n    at zone.js:1275:36\r\n    at _ZoneDelegate.invokeTask (zone.js:406:31)\r\n    at resolvePromise (zone.js:1211:31)\r\n    at zone.js:1118:17\r\n    at zone.js:1134:33<\/pre>\n<p>This snippet suffers from two main problems:<\/p>\n<ul>\n<li>There\u2019s only one line corresponding to code that the developer has authored. Everything else is coming from third-party dependencies (Angular framework, Zone.js,\u00a0RxJS)<\/li>\n<li>There\u2019s no information about what user interaction caused the\u00a0error<\/li>\n<\/ul>\n<p>The Chrome DevTools team created a mechanism to ignore scripts coming from node_modules by annotating source maps via the Angular CLI. We also collaborated on an async stack tagging API which allowed us to concatenate independent, scheduled async tasks into a single stack trace. <a href=\"https:\/\/twitter.com\/Jialipassion\">Jia Li<\/a> integrated Zone.js with the async stack tagging API, which allowed us to provide linked stack\u00a0traces.<\/p>\n<p>These two changes dramatically improve the stack traces developers see in Chrome DevTools:<\/p>\n<pre>ERROR Error: Uncaught (in promise): Error\r\nError\r\n    at app.component.ts:18:11\r\n    at fetch (async)  \r\n    at (anonymous) (app.component.ts:4)\r\n    at request (app.component.ts:4)\r\n    at (anonymous) (app.component.ts:17)\r\n    at submit (app.component.ts:15)\r\n    at AppComponent_click_3_listener (app.component.html:4)<\/pre>\n<p>Here you can follow the execution from the button press in the AppComponent all the way to the error. You can read more about the improvements <a href=\"https:\/\/developer.chrome.com\/blog\/devtools-modern-web-debugging\/\">here<\/a>.<\/p>\n<h3>Release MDC-based components to\u00a0stable<\/h3>\n<p>We\u2019re happy to announce the refactoring of the Angular material components based on <a href=\"https:\/\/github.com\/material-components\/material-components-web\">Material Design Components for Web (MDC)<\/a> is now done! This change allows Angular to align even closer to the Material Design specification, reuse code from primitives developed by the Material Design team, and enable us to adopt Material 3 once we finalize the style\u00a0tokens.<\/p>\n<p>For many of the components we\u2019ve updated the styles and the DOM structure and others we rewrote from scratch. We kept most of the TypeScript APIs and component\/directive selectors for the new components identical to the old implementation.<\/p>\n<p>We migrated thousands of Google projects which allowed us to make the external migration path smooth and document a comprehensive <a href=\"https:\/\/github.com\/angular\/components\/blob\/main\/guides\/v15-mdc-migration.md#comprehensive-list-of-changes\">list of the changes<\/a> in all the components.<\/p>\n<p>Due to the new DOM and CSS, you will likely find that some styles in your application need to be adjusted, particularly if your CSS is overriding styles on internal elements on any of the migrated components.<\/p>\n<p>The old implementation of each new component is now deprecated, but still available from a \u201clegacy\u201d import. For example, you can import the old mat-button implementation by importing the legacy button\u00a0module.<\/p>\n<pre>import {MatLegacyButtonModule} from '@angular\/material\/legacy-button';<\/pre>\n<p>Visit the <a href=\"https:\/\/github.com\/angular\/components\/blob\/main\/guides\/v15-mdc-migration.md#how-to-migrate\">migration guide<\/a> for more information.<\/p>\n<p>We moved many of the components to use design tokens and CSS variables under the hood, which will provide a smooth path for applications to adopt Material 3 component styles.<\/p>\n<h3>More improvements in components<\/h3>\n<p>We resolved the 4th most upvoted issue\u200a\u2014\u200a<a href=\"https:\/\/github.com\/angular\/components\/issues\/1331\">range selection support in the\u00a0slider<\/a>.<\/p>\n<p>To get a range input\u00a0use:<\/p>\n<pre>&lt;mat-slider&gt;\r\n  &lt;input matSliderStartThumb&gt;\r\n  &lt;input matSliderEndThumb&gt;\r\n&lt;\/mat-slider&gt;<\/pre>\n<p>Additionally, all components now have an API to customize density which resolved another <a href=\"https:\/\/github.com\/angular\/components\/issues\/4597\">popular GitHub\u00a0issue<\/a>.<\/p>\n<p>You can now specify the default density across all of your components by customizing your\u00a0theme:<\/p>\n<pre>@use '@angular\/material' as mat;\r\n\r\n$theme: mat.define-light-theme((\r\n  color: (\r\n    primary: mat.define-palette(mat.$red-palette),\r\n    accent: mat.define-palette(mat.$blue-palette),\r\n  ),\r\n  typography: mat.define-typography-config(),\r\n  density: -2,\r\n));\r\n\r\n@include mat.all-component-themes($theme);<\/pre>\n<p>The new versions of the components include a wide range of accessibility improvements, including better contrast ratios, increased touch target sizes, and refined ARIA semantics.<\/p>\n<h3>CDK Listbox<\/h3>\n<p>The Component Dev Kit (CDK) offers a set of behavior primitives for building UI components. In v15 we introduced another primitive that you can customize for your use case\u200a\u2014\u200athe CDK\u00a0listbox:<img decoding=\"async\" src=\"https:\/\/cdn-images-1.medium.com\/max\/536\/0*3Nw8FGRXSG6kTb_o\" alt=\"Gif showing the experience using CDK listbox\" \/><\/p>\n<figure><figcaption>CDK Listbox user experience<\/figcaption><\/figure>\n<p>The @angular\/cdk\/listbox module provides directives to help create custom listbox interactions based on the WAI ARIA listbox\u00a0pattern.<\/p>\n<p>By using @angular\/cdk\/listbox you get all the expected behaviors for an accessible experience, including bidi layout support, keyboard interaction, and focus management. All directives apply their associated ARIA roles to their host\u00a0element.<\/p>\n<h3>Improvements in the experimental esbuild\u00a0support<\/h3>\n<figure><img decoding=\"async\" src=\"https:\/\/cdn-images-1.medium.com\/max\/1024\/0*QnnRKdHVrJc_q_29\" alt=\"Image showing the esbuild landing page\" \/><figcaption>esbuild landing\u00a0page<\/figcaption><\/figure>\n<p>In v14 we announced the experimental support for <a href=\"https:\/\/esbuild.github.io\/\">esbuild<\/a> in ng build to enable faster build times and simplify our pipeline.<\/p>\n<p>In v15 we now have experimental Sass, SVG template, file replacement\u00a0, and ng build &#8211;watchsupport! Please give esbuild a try by updating your builders angular.json from:<\/p>\n<pre>\"builder\": \"@angular-devkit\/build-angular:browser\"<\/pre>\n<p>to:<\/p>\n<pre>\"builder\": \"@angular-devkit\/build-angular:browser-esbuild\"<\/pre>\n<p>If you encounter any issues with your production builds, let us know by <a href=\"https:\/\/github.com\/angular\/angular-cli\/issues\/new?assignees=&amp;labels=&amp;template=1-bug-report.yml\">filing an issue<\/a> on\u00a0GitHub.<\/p>\n<h3>Automatic imports in language\u00a0service<\/h3>\n<p>The language service now can automatically import components that you\u2019re using in a template but haven\u2019t added to a standalone component or an NgModule.<\/p>\n<figure><img decoding=\"async\" src=\"https:\/\/cdn-images-1.medium.com\/max\/1024\/0*4kBnwfzuwBYCcCRj\" alt=\"Gif showing how you can automatically import components you\u2019re using in the template with the Angular language service\" \/><figcaption>Language service auto\u00a0imports<\/figcaption><\/figure>\n<h3>CLI improvements<\/h3>\n<p>In the Angular CLI we introduced support for standalone stable APIs. Now you can generate a new standalone component via ng g component &#8211;standalone.<\/p>\n<p>We\u2019re also on a mission to simplify the output of ng new. As a first step we reduce the configuration by removing test.ts, polyfills.ts, and environments. You can now specify your polyfills directly in angular.json in the polyfills section:<\/p>\n<pre>\"polyfills\": [\r\n  \"zone.js\"\r\n]<\/pre>\n<p>To reduce configuration overhead further, we now use\u00a0.browserlist to allow you define the target ECMAScript version.<\/p>\n<h3>Community contribution highlights<\/h3>\n<p>We\u2019re grateful to share that <strong>since the release of v14 we received contributions from over 210 people across framework, components, and CLI! <\/strong>In this section, I\u2019d like to highlight two of\u00a0them.<\/p>\n<p><a href=\"https:\/\/github.com\/angular\/angular\/pull\/47157\"><strong>Provide an ability to configure default options for\u00a0DatePipe<\/strong><\/a><\/p>\n<p>This feature by <a href=\"https:\/\/github.com\/matthiasweiss\">Matthias Wei\u00df<\/a> allows you to globally change the default formatting configuration for DatePipe. Here\u2019s an example with the new bootstrapApplication API:<\/p>\n<pre>bootstrapApplication(AppComponent, {\r\n  providers: [\r\n    {\r\n      provide: DATE_PIPE_DEFAULT_OPTIONS,\r\n      useValue: { dateFormat: 'shortDate' }\r\n    }\r\n  ]\r\n});<\/pre>\n<p>The configuration above will enable shortDate format for all the places you use DatePipe in your application.<\/p>\n<p><a href=\"https:\/\/github.com\/angular\/angular\/pull\/47343\"><strong>Add &lt;link&gt; preload tag for priority images during\u00a0SSR<\/strong><\/a><\/p>\n<p>To make sure priority images are loaded as quickly as possible, <a href=\"https:\/\/github.com\/yharaskrik\">Jay Bell<\/a> added a functionality to the image directive to include a &lt;link rel=&#8221;preload&#8221;&gt; tag for them when using Angular Universal.<\/p>\n<p>There\u2019s no action needed on your end if you\u2019ve already enabled the image directive. If you\u2019ve specified an image as priority, the directive will automatically preload\u00a0it.<\/p>\n<h3>Deprecations<\/h3>\n<p>Major releases allow us to evolve the framework towards simplicity, better developer experience, and alignment with the web platform.<\/p>\n<p>After analyzing thousands of projects within Google we found few rarely used patterns which in most cases are misused. As result we\u2019re deprecating providedIn: &#8216;any&#8217; is an option which has very limited use apart from a handful of esoteric cases internal to the framework.<\/p>\n<p>We\u2019re also deprecating providedIn: NgModule. It does not have wide usage, and in most cases is used incorrectly, in circumstances where you should prefer providedIn: &#8216;root&#8217;. If you should truly scope providers to a specific NgModule, use NgModule.providers instead.<\/p>\n<p>With the evolving layout in CSS, the team will stop publishing new releases of @angular\/flex-layout. We\u2019ll continue providing security and browser compatibility fixes for the next year. You can learn more about this in the <a href=\"https:\/\/blog.angular.io\/modern-css-in-angular-layouts-4a259dca9127\">first blog post<\/a> from our \u201cModern CSS\u201d\u00a0series.<\/p>\n<h3>Excited about what\u2019s coming up\u00a0next!<\/h3>\n<p>The <a href=\"https:\/\/blog.angular.io\/version-9-of-angular-now-available-project-ivy-has-arrived-23c97b63cfa3\">launch of Ivy in 2020<\/a> enabled a lot of improvements across the board that you can find already rolling out. Optional NgModules is a great example. It helps with reduction of the concepts beginners need to deal with as part of their critical learning journey and also supports advanced features such as directive composition API via standalone directives.<\/p>\n<p>Next we\u2019re tackling improvements in our server-side rendering pipeline and reactivity while bringing quality of life improvements across the\u00a0board!<\/p>\n<p>Can\u2019t wait to share with you what\u2019s coming up\u00a0next!<\/p>\n<hr \/>\n<p><a href=\"https:\/\/blog.angular.io\/angular-v15-is-now-available-df7be7f2f4c8\">Angular v15 is now available!<\/a> was originally published in <a href=\"https:\/\/blog.angular.io\/\">Angular Blog<\/a> on Medium, where people are continuing the conversation by highlighting and responding to this story.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Over the past year we removed Angular\u2019s legacy compiler and rendering pipeline which enabled the development of a series of developer experience improvements in the past couple of months. Angular v15 is the culmination of this with dozens of refinements which lead to better developer experience and performance. Sunrise photo by Minko\u00a0Gechev Standalone APIs are [&hellip;]<\/p>\n","protected":false},"author":42,"featured_media":6331,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[11],"tags":[],"class_list":["post-6316","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development"],"acf":{"custom_meta_title":"Angular 15 Top New Features and Updates","meta_description":"Want to learn about Angular 15's new features? The most recent features, quick core updates, and how to migrate to Angular 15 are all covered in depth in this article.","meta_keyword":"angular datatable, angular 15, angular","other_meta_tag":"<meta property=og:type content=\"article\" \/>\r\n<meta property=og:title content=\"Angular 15 New Features and Updates\"\/>\r\n<meta property=og:description content=\"Want to learn about Angular 15's new features? The most recent features, quick core updates, and how to migrate to Angular 15 are all covered in depth in this article.\"\/>\r\n<meta property=\"og:image\" content=\"https:\/\/www.ntspl.co.in\/blog\/wp-content\/uploads\/2023\/01\/ANGULAR-Final.png\"\/>\r\n<meta property=og:url content=\"https:\/\/www.ntspl.co.in\/blog\/angular-15-new-features-and-updates\/\"\/>\r\n<meta property=og:site_name content=NTSPL \/>\r\n<meta name=\"twitter:site\" content=\"@NTSPL\">\r\n<meta name=twitter:card content=\"summary\" \/>\r\n<meta name=twitter:description content=\"Want to learn about Angular 15's new features? The most recent features, quick core updates, and how to migrate to Angular 15 are all covered in depth in this article.\"\/>\r\n<meta name=twitter:title content=\"Angular 15 New Features and Updates\"\/>"},"_links":{"self":[{"href":"https:\/\/www.ntspl.co.in\/blog\/wp-json\/wp\/v2\/posts\/6316"}],"collection":[{"href":"https:\/\/www.ntspl.co.in\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ntspl.co.in\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ntspl.co.in\/blog\/wp-json\/wp\/v2\/users\/42"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ntspl.co.in\/blog\/wp-json\/wp\/v2\/comments?post=6316"}],"version-history":[{"count":4,"href":"https:\/\/www.ntspl.co.in\/blog\/wp-json\/wp\/v2\/posts\/6316\/revisions"}],"predecessor-version":[{"id":6466,"href":"https:\/\/www.ntspl.co.in\/blog\/wp-json\/wp\/v2\/posts\/6316\/revisions\/6466"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ntspl.co.in\/blog\/wp-json\/wp\/v2\/media\/6331"}],"wp:attachment":[{"href":"https:\/\/www.ntspl.co.in\/blog\/wp-json\/wp\/v2\/media?parent=6316"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ntspl.co.in\/blog\/wp-json\/wp\/v2\/categories?post=6316"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ntspl.co.in\/blog\/wp-json\/wp\/v2\/tags?post=6316"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}