{"id":21961,"date":"2019-10-16T15:49:08","date_gmt":"2019-10-16T15:49:08","guid":{"rendered":"http:\/\/developer_experience_for_a_modern_web_jamstack_delivers"},"modified":"2022-03-03T17:21:23","modified_gmt":"2022-03-03T17:21:23","slug":"developer_experience_for_a_modern_web_jamstack_delivers","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/developer_experience_for_a_modern_web_jamstack_delivers","title":{"rendered":"Developer Experience for a Modern Web: JAMstack Delivers"},"content":{"rendered":"<div class=\"wp-block-cloudinary-markdown \"><p>Off and on, the model of architecting software shifts. Over time, programming principles, best practices, toolkits evolve to accommodate the contemporary way of building fast, resilient, and reliable apps. Right now, the buzzword is J-AAAAAAM-STACK.<\/p>\n<h2>What Is JAMstack?<\/h2>\n<p>JAMstack is a modern web-development architecture that contains strictly client-side JavaScript, reusable APIs, and prebuilt markup, whose principles the architecture closely adheres to. With JAMstack, front-end developers can develop apps <strong>without<\/strong> setting up a web server or back-end, saving a load of time and effort. That\u2019s thanks to serverless platforms and APIs, such as Firebase, Webtask, and Amazon Lambda, which enable connections from the front-end framework.<\/p>\n<p>Before JAMstack became available, tightly-coupled software monoliths based on stacks like Linux, Apache, MySQL, PHP (LAMP), RaspberryPi, MySQL, Python (RAMP), and others, e.g., WordPress and Drupal, abounded. They are still in use. However, JAMstack ushered in a new era in which you can decouple software systems and build apps on the front-end while leveraging reusable APIs for the back-end, data storage and processing, authentication, and other key capabilities.<\/p>\n<h2>Why JAMstack?<\/h2>\n<p>Several major attributes of the JAMstack architecture are a significant help for app development.<\/p>\n<h3>Performance<\/h3>\n<p>If loaded and served to users from a content delivery network (CDN), front-end apps built primarily with JavaScript could potentially load fast. Furthermore, you can lower the Time to Interactive and Time to First Byte impressions by applying fast-loading techniques, such as code splitting, route-based chunking, tree shaking, scope hoisting with Webpack, and the Push Render Precache Lazy-Load (PRPL) pattern.<\/p>\n<h3>No Need for a Back-End Infrastructure<\/h3>\n<p>This one is a major reason for leveraging JAMstack for building apps. With JAMstack, instead of having to set up your own web server, you can run functions on a function-as-a-service (FaaS) platform on a remote server, invoking them only when necessary. Not having to manage your own back-end infrastructure saves time, effort, and cost.<\/p>\n<h3>High Security<\/h3>\n<p>The domain expertise of reusable, third-party APIs ensures no loopholes through inadvertent errors on your part. Furthermore, those APIs lower the risk of security attacks because deliberate hacks or compromises of the API platforms must first occur before exposure of your app\u2019s private data becomes at risk.<\/p>\n<h3>Excellent Developer Experience<\/h3>\n<p>The overall experience of developing and maintaining apps relies on how several app components of the underlying architecture work together. Loose coupling along with the advantage of having third-party services perform the cumbersome, labor-intensive tasks make for a smooth developer experience, freeing you up to focus on your app\u2019s business logic and other important issues.<\/p>\n<h3>Scalability<\/h3>\n<p>Scaling apps is a daunting task. JAMstack\u2019s scalability is baked in. Because your app\u2019s interaction with reusable APIs over HTTPS is stateless, you can scale your app content through CDNs to several regions while drawing closer to your users. Replication of your app to multiple servers then proceeds fast.<\/p>\n<h2>How Does JAMstack Work?<\/h2>\n<p>JAMstack contains three main sections.<\/p>\n<h3>Client-Side JavaScript<\/h3>\n<p>This is the front-end in which your JavaScript frameworks come into play: Vue.js, React, Angular, and, um, Vanilla JS, which is no framework, but of course. You can build a front-end, stand-alone app by fetching or modifying data from a dummy API. Furthermore, you can replace the dummy API with a custom-built or third-party API of your choice with nondummy content before production.<\/p>\n<p>After setting up client-side JavaScript to connect with third-party APIs or a serverless back-end, simply host them on platforms like Netlify, ZEIT, or Surge, which are ideal for front-end apps. Other alternatives are CodePen and CodeSandBox.<\/p>\n<h3>Reusable APIs<\/h3>\n<p>Reusable APIs in the JAMstack context are reliable and reusable services geared for developers in the form of pluggable APIs. Gratifyingly, most of them have proven to be effective and robust. See a later section of this article for an extensive list of reusable APIs.<\/p>\n<p>Reusable APIs eliminate the need for a back-end because you can connect over HTTP many app components to service APIs, which perform all the required tasks. Just ensure that your client-side JavaScript can properly communicate with those APIs.<\/p>\n<h3>Prebuilt Markup<\/h3>\n<p>During deployment, you must prebuild this markup to be displayed to users. Static site generators, such as Gatsby and Hugo, fit into this spectrum, generating markups and serving them to clients afterwards.<\/p>\n<div class='c-callout  c-callout--inline-title c-callout--note'><strong class='c-callout__title'>Note:<\/strong> <p><a href=\"https:\/\/twitter.com\/jlengstorf\">Jason Lengstorf<\/a> has built a <a href=\"https:\/\/www.npmjs.com\/package\/gatsby-transformer-cloudinary\">Gatsby Cloudinary Plugin<\/a> that enables Gatsby websites or apps to upload all their media assets to Cloudinary and deliver them to users through Cloudinary\u2019s fast CDN. Look no further if you\u2019re searching for a way to leverage Cloudinary transformation and storage capabilities with Gatsby.<\/p>\n<blockquote class=\"twitter-tweet\"><p lang=\"en\" dir=\"ltr\">I just realized this <a href=\"https:\/\/twitter.com\/cloudinary?ref_src=twsrc%5Etfw\">@cloudinary<\/a> transformer plugin I\u2019m building for <a href=\"https:\/\/twitter.com\/gatsbyjs?ref_src=twsrc%5Etfw\">@gatsbyjs<\/a> will support using animated GIFs with `gatsby-image`. <br><br>[alt: GIF loaded with gatsby-image using the \u201cblur up\u201d technique] <a href=\"https:\/\/t.co\/zsyRWVxWX2\">pic.twitter.com\/zsyRWVxWX2<\/a><\/p>&mdash; Jason Lengstorf lives in airports now, apparently (@jlengstorf) <a href=\"https:\/\/twitter.com\/jlengstorf\/status\/1176648259806404610?ref_src=twsrc%5Etfw\">September 25, 2019<\/a><\/blockquote> <script async src=\"https:\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script><\/div>\n<h2>What Are the Tools and APIs for JAMstack Apps?<\/h2>\n<p>Many tools and APIs are available for building JAMstack apps. See below for a list by architectural component.<\/p>\n<h3>Client-Side JavaScript<\/h3>\n<p>Besides Vanilla JavaScript, you can choose from the numerous JavaScript frameworks that are available for building the front-end, including the following:<\/p>\n<p>Vue, React, Angular, Meteor, Ember, Preact, Next, Nuxt, Aurelia, Stimulus, Cycle.js, Babylon.js, Svelte, Backbone.js, Flight, Polymer, Inferno.js, Knockout.js, Stencil.js, Gatsby, Gridsome, and Ionic<\/p>\n<h3>Reusable APIs<\/h3>\n<p>Below are reusable and reliable APIs that stand to save you a load of development time.<\/p>\n<ul>\n<li>\n<a href=\"https:\/\/cloudinary.com\/\">Cloudinary<\/a>: Media storage, transformation, and optimization, along with a content delivery network (CDN).<\/li>\n<li>\n<a href=\"https:\/\/auth0.com\/\">Auth0<\/a>: Authentication and federated identity.<\/li>\n<li>\n<a href=\"https:\/\/firebase.google.com\/\">Firebase<\/a>: Authentication and push notifications.<\/li>\n<li>\n<a href=\"https:\/\/prismic.io\/\">Prismic<\/a>, <a href=\"https:\/\/strapi.io\/\">Strapi<\/a>, <a href=\"https:\/\/forestry.io\/\">Forestry<\/a>: Headless content management system (CMS) API.<\/li>\n<li>\n<a href=\"https:\/\/www.mailgun.com\/\">Mailgun<\/a>, <a href=\"https:\/\/postmarkapp.com\/\">Postmark<\/a>, and <a href=\"https:\/\/www.sparkpost.com\/\">SparkPost<\/a>: Transactional email messaging.<\/li>\n<li>\n<a href=\"https:\/\/www.contentful.com\/\">Contentful<\/a> and <a href=\"https:\/\/www.e-spirit.com\/us\/homepage\/\">e-spirit<\/a>: Content-infrastructure API<\/li>\n<li>\n<a href=\"https:\/\/azure.microsoft.com\/en-us\/\">Azure<\/a>, <a href=\"https:\/\/aws.amazon.com\/lambda\/\">Lambda<\/a>: Serverless back-end functions<\/li>\n<li>\n<a href=\"https:\/\/www.foxy.io\/\">Foxy.io<\/a> and <a href=\"https:\/\/www.shopify.com\/\">Shopify<\/a>: Integration with ecommerce sites<\/li>\n<li>\n<a href=\"https:\/\/stripe.com\/\">Stripe<\/a> and <a href=\"https:\/\/paystack.com\/\">Paystack<\/a>: Payment processing<\/li>\n<li>\n<a href=\"https:\/\/www.twilio.com\/\">Twilio<\/a> and <a href=\"https:\/\/www.nexmo.com\/\">Nexmo<\/a>: Short Message Service (SMS)<\/li>\n<\/ul>\n<h3>Prebuilt Markup<\/h3>\n<p>Among the tools available for generating prebuilt markup, which can serve your website as static HTML files, are\u2014<\/p>\n<p>GatsbyJS, Hugo, Nuxt.js, Next.js, Jekyll, Hexo, VuePress, and Pelican<\/p>\n<h2>What Are the Best Practices for Developing JAMstack Web Apps?<\/h2>\n<p>Community-defined best practices for building JAMstack apps are available online. However, no hard and fast rules exist. Below are a few guidelines for starting the development of or enhancing JAMstack apps.<\/p>\n<h3>Deliver Content Through a CDN<\/h3>\n<p>CDNs serve websites to users fast even though those networks bear the brunt of multiple users simultaneously trying to access the sites in question. Instead of your servers, the access requests are directed to your CDN, which ultimately saves your site or platform from crashing. Talk about peace of mind!<\/p>\n<p>Cloudflare, Fastly, and Akamai as recommend worthy CDNs.<\/p>\n<h3>Use Build Tools<\/h3>\n<p>Since your content is served to the client (one of the many browsers), using build tools like Browserify, Parcel, and webpack ensures that your code works on all browsers regardless of the JavaScript version for your app.<\/p>\n<p>Furthermore, build tools automate the entire build process, from code pushes to deployment. If you are using a tool like SASS, LESS, or another framework that requires compilation, you can also leverage it to minify, concatenate, and reduce the size of media assets before serving your content to users.<\/p>\n<h3>Implement Version Control<\/h3>\n<p>Git is the best version-control tool for apps, bar none. With Git, many tasks, such as collaboration, rollbacks, deployment through Git hooks, project tagging and versioning, and code reviews, are a breeze.<\/p>\n<h3>Deploy Sites Atomically<\/h3>\n<p>Atomic deployments render each deployment as a full snapshot of the site. That means that, for every release, your deployment serves everything at the same time across the board to users. Such a practice is especially important for major updates.<\/p>\n<h3>Invalidate the Cache<\/h3>\n<p>Two difficult tasks in computer science are naming of programming elements and invalidation of the cache. So, put in place a reliable and well-tested cache-invalidation process to avoid serving outdated content to users.<\/p>\n<p>A Netlify feature invalidates the cache. Have a try.<\/p>\n<h2>What\u2019s Next?<\/h2>\n<p>I strongly believe that JAMstack was made for mankind but not the other way round. As a superb architecture for building web apps, JAMstack also accords them scalability and speed. However, be sure to research in detail what suits your product or company and ensure that you\u2019ll benefit from JAMstack before taking the plunge of switching to it.<\/p>\n<p><a href=\"https:\/\/twitter.com\/tpiros\">Tamas Piros<\/a> has created a comprehensive course titled <a href=\"https:\/\/jamstack.training\/p\/introduction-to-the-jamstack\"><em>Introduction to the JAMstack<\/em><\/a>. The videos there contain  many details on the fundamentals of JAMstack and guidelines for building apps with that architecture.<\/p>\n<p>Are you using JAMstack in production? How has it helped you? How do you store, optimize, and transform media assets? I\u2019d appreciate your sharing your insight.<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":41,"featured_media":21962,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[175],"class_list":["post-21961","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-jamstack"],"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>Developer Experience for a Modern Web: JAMstack Delivers<\/title>\n<meta name=\"description\" content=\"Learn about the components in the popular software architecture JAMstack, the related tools and APIs, and the best practices for developing JAMstack web apps.\" \/>\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\/developer_experience_for_a_modern_web_jamstack_delivers\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Developer Experience for a Modern Web: JAMstack Delivers\" \/>\n<meta property=\"og:description\" content=\"Learn about the components in the popular software architecture JAMstack, the related tools and APIs, and the best practices for developing JAMstack web apps.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/developer_experience_for_a_modern_web_jamstack_delivers\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2019-10-16T15:49:08+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-03-03T17:21:23+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1645221966\/website-2021\/blog\/JAMstack-Delivers-v1\/JAMstack-Delivers-v1-jpg?_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\/jpeg\" \/>\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\/developer_experience_for_a_modern_web_jamstack_delivers#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/developer_experience_for_a_modern_web_jamstack_delivers\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"Developer Experience for a Modern Web: JAMstack Delivers\",\"datePublished\":\"2019-10-16T15:49:08+00:00\",\"dateModified\":\"2022-03-03T17:21:23+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/developer_experience_for_a_modern_web_jamstack_delivers\"},\"wordCount\":8,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/developer_experience_for_a_modern_web_jamstack_delivers#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649719038\/Web_Assets\/blog\/JAMstack-Delivers-v1_21962322c1\/JAMstack-Delivers-v1_21962322c1.jpg?_i=AA\",\"keywords\":[\"JAMStack\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2019\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/developer_experience_for_a_modern_web_jamstack_delivers\",\"url\":\"https:\/\/cloudinary.com\/blog\/developer_experience_for_a_modern_web_jamstack_delivers\",\"name\":\"Developer Experience for a Modern Web: JAMstack Delivers\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/developer_experience_for_a_modern_web_jamstack_delivers#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/developer_experience_for_a_modern_web_jamstack_delivers#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649719038\/Web_Assets\/blog\/JAMstack-Delivers-v1_21962322c1\/JAMstack-Delivers-v1_21962322c1.jpg?_i=AA\",\"datePublished\":\"2019-10-16T15:49:08+00:00\",\"dateModified\":\"2022-03-03T17:21:23+00:00\",\"description\":\"Learn about the components in the popular software architecture JAMstack, the related tools and APIs, and the best practices for developing JAMstack web apps.\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/developer_experience_for_a_modern_web_jamstack_delivers#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/developer_experience_for_a_modern_web_jamstack_delivers\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/developer_experience_for_a_modern_web_jamstack_delivers#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649719038\/Web_Assets\/blog\/JAMstack-Delivers-v1_21962322c1\/JAMstack-Delivers-v1_21962322c1.jpg?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649719038\/Web_Assets\/blog\/JAMstack-Delivers-v1_21962322c1\/JAMstack-Delivers-v1_21962322c1.jpg?_i=AA\",\"width\":1540,\"height\":847},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/developer_experience_for_a_modern_web_jamstack_delivers#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Developer Experience for a Modern Web: JAMstack Delivers\"}]},{\"@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":"Developer Experience for a Modern Web: JAMstack Delivers","description":"Learn about the components in the popular software architecture JAMstack, the related tools and APIs, and the best practices for developing JAMstack web apps.","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\/developer_experience_for_a_modern_web_jamstack_delivers","og_locale":"en_US","og_type":"article","og_title":"Developer Experience for a Modern Web: JAMstack Delivers","og_description":"Learn about the components in the popular software architecture JAMstack, the related tools and APIs, and the best practices for developing JAMstack web apps.","og_url":"https:\/\/cloudinary.com\/blog\/developer_experience_for_a_modern_web_jamstack_delivers","og_site_name":"Cloudinary Blog","article_published_time":"2019-10-16T15:49:08+00:00","article_modified_time":"2022-03-03T17:21:23+00:00","og_image":[{"width":1540,"height":847,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1645221966\/website-2021\/blog\/JAMstack-Delivers-v1\/JAMstack-Delivers-v1-jpg?_i=AA","type":"image\/jpeg"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/developer_experience_for_a_modern_web_jamstack_delivers#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/developer_experience_for_a_modern_web_jamstack_delivers"},"author":{"name":"","@id":""},"headline":"Developer Experience for a Modern Web: JAMstack Delivers","datePublished":"2019-10-16T15:49:08+00:00","dateModified":"2022-03-03T17:21:23+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/developer_experience_for_a_modern_web_jamstack_delivers"},"wordCount":8,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/developer_experience_for_a_modern_web_jamstack_delivers#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649719038\/Web_Assets\/blog\/JAMstack-Delivers-v1_21962322c1\/JAMstack-Delivers-v1_21962322c1.jpg?_i=AA","keywords":["JAMStack"],"inLanguage":"en-US","copyrightYear":"2019","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/developer_experience_for_a_modern_web_jamstack_delivers","url":"https:\/\/cloudinary.com\/blog\/developer_experience_for_a_modern_web_jamstack_delivers","name":"Developer Experience for a Modern Web: JAMstack Delivers","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/developer_experience_for_a_modern_web_jamstack_delivers#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/developer_experience_for_a_modern_web_jamstack_delivers#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649719038\/Web_Assets\/blog\/JAMstack-Delivers-v1_21962322c1\/JAMstack-Delivers-v1_21962322c1.jpg?_i=AA","datePublished":"2019-10-16T15:49:08+00:00","dateModified":"2022-03-03T17:21:23+00:00","description":"Learn about the components in the popular software architecture JAMstack, the related tools and APIs, and the best practices for developing JAMstack web apps.","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/developer_experience_for_a_modern_web_jamstack_delivers#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/developer_experience_for_a_modern_web_jamstack_delivers"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/developer_experience_for_a_modern_web_jamstack_delivers#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649719038\/Web_Assets\/blog\/JAMstack-Delivers-v1_21962322c1\/JAMstack-Delivers-v1_21962322c1.jpg?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649719038\/Web_Assets\/blog\/JAMstack-Delivers-v1_21962322c1\/JAMstack-Delivers-v1_21962322c1.jpg?_i=AA","width":1540,"height":847},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/developer_experience_for_a_modern_web_jamstack_delivers#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Developer Experience for a Modern Web: JAMstack Delivers"}]},{"@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\/v1649719038\/Web_Assets\/blog\/JAMstack-Delivers-v1_21962322c1\/JAMstack-Delivers-v1_21962322c1.jpg?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21961","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=21961"}],"version-history":[{"count":2,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21961\/revisions"}],"predecessor-version":[{"id":23226,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21961\/revisions\/23226"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/21962"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=21961"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=21961"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=21961"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}