{"id":4087,"date":"2022-03-29T15:17:33","date_gmt":"2022-03-29T15:17:33","guid":{"rendered":"https:\/\/ionicframework.com\/blog\/?p=4087"},"modified":"2022-03-29T15:17:33","modified_gmt":"2022-03-29T15:17:33","slug":"how-to-improve-app-performance","status":"publish","type":"post","link":"https:\/\/ionic.io\/blog\/how-to-improve-app-performance","title":{"rendered":"How to Improve App Performance"},"content":{"rendered":"<p>As a Developer Advocate, a common question or comment I hear from folks is, &#8220;My app is slow. How can I fix it?&#8221; While this may seem like a clear or concise question, it&#8217;s quite complex and can lead to a lot of back and forth about the app in question. Given that I&#8217;ve been helping folks for a while now, I wanted to break down some common issues around slow apps and explain the steps you can take to debug potential issues in your app.<\/p>\n<p><!--more--><\/p>\n<h2>Understanding The Source<\/h2>\n<p>The first step to solving a problem is to understand where the issue is coming from. With a slow app, we first need to figure out if it\u2019s a startup issue or a runtime issue. Each issue will require a different debugging process, which can lead you to two very different places.<\/p>\n<p>With startup performance, we&#8217;re typically looking at a few key metrics:<\/p>\n<ul>\n<li>Time for resources to download<\/li>\n<li>Time for your app to show content (<a href=\"https:\/\/web.dev\/fcp\/\">FCP<\/a>, <a href=\"https:\/\/web.dev\/lcp\/\">LCP<\/a>)<\/li>\n<li>Time for your app to become interactive (<a href=\"https:\/\/web.dev\/tti\/\">TTI<\/a>)<\/li>\n<\/ul>\n<p><a href=\"https:\/\/web.dev\/user-centric-performance-metrics\/#in-the-lab\">There are more metrics<\/a> that can be inspected, but starting with these three should at least get you on the right path.<\/p>\n<p>Runtime performance is arguably more challenging to measure as it requires runtime analysis, which can be complicated if you have never done it before. But in general, the metrics we evaluate are:<\/p>\n<ul>\n<li>Code execution time<\/li>\n<li>Complex layouts\/layout thrashing<\/li>\n<li>Animation of non-performant properties<\/li>\n<\/ul>\n<p>These metrics are a bit more fuzzy as they can vary from project to project.<\/p>\n<h2>Inspecting Something In The Wild<\/h2>\n<p>With these metrics in mind, let&#8217;s look at an example of a real app that is out in the wild, <a href=\"https:\/\/startrack-ng.web.app\/\">Star Track<\/a>. Star Track is an app I&#8217;ve been building for a few years now and has been my test case for performance testing, implementing Ionic updates, and exploring various libraries. The app is complex enough to be considered beyond \u201cHello World,\u201d but not so complex that you&#8217;re struggling to understand how it works. The <a href=\"https:\/\/github.com\/mhartington\/StarTrack-ng\">source for Star Track can be found here<\/a>.<\/p>\n<h2>Starting with Startup<\/h2>\n<p>Starting off, I have Star Track built in production mode and deployed through Firebase hosting. We want to test the initial load time of our app to see how long it takes for the app to load, show meaningful content, and become interactive.<\/p>\n<p>For Chromium-based browsers (Edge, Brave, and Chrome), we can make use of <a href=\"https:\/\/developers.google.com\/web\/tools\/lighthouse\">Lighthouse<\/a>, a tool that not only tests the metrics mentioned above, but also provides other performance metrics and suggestions for improvement. In my experience, however, Lighthouse can return inconsistent results as the heuristics used are constantly changing. While Lighthouse can be a good guide, it shouldn&#8217;t be used as your only source of truth. Other options include <a href=\"http:\/\/webpagetest.org\">Webpage Test<\/a> which can run a similar set of tests multiple times to get a more \u201creal\u201d set of results.<\/p>\n<p>If you want to test manually, simply open the network tab of your DevTools, disable cache, disable service worker, reload the page, and watch the network requests come in. By keeping tabs on the requests made, be it JavaScript, images, stylesheets, etc., you can make some very general assumptions of your app. Generally speaking, if you&#8217;re seeing a lot of requests, your startup time is probably going to be slower. There&#8217;s obviously nuance in that statement, as there could be many small requests which don&#8217;t take a lot of time.<\/p>\n<p>Overall, your best bet is to have testing be part of your CI workflow with tools like <a href=\"https:\/\/web.dev\/lighthouse-ci\/\">Lighthouse CI<\/a>. That way, as you develop your app, you avoid the risk of new features slowing down your app.<\/p>\n<p>Something to take away from these tests is that the conditions we\u2019re setting are not meant to replicate the real world. Consider these tests as exaggerations of what your users <em>might<\/em> face.<\/p>\n<h2>Running Fast at Runtime<\/h2>\n<p>Now, even if your app starts fast, it&#8217;s not always a guarantee that the app will stay fast. It&#8217;s possible to take an app, navigate to a new route, and hit a huge performance bottleneck based on what you are rendering or how you are rendering. Runtime performance can take what was a fast-starting app and slow it down, making users feel even more frustrated. For example, let&#8217;s take this snippet:<\/p>\n<pre><code class=\"language-ts\">export AlbumPage {\n  public album = [];\n  constructor(\n    private api: ApiService,\n    private route: ActivatedRoute,\n  ) {\n    const id = this.route.snapshot.params.id;\n    this.api.fetchAlbum(id).pipe(res =&gt; this.album = res);\n  }\n}\n<\/code><\/pre>\n<p>This is a fairly typical example of getting some data when you enter a new route\/page, so what could be the issue with this? Well, we need to consider the order of operations when we navigate in an app. A simplified overview of what happens is:<\/p>\n<ul>\n<li>User taps a link to a new route<\/li>\n<li>The router prepares to navigate<\/li>\n<li>The new component is created<\/li>\n<li>The component is animated into view<\/li>\n<li>The component becomes &#8220;active&#8221;<\/li>\n<\/ul>\n<p>Between the component being created and becoming active, when the component is animating in, we should be keeping the DOM structure of the new page frozen. By keeping the structure the same as the animation plays, we remove any potential for jank or slowness in our app. If we attempt to animate a component and modify the DOM structure of that component at the same time, the browser now needs to re-layout the entire document, which is fairly expensive to do.<\/p>\n<p>If that is the issue, how can we solve it? By simply moving our fetch request to happen inside an Ionic Lifecycle event, we can coordinate when DOM updates should happen. For this, we&#8217;ll use the <code>ionViewDidEnter<\/code> event, which will defer making the request until after the animation has completed.<\/p>\n<pre><code class=\"language-ts\">export class AlbumPage {\n  public album = [];\n  constructor(\n    private api: ApiService,\n    private route: ActivatedRoute,\n  ) {}\n  ionViewDidEnter(){\n    const id = this.route.snapshot.params.id;\n    this.api.fetchAlbum(id).pipe(res =&gt; this.album = res);\n  }\n}\n<\/code><\/pre>\n<p>Now, when the component is done animating, we&#8217;ll make our requests, and then update the DOM. This keeps our component in a stable state until it is ready for any changes.<\/p>\n<h2>Sharing Data Throughout Your App<\/h2>\n<p>For most cases, requesting data on every component might not be the best solution. With the example above, the data between the two pages isn\u2019t identical, so for this we <strong>need<\/strong> to request it. But if your data is identical, it can be more performant to just pass that data along.<\/p>\n<p>If this is your case, what you can do is create a dedicated service (in Angular) that will let you set a class property and set its value to be the data we want to share.<\/p>\n<pre><code class=\"language-ts\">@Injectable({\n  providedIn: &#039;root&#039;\n})\nexport class StateService {\n  public value;\n}\n<\/code><\/pre>\n<p>With this, when we want to navigate and share the data, we can set the <code>value<\/code> property before we navigate:<\/p>\n<pre><code class=\"language-ts\">export class BrowsePage {\n  constructor(\n    private stateService: StateService,\n    private router: Router\n  ){}\n  navigate(album){\n    this.stateService.value = album;\n    this.router.navigate([&#039;\/&#039;, &#039;album&#039;, album.id])\n  }\n}\n<\/code><\/pre>\n<p>Then in the <code>AlbumPage<\/code> we can read it when the page is ready.<\/p>\n<pre><code>export class AlbumPage {\n  public album = [];\n  constructor(private stateService: StateService ){}\n  ionViewDidEnter(){\n    this.album = this.stateService.value;\n  }\n}\n<\/code><\/pre>\n<p>Now, this is a pretty trivial example, but the concept can be applied to any situation. The main takeaway is that if we have the data already in memory, we should remove any extra requests and just use it. This will reduce the overall time it takes for users to navigate and get something visible in the UI.<\/p>\n<h2>Digging Further<\/h2>\n<p>So far, these two examples are really just the tip of the performance iceberg. There&#8217;s so much more that could be explored here, from how complex of a DOM structure is being shipped, to the actual code developers write.<\/p>\n<p>Performance is a never-ending topic, so we could spend days talking about it. I want to hear from you about some common performance issues you face. Are they runtime or startup related? Let me know where you are having trouble, and I&#8217;ll dive into it!  Cheers!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>As a Developer Advocate, a common question or comment I hear from folks is, &#8220;My app is slow. How can I fix it?&#8221; While this may seem like a clear or concise question, it&#8217;s quite complex and can lead to a lot of back and forth about the app in question. Given that I&#8217;ve been [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":4137,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"publish_to_discourse":"1","publish_post_category":"23","wpdc_auto_publish_overridden":"","wpdc_topic_tags":"","wpdc_pin_topic":"","wpdc_pin_until":"","discourse_post_id":"544616","discourse_permalink":"https:\/\/forum.ionicframework.com\/t\/how-to-improve-app-performance\/221857","wpdc_publishing_response":"","wpdc_publishing_error":"","_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[121],"tags":[79],"class_list":["post-4087","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-engineering","tag-performance"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v23.0 (Yoast SEO v23.0) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>How to Improve App Performance - Ionic Blog<\/title>\n<meta name=\"description\" content=\"So you think your app is slow? See how you can go about measuring your app&#039;s performance and steps to take to improve it&#039;s speed.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/ionic.io\/blog\/how-to-improve-app-performance\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Improve App Performance\" \/>\n<meta property=\"og:description\" content=\"So you think your app is slow? See how you can go about measuring your app&#039;s performance and steps to take to improve it&#039;s speed.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/ionic.io\/blog\/how-to-improve-app-performance\" \/>\n<meta property=\"og:site_name\" content=\"Ionic Blog\" \/>\n<meta property=\"article:published_time\" content=\"2022-03-29T15:17:33+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2022\/03\/slow-feature-image.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1600\" \/>\n\t<meta property=\"og:image:height\" content=\"880\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Mike Hartington\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@mhartington\" \/>\n<meta name=\"twitter:site\" content=\"@ionicframework\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Mike Hartington\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/ionic.io\/blog\/how-to-improve-app-performance#article\",\"isPartOf\":{\"@id\":\"https:\/\/ionic.io\/blog\/how-to-improve-app-performance\"},\"author\":{\"name\":\"Mike Hartington\",\"@id\":\"https:\/\/ionic.io\/blog\/#\/schema\/person\/c8c92b04d526adb925ea514c619a267b\"},\"headline\":\"How to Improve App Performance\",\"datePublished\":\"2022-03-29T15:17:33+00:00\",\"dateModified\":\"2022-03-29T15:17:33+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/ionic.io\/blog\/how-to-improve-app-performance\"},\"wordCount\":1240,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/ionic.io\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/ionic.io\/blog\/how-to-improve-app-performance#primaryimage\"},\"thumbnailUrl\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2022\/03\/slow-feature-image.png\",\"keywords\":[\"performance\"],\"articleSection\":[\"Engineering\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/ionic.io\/blog\/how-to-improve-app-performance#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/ionic.io\/blog\/how-to-improve-app-performance\",\"url\":\"https:\/\/ionic.io\/blog\/how-to-improve-app-performance\",\"name\":\"How to Improve App Performance - Ionic Blog\",\"isPartOf\":{\"@id\":\"https:\/\/ionic.io\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/ionic.io\/blog\/how-to-improve-app-performance#primaryimage\"},\"image\":{\"@id\":\"https:\/\/ionic.io\/blog\/how-to-improve-app-performance#primaryimage\"},\"thumbnailUrl\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2022\/03\/slow-feature-image.png\",\"datePublished\":\"2022-03-29T15:17:33+00:00\",\"dateModified\":\"2022-03-29T15:17:33+00:00\",\"description\":\"So you think your app is slow? See how you can go about measuring your app's performance and steps to take to improve it's speed.\",\"breadcrumb\":{\"@id\":\"https:\/\/ionic.io\/blog\/how-to-improve-app-performance#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/ionic.io\/blog\/how-to-improve-app-performance\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/ionic.io\/blog\/how-to-improve-app-performance#primaryimage\",\"url\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2022\/03\/slow-feature-image.png\",\"contentUrl\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2022\/03\/slow-feature-image.png\",\"width\":1600,\"height\":880},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/ionic.io\/blog\/how-to-improve-app-performance#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/ionic.io\/blog\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to Improve App Performance\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/ionic.io\/blog\/#website\",\"url\":\"https:\/\/ionic.io\/blog\/\",\"name\":\"ionic.io\/blog\",\"description\":\"Build amazing native and progressive web apps with the web\",\"publisher\":{\"@id\":\"https:\/\/ionic.io\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/ionic.io\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/ionic.io\/blog\/#organization\",\"name\":\"Ionic\",\"url\":\"https:\/\/ionic.io\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/ionic.io\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/10\/white-on-color.png\",\"contentUrl\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/10\/white-on-color.png\",\"width\":1920,\"height\":854,\"caption\":\"Ionic\"},\"image\":{\"@id\":\"https:\/\/ionic.io\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/ionicframework\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/ionic.io\/blog\/#\/schema\/person\/c8c92b04d526adb925ea514c619a267b\",\"name\":\"Mike Hartington\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/ionic.io\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2018\/08\/mike-headshot-2-smaller-150x150.png\",\"contentUrl\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2018\/08\/mike-headshot-2-smaller-150x150.png\",\"caption\":\"Mike Hartington\"},\"description\":\"Director of Developer Relations\",\"sameAs\":[\"https:\/\/twitter.com\/mhartington\",\"https:\/\/x.com\/mhartington\"],\"url\":\"https:\/\/ionic.io\/blog\/author\/mike\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"How to Improve App Performance - Ionic Blog","description":"So you think your app is slow? See how you can go about measuring your app's performance and steps to take to improve it's speed.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/ionic.io\/blog\/how-to-improve-app-performance","og_locale":"en_US","og_type":"article","og_title":"How to Improve App Performance","og_description":"So you think your app is slow? See how you can go about measuring your app's performance and steps to take to improve it's speed.","og_url":"https:\/\/ionic.io\/blog\/how-to-improve-app-performance","og_site_name":"Ionic Blog","article_published_time":"2022-03-29T15:17:33+00:00","og_image":[{"width":1600,"height":880,"url":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2022\/03\/slow-feature-image.png","type":"image\/png"}],"author":"Mike Hartington","twitter_card":"summary_large_image","twitter_creator":"@mhartington","twitter_site":"@ionicframework","twitter_misc":{"Written by":"Mike Hartington","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/ionic.io\/blog\/how-to-improve-app-performance#article","isPartOf":{"@id":"https:\/\/ionic.io\/blog\/how-to-improve-app-performance"},"author":{"name":"Mike Hartington","@id":"https:\/\/ionic.io\/blog\/#\/schema\/person\/c8c92b04d526adb925ea514c619a267b"},"headline":"How to Improve App Performance","datePublished":"2022-03-29T15:17:33+00:00","dateModified":"2022-03-29T15:17:33+00:00","mainEntityOfPage":{"@id":"https:\/\/ionic.io\/blog\/how-to-improve-app-performance"},"wordCount":1240,"commentCount":0,"publisher":{"@id":"https:\/\/ionic.io\/blog\/#organization"},"image":{"@id":"https:\/\/ionic.io\/blog\/how-to-improve-app-performance#primaryimage"},"thumbnailUrl":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2022\/03\/slow-feature-image.png","keywords":["performance"],"articleSection":["Engineering"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/ionic.io\/blog\/how-to-improve-app-performance#respond"]}]},{"@type":"WebPage","@id":"https:\/\/ionic.io\/blog\/how-to-improve-app-performance","url":"https:\/\/ionic.io\/blog\/how-to-improve-app-performance","name":"How to Improve App Performance - Ionic Blog","isPartOf":{"@id":"https:\/\/ionic.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/ionic.io\/blog\/how-to-improve-app-performance#primaryimage"},"image":{"@id":"https:\/\/ionic.io\/blog\/how-to-improve-app-performance#primaryimage"},"thumbnailUrl":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2022\/03\/slow-feature-image.png","datePublished":"2022-03-29T15:17:33+00:00","dateModified":"2022-03-29T15:17:33+00:00","description":"So you think your app is slow? See how you can go about measuring your app's performance and steps to take to improve it's speed.","breadcrumb":{"@id":"https:\/\/ionic.io\/blog\/how-to-improve-app-performance#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/ionic.io\/blog\/how-to-improve-app-performance"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ionic.io\/blog\/how-to-improve-app-performance#primaryimage","url":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2022\/03\/slow-feature-image.png","contentUrl":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2022\/03\/slow-feature-image.png","width":1600,"height":880},{"@type":"BreadcrumbList","@id":"https:\/\/ionic.io\/blog\/how-to-improve-app-performance#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/ionic.io\/blog"},{"@type":"ListItem","position":2,"name":"How to Improve App Performance"}]},{"@type":"WebSite","@id":"https:\/\/ionic.io\/blog\/#website","url":"https:\/\/ionic.io\/blog\/","name":"ionic.io\/blog","description":"Build amazing native and progressive web apps with the web","publisher":{"@id":"https:\/\/ionic.io\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/ionic.io\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/ionic.io\/blog\/#organization","name":"Ionic","url":"https:\/\/ionic.io\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ionic.io\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/10\/white-on-color.png","contentUrl":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/10\/white-on-color.png","width":1920,"height":854,"caption":"Ionic"},"image":{"@id":"https:\/\/ionic.io\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/ionicframework"]},{"@type":"Person","@id":"https:\/\/ionic.io\/blog\/#\/schema\/person\/c8c92b04d526adb925ea514c619a267b","name":"Mike Hartington","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ionic.io\/blog\/#\/schema\/person\/image\/","url":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2018\/08\/mike-headshot-2-smaller-150x150.png","contentUrl":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2018\/08\/mike-headshot-2-smaller-150x150.png","caption":"Mike Hartington"},"description":"Director of Developer Relations","sameAs":["https:\/\/twitter.com\/mhartington","https:\/\/x.com\/mhartington"],"url":"https:\/\/ionic.io\/blog\/author\/mike"}]}},"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2022\/03\/slow-feature-image.png","_links":{"self":[{"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/posts\/4087","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/comments?post=4087"}],"version-history":[{"count":0,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/posts\/4087\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/media\/4137"}],"wp:attachment":[{"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/media?parent=4087"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/categories?post=4087"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/tags?post=4087"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}