{"id":21523,"date":"2017-05-15T14:58:10","date_gmt":"2017-05-15T14:58:10","guid":{"rendered":"http:\/\/getting_a_better_react_ion_with_progressive_web_apps"},"modified":"2022-03-03T16:53:19","modified_gmt":"2022-03-03T16:53:19","slug":"getting_a_better_react_ion_with_progressive_web_apps","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/getting_a_better_react_ion_with_progressive_web_apps","title":{"rendered":"Getting a Better React-ion with Progressive Web Apps"},"content":{"rendered":"<div class=\"wp-block-cloudinary-markdown \"><p><em>This is part 2 of a 3 part series<\/em><\/p>\n<p>React has become more popular, as well as more mature, over the last four years since its release by Facebook. It has become one of the go-to technologies for people looking to componentize the front-end of any web application. It also helps that an entire mobile stack is built around React in the form of <a href=\"https:\/\/facebook.github.io\/react-native\/\">ReactNative<\/a>. The components are wonderful, however there can be a burdensome learning curve. But, in the end, there\u2019s the payoff of highly reusable code and a better user experience.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloudinary-res.cloudinary.com\/image\/upload\/w_700\/React_Graph.png\" alt=\"React Usage Statistics\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"700\" height=\"642\"\/><\/p>\n<p>To help people infuse React apps with image and video management services, <a href=\"https:\/\/cloudinary.com\">Cloudinary<\/a> provides a fully formed set of <a href=\"https:\/\/github.com\/cloudinary\/cloudinary-react\">React components<\/a> that can quickly be configured and dropped into your application. Your app is already equipped with management and manipulation of media assets and delivering them via a CDN, and you already have a React app delivering the content to your end user. Now, you may want to boost performance and make your end user\u2019s experience even better. To do that you\u2019ll want to follow the tenets of React Progressive Web Apps.<\/p>\n<p>What are Progressive Web Apps? There are many sources where you can learn more, including an article we recently wrote about <a href=\"https:\/\/cloudinary.com\/blog\/media_heavy_apps_progressive_web_to_the_rescue\">why you should care<\/a>. But how do you introduce that into an already complex stack of a React application? We\u2019ll show you, step-by-step.<\/p>\n<p>You\u2019ve got your app and it\u2019s using the Cloudinary React components. It may look a little like <a href=\"https:\/\/github.com\/ukmadlz\/cloudinary-pwa-react\/releases\/tag\/basic-media-app\">https:\/\/github.com\/ukmadlz\/cloudinary-pwa-react\/releases\/tag\/basic-media-app<\/a>. So what steps do you need to take to make it a React Progressive Web App?<\/p>\n<h2>Step 1: Security<\/h2>\n<p>Is your application secure? All the features needed to turn your application into a Progressive Web App can only be used from a connection being served over HTTPS. If you are not doing so already, you can find guides for using services like CloudFlare to quickly implement an HTTPS cache in front of your application. When developing, localhost and 127.0.0.1 are considered to be secure and trusted endpoints, so you can develop without using certificates locally.<\/p>\n<h2>Step 2: Discovery<\/h2>\n<p>Is your application discoverable? Part of making a web app a Progressive Web App is introducing a <a href=\"https:\/\/w3c.github.io\/manifest\/\">web manifest<\/a>. This JSON file describes the application, as well as assets, to make it easier to use on different devices. For the sake of Progressive Web Apps on Android, it helps with the app name, description, splash page, Chrome shell wrapper, and home screen icon.<\/p>\n<p>The most basic web manifest looks like this:<\/p>\n<script src=\"https:\/\/gist.github.com\/ukmadlz\/b4621207cca8b55101cd395f20424c04.js\"><\/script>\n<p>It informs the browser of the preferred icon, similar to how the favicon works, and gives the name and brief description of the app itself. This information is used differently by each browser, from helping the internal history search to providing richer information for the \u201crecently visited\u201d pieces. But it is all designed to make the application easier to discover, or, in most cases, re-discover quickly. A more <a href=\"https:\/\/gist.github.com\/ukmadlz\/a841978c670af4f848ce2cb45a1f6595\">advanced file<\/a>, like the one we use in our <a href=\"https:\/\/github.com\/ukmadlz\/cloudinary-pwa-react\/releases\/tag\/make-app-discoverable\">demo app<\/a>, goes a step further and helps the browser interpret the app.<\/p>\n<p>This file describes the basics for the app to become discoverable, as well as the metadata to make it easier for the browser to display the content and make it behave correctly as a near-native app. To make this manifest visible to the browser, you need to add the following tags to the <code>&lt;head&gt;<\/code> of your page:<\/p>\n<script src=\"https:\/\/gist.github.com\/ukmadlz\/d265af97ab9fd930232e7bec99485be7.js\"><\/script>\n<p>These meta tags tell the browser (1) where to find the manifest, (2) the setup of the display and (3) the app\u2019s theme color. It does this to make it discoverable and display correctly on mobile devices.<\/p>\n<h2>Step 3: Go Offline<\/h2>\n<p>Does the app work offline? The next most important part of the app is to make sure it works offline (otherwise, by definition, it\u2019s not a Progressive Web App). The way to do this is to register a service worker that will run in the background and process information from the cache, as well as from the internet when it has a network connection. Since not all popular browsers are compliant with the service worker specification, a bit of feature detection is necessary.<\/p>\n<script src=\"https:\/\/gist.github.com\/ukmadlz\/c4f7270fa706b4ca12028bdd6e60e78c.js\"><\/script>\n<p>This code snippet checks that the service worker is part of the navigator object, and only if it\u2019s available does it attempt to register a new one located at <code>sw.js<\/code> and gives it a scope relative to <code>.\/<\/code>. If successful, it creates a new instance of <code>sw.js<\/code> and will execute the event code in the service worker. The complete service worker we use in this app can be found <a href=\"https:\/\/github.com\/ukmadlz\/cloudinary-pwa-react\/blob\/add-service-worker\/sw.js\">here<\/a>. The file is being triggered by three key events:<\/p>\n<ul>\n<li>Install Event: Generating a cache when the service worker is first registered, then proceeding to save all URLs that we want saved from the start.<\/li>\n<\/ul>\n<script src=\"https:\/\/gist.github.com\/ukmadlz\/df22c048f5b19786c4a82763f1149f11.js\"><\/script>\n<ul>\n<li>Activate Event: Running when the service worker is recalled by the browser, e.g. when a new browser session is started. It performs general clean up to stop the cache from growing too large and deletes any caches that are no longer registered for use.<\/li>\n<\/ul>\n<script src=\"https:\/\/gist.github.com\/ukmadlz\/321102dc39c5ffe3ba6eba64589fabe2.js\"><\/script>\n<ul>\n<li>Fetch Event: Caching things on the fly is done whenever the browser makes any request. It fires the fetch event that we can intercept in the service worker. Here we can check against the cache for the item, and either serve a cached copy or fetch it. In the latter case, we cache the fetched item and serve it to the end-user.<\/li>\n<\/ul>\n<script src=\"https:\/\/gist.github.com\/ukmadlz\/2c4f67d0d6499b9da265439e2665936c.js\"><\/script>\n<p>The events above guarantee that the end users have everything they need in the browser, so they can continue to get use out of a web app when offline. This is essential for improving performance and user experience in areas of degraded signal when accessing the app over a bad mobile connection.<\/p>\n<p>If you\u2019d like to dive deeper into the example used here, copy the <a href=\"https:\/\/github.com\/ukmadlz\/cloudinary-pwa-react\">GitHub repo<\/a> or fork the <a href=\"https:\/\/codepen.io\/team\/Cloudinary\/project\/editor\/a89854d943360d753780688be20a30c1\/ZBqkqD\/\">CodePen project<\/a> to learn how to implement this yourself.<\/p>\n<p>Resources:<\/p>\n<ul>\n<li>\n<a href=\"https:\/\/github.com\/ukmadlz\/cloudinary-pwa-react\">GitHub<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/codepen.io\/team\/Cloudinary\/project\/editor\/a89854d943360d753780688be20a30c1\/ZBqkqD\/\">CodePen Project<\/a>\n<\/li>\n<\/ul>\n<table>\n<tr>\n<td style = \"padding: 5px;\">\n<img decoding=\"async\" src=\"https:\/\/cloudinary-res.cloudinary.com\/image\/upload\/c_thumb,w_1000\/mike_hackconeu.jpg\" alt=\"Mike Elsmore\" title=\"Mike Elsmore\"><\/img><\/td>\n<td style = \"padding: 10px;\"><i><a href=\"https:\/\/twitter.com\/ukmadlz\" target=\"_new\">Mike Elsmore<\/a> loves building, tinkering and making odd things happen with code, using his time to share knowledge on rapid development and database technologies. Most of the time, he can be found in the middle of building a prototype that combines JavaScript, server tech and odd APIs. Mike also happens to be an active participant in the hacker subculture, taking part in hackathons and development conferences, as well as running his own. <\/i><\/td>\n<\/tr>\n<\/table>\n<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":41,"featured_media":21524,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[134,246],"class_list":["post-21523","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-guest-post","tag-react"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.6 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>React Progressive Web Apps: Improving Performance and UX<\/title>\n<meta name=\"description\" content=\"React progressive web apps are becoming one of the go-to technologies for people looking to componentize the front-end of any web application\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cloudinary.com\/blog\/getting_a_better_react_ion_with_progressive_web_apps\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Getting a Better React-ion with Progressive Web Apps\" \/>\n<meta property=\"og:description\" content=\"React progressive web apps are becoming one of the go-to technologies for people looking to componentize the front-end of any web application\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/getting_a_better_react_ion_with_progressive_web_apps\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-05-15T14:58:10+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-03-03T16:53:19+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1645221190\/website-2021\/blog\/React_Progressive_Web_App_2000x1100\/React_Progressive_Web_App_2000x1100-png?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"1540\" \/>\n\t<meta property=\"og:image:height\" content=\"847\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"NewsArticle\",\"@id\":\"https:\/\/cloudinary.com\/blog\/getting_a_better_react_ion_with_progressive_web_apps#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/getting_a_better_react_ion_with_progressive_web_apps\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"Getting a Better React-ion with Progressive Web Apps\",\"datePublished\":\"2017-05-15T14:58:10+00:00\",\"dateModified\":\"2022-03-03T16:53:19+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/getting_a_better_react_ion_with_progressive_web_apps\"},\"wordCount\":8,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/getting_a_better_react_ion_with_progressive_web_apps#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649754950\/Web_Assets\/blog\/React_Progressive_Web_App_2000x1100\/React_Progressive_Web_App_2000x1100.png?_i=AA\",\"keywords\":[\"Guest Post\",\"React\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2017\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/getting_a_better_react_ion_with_progressive_web_apps\",\"url\":\"https:\/\/cloudinary.com\/blog\/getting_a_better_react_ion_with_progressive_web_apps\",\"name\":\"React Progressive Web Apps: Improving Performance and UX\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/getting_a_better_react_ion_with_progressive_web_apps#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/getting_a_better_react_ion_with_progressive_web_apps#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649754950\/Web_Assets\/blog\/React_Progressive_Web_App_2000x1100\/React_Progressive_Web_App_2000x1100.png?_i=AA\",\"datePublished\":\"2017-05-15T14:58:10+00:00\",\"dateModified\":\"2022-03-03T16:53:19+00:00\",\"description\":\"React progressive web apps are becoming one of the go-to technologies for people looking to componentize the front-end of any web application\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/getting_a_better_react_ion_with_progressive_web_apps#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/getting_a_better_react_ion_with_progressive_web_apps\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/getting_a_better_react_ion_with_progressive_web_apps#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649754950\/Web_Assets\/blog\/React_Progressive_Web_App_2000x1100\/React_Progressive_Web_App_2000x1100.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649754950\/Web_Assets\/blog\/React_Progressive_Web_App_2000x1100\/React_Progressive_Web_App_2000x1100.png?_i=AA\",\"width\":1540,\"height\":847},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/getting_a_better_react_ion_with_progressive_web_apps#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Getting a Better React-ion with Progressive Web Apps\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"name\":\"Cloudinary Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cloudinary.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\",\"name\":\"Cloudinary Blog\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"width\":312,\"height\":60,\"caption\":\"Cloudinary Blog\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"React Progressive Web Apps: Improving Performance and UX","description":"React progressive web apps are becoming one of the go-to technologies for people looking to componentize the front-end of any web application","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:\/\/cloudinary.com\/blog\/getting_a_better_react_ion_with_progressive_web_apps","og_locale":"en_US","og_type":"article","og_title":"Getting a Better React-ion with Progressive Web Apps","og_description":"React progressive web apps are becoming one of the go-to technologies for people looking to componentize the front-end of any web application","og_url":"https:\/\/cloudinary.com\/blog\/getting_a_better_react_ion_with_progressive_web_apps","og_site_name":"Cloudinary Blog","article_published_time":"2017-05-15T14:58:10+00:00","article_modified_time":"2022-03-03T16:53:19+00:00","og_image":[{"width":1540,"height":847,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1645221190\/website-2021\/blog\/React_Progressive_Web_App_2000x1100\/React_Progressive_Web_App_2000x1100-png?_i=AA","type":"image\/png"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/getting_a_better_react_ion_with_progressive_web_apps#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/getting_a_better_react_ion_with_progressive_web_apps"},"author":{"name":"","@id":""},"headline":"Getting a Better React-ion with Progressive Web Apps","datePublished":"2017-05-15T14:58:10+00:00","dateModified":"2022-03-03T16:53:19+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/getting_a_better_react_ion_with_progressive_web_apps"},"wordCount":8,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/getting_a_better_react_ion_with_progressive_web_apps#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649754950\/Web_Assets\/blog\/React_Progressive_Web_App_2000x1100\/React_Progressive_Web_App_2000x1100.png?_i=AA","keywords":["Guest Post","React"],"inLanguage":"en-US","copyrightYear":"2017","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/getting_a_better_react_ion_with_progressive_web_apps","url":"https:\/\/cloudinary.com\/blog\/getting_a_better_react_ion_with_progressive_web_apps","name":"React Progressive Web Apps: Improving Performance and UX","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/getting_a_better_react_ion_with_progressive_web_apps#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/getting_a_better_react_ion_with_progressive_web_apps#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649754950\/Web_Assets\/blog\/React_Progressive_Web_App_2000x1100\/React_Progressive_Web_App_2000x1100.png?_i=AA","datePublished":"2017-05-15T14:58:10+00:00","dateModified":"2022-03-03T16:53:19+00:00","description":"React progressive web apps are becoming one of the go-to technologies for people looking to componentize the front-end of any web application","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/getting_a_better_react_ion_with_progressive_web_apps#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/getting_a_better_react_ion_with_progressive_web_apps"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/getting_a_better_react_ion_with_progressive_web_apps#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649754950\/Web_Assets\/blog\/React_Progressive_Web_App_2000x1100\/React_Progressive_Web_App_2000x1100.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649754950\/Web_Assets\/blog\/React_Progressive_Web_App_2000x1100\/React_Progressive_Web_App_2000x1100.png?_i=AA","width":1540,"height":847},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/getting_a_better_react_ion_with_progressive_web_apps#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Getting a Better React-ion with Progressive Web Apps"}]},{"@type":"WebSite","@id":"https:\/\/cloudinary.com\/blog\/#website","url":"https:\/\/cloudinary.com\/blog\/","name":"Cloudinary Blog","description":"","publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cloudinary.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/cloudinary.com\/blog\/#organization","name":"Cloudinary Blog","url":"https:\/\/cloudinary.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","width":312,"height":60,"caption":"Cloudinary Blog"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":""}]}},"jetpack_featured_media_url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649754950\/Web_Assets\/blog\/React_Progressive_Web_App_2000x1100\/React_Progressive_Web_App_2000x1100.png?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21523","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/users\/41"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/comments?post=21523"}],"version-history":[{"count":3,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21523\/revisions"}],"predecessor-version":[{"id":23210,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21523\/revisions\/23210"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/21524"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=21523"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=21523"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=21523"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}