{"id":2881,"date":"2024-07-01T06:56:07","date_gmt":"2024-07-01T12:56:07","guid":{"rendered":"https:\/\/frontendmasters.com\/blog\/?p=2881"},"modified":"2024-07-01T06:56:08","modified_gmt":"2024-07-01T12:56:08","slug":"youtube-embeds-are-bananas-heavy-and-its-fixable","status":"publish","type":"post","link":"https:\/\/frontendmasters.com\/blog\/youtube-embeds-are-bananas-heavy-and-its-fixable\/","title":{"rendered":"YouTube Embeds are Bananas Heavy and it&#8217;s Fixable"},"content":{"rendered":"\n<p class=\"learn-more\">TL;DR: YouTube Embeds are like 1.3MB in size with no shared resources between multiple embeds. Using a <a href=\"https:\/\/github.com\/paulirish\/lite-youtube-embed\">&lt;lite-youtube><\/a> Web Component is more like 100k, <em>does<\/em> share resources, and sacrifices no functionality.  <\/p>\n\n\n\n<p>You can put a YouTube video on any website. They help you do it. Under the <strong>Share <\/strong>menu right on youtube.com there is an option to <strong>&lt;> Embed<\/strong> and you&#8217;ll see bit of HTML with an <code>&lt;iframe><\/code> in it. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"429\" src=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/06\/CleanShot-2024-06-30-at-09.12.30%402x.png?resize=1024%2C429&#038;ssl=1\" alt=\"\" class=\"wp-image-2884\" srcset=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/06\/CleanShot-2024-06-30-at-09.12.30%402x.png?resize=1024%2C429&amp;ssl=1 1024w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/06\/CleanShot-2024-06-30-at-09.12.30%402x.png?resize=300%2C126&amp;ssl=1 300w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/06\/CleanShot-2024-06-30-at-09.12.30%402x.png?resize=768%2C322&amp;ssl=1 768w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/06\/CleanShot-2024-06-30-at-09.12.30%402x.png?resize=1536%2C643&amp;ssl=1 1536w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/06\/CleanShot-2024-06-30-at-09.12.30%402x.png?resize=2048%2C858&amp;ssl=1 2048w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><figcaption class=\"wp-element-caption\">&lt;iframe>s are never wonderful for performance, but they make sense for protected third-party content.<\/figcaption><\/figure>\n\n\n\n<p>This is what I&#8217;m getting as I write:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">iframe<\/span> \n  <span class=\"hljs-attr\">width<\/span>=<span class=\"hljs-string\">\"560\"<\/span> \n  <span class=\"hljs-attr\">height<\/span>=<span class=\"hljs-string\">\"315\"<\/span> \n  <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">\"https:\/\/www.youtube.com\/embed\/LN1TQm942_U?si=EfW_M4bEHEO-idL3\"<\/span>\n  <span class=\"hljs-attr\">title<\/span>=<span class=\"hljs-string\">\"YouTube video player\"<\/span>\n  <span class=\"hljs-attr\">frameborder<\/span>=<span class=\"hljs-string\">\"0\"<\/span>\n  <span class=\"hljs-attr\">allow<\/span>=<span class=\"hljs-string\">\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"<\/span>\n  <span class=\"hljs-attr\">referrerpolicy<\/span>=<span class=\"hljs-string\">\"strict-origin-when-cross-origin\"<\/span>\n  <span class=\"hljs-attr\">allowfullscreen<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">iframe<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>If I were Team YouTube, I&#8217;d get <code>loading=\"lazy\"<\/code> on there to help with performance right away. No need for videos that aren&#8217;t even visible on the page to load right away. <\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-code-table\"><span class='shcb-loc'><span><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">iframe<\/span> <\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-tag\">  <span class=\"hljs-attr\">...<\/span><\/span>\n<\/span><\/span><mark class='shcb-loc'><span><span class=\"hljs-tag\">  <span class=\"hljs-attr\">loading<\/span>=<span class=\"hljs-string\">\"lazy\"<\/span><\/span>\n<\/span><\/mark><span class='shcb-loc'><span><span class=\"hljs-tag\">  &gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">iframe<\/span>&gt;<\/span>\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Plus I&#8217;d put some inline styles on there to keep the video fluid and maintain the original aspect ratio. Or you could target these and do that yourself in CSS. Here&#8217;s assuming the videos are the standard 16 \/ 9 aspect ratio:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">iframe<\/span><span class=\"hljs-selector-attr\">&#91;src^=<span class=\"hljs-string\">\"https:\/\/www.youtube.com\/embed\/\"<\/span>]<\/span> {\n  <span class=\"hljs-attribute\">inline-size<\/span>: <span class=\"hljs-number\">100%<\/span>;\n  <span class=\"hljs-attribute\">block-size<\/span>: auto;\n  <span class=\"hljs-attribute\">aspect-ratio<\/span>: <span class=\"hljs-number\">16<\/span> \/ <span class=\"hljs-number\">9<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>But&#8230; let&#8217;s not keep this HTML at all. I&#8217;m sure you read this blog post title, but let&#8217;s put a point on it:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"952\" height=\"1024\" src=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/07\/CleanShot-2024-07-01-at-07.04.34%402x.png?resize=952%2C1024&#038;ssl=1\" alt=\"\" class=\"wp-image-2892\" srcset=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/07\/CleanShot-2024-07-01-at-07.04.34%402x.png?resize=952%2C1024&amp;ssl=1 952w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/07\/CleanShot-2024-07-01-at-07.04.34%402x.png?resize=279%2C300&amp;ssl=1 279w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/07\/CleanShot-2024-07-01-at-07.04.34%402x.png?resize=768%2C826&amp;ssl=1 768w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/07\/CleanShot-2024-07-01-at-07.04.34%402x.png?w=1392&amp;ssl=1 1392w\" sizes=\"auto, (max-width: 952px) 100vw, 952px\" \/><\/figure>\n\n\n\n<p>On a page with literally <em>nothing at all on it<\/em> other than a YouTube Embed, we&#8217;re looking at:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>32 requests<\/li>\n\n\n\n<li>1.3 MB of data transfer<\/li>\n\n\n\n<li>2.76s to load the page on my current WiFi connection<\/li>\n<\/ul>\n\n\n\n<p><a href=\"https:\/\/www.zachleat.com\/web\/youtube-embeds\/\">Zach Leatherman, equally exasperated by this<\/a>, noted:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>The weight also grows linearly with every embed\u2014resources are\u00a0<em>not<\/em>\u00a0shared: two embeds weigh 2.4 MB; three embeds weigh 3.6 MB (you get the idea).<\/p>\n<\/blockquote>\n\n\n\n<p>Wow.<\/p>\n\n\n\n<p>Looks like sizes are up a bit since Zach last looked as well.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Appearance &amp; Functionality<\/h2>\n\n\n\n<p>This is what you get from a YouTube Embed:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>You see a &#8220;poster&#8221; image of the video<\/li>\n\n\n\n<li>You see the title of the video <\/li>\n\n\n\n<li>You see a big play button \u2014 click it to play the video<\/li>\n<\/ul>\n\n\n\n<p>This is very little UI and functionality, which is fine! We can absolutely do all this without this many resources.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why is it this way? \ud83e\udd37\u200d\u2640\ufe0f<\/h2>\n\n\n\n<p>I don&#8217;t think we have any good answers here. In fact, I heard from a little birdie who ran it up the pole that they have tested lighter embeds and <em>found them to reduce engagement<\/em>. \ud83d\ude2d<\/p>\n\n\n\n<p>I&#8217;m just gonna straight up say I don&#8217;t believe it. It&#8217;s like when Google told us that taking up half the screen with AI generated answers led to people clicking on third-party results <em>more<\/em>, but then refused to show data or allow us to track those clicks ourselves.<\/p>\n\n\n\n<p>And hey \u2014 sometimes there are unexpected results in testing. That&#8217;s why we test instead of guess. But because this is <em>so<\/em> counterintuitive and offtrack for so many other similar performance testing situations, this bears deeper scrutiny. It would benefit from an opening of the methodology and data. <\/p>\n\n\n\n<p>Like if you tell me that if you hit people with a stick and they smile more, I&#8217;m gonna want you to stop until we can look at what&#8217;s going on there.<\/p>\n\n\n\n<p>I <em>really<\/em> wish I could find a good link for this, but there is a famous story from YouTube engineers way-back-when who made a much lighter video page and put it into testing. They found, quite counterintuitively, that average page load times went <em>up.<\/em> But with a deeper look, they found that the lighter page was able to <em>reach more people, including people on low-power low-internet-speed devices<\/em> who were able to actually use YouTube for the first time, and them using it much more slowed those averages. That&#8217;s awesome! The speed of using the site was up <em>relatively<\/em> for everyone. The metric of the average page load speed was a red herring and ultimately not meaningful.<\/p>\n\n\n\n<p>How do we know that&#8217;s not the same kind of thing happening here?<\/p>\n\n\n\n<p>Remember the implications of all these resources isn&#8217;t just a little inconvenience. YouTube is so enormous we&#8217;re talking incredible amounts of wasted electricity and thus carbon output. Pulling a megabyte of data off every single YouTube Embed would be an incredible win all around. I might even say <em>not<\/em> improving this is environmentally negligent.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Solution is to Replicate the Embed Experience Another Way. There are Open Source Web Components That Do It Well.<\/h2>\n\n\n\n<p>With a little dab of irony, Google&#8217;s own performance champion Paul Irish has had a web component doing just this for years and years and years:<\/p>\n\n\n\n<p class=\"has-large-font-size\"><a href=\"https:\/\/github.com\/paulirish\/lite-youtube-embed\">lite-youtube-embed<\/a><\/p>\n\n\n\n<p>The pitch is solid:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Provide videos with a supercharged focus on visual performance. This custom element renders just like the real thing but approximately 224\u00d7 faster.<\/p>\n<\/blockquote>\n\n\n\n<p><strong>Two hundred and twenty four<\/strong> times faster. Which of course involves much less data transfer.<\/p>\n\n\n\n<p>And I&#8217;d like to be very clear, also does the exact same thing as the default embed:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>You see a &#8220;poster&#8221; image of the video<\/li>\n\n\n\n<li>You see the title of the video <\/li>\n\n\n\n<li>You see a big play button \u2014 click it to play the video<\/li>\n<\/ul>\n\n\n\n<p>You lose nothing and gain tons of speed, efficiency, and default privacy.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Using Lite YouTube Embed<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Link up the JavaScript to instantiate the Web Component<\/li>\n\n\n\n<li>Use it<\/li>\n<\/ol>\n\n\n\n<p>You could install it from npm or copy and paste a copy into your own project or whatever. Or link it from a CDN:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> <span class=\"hljs-string\">\"https:\/\/esm.sh\/lite-youtube-embed\"<\/span>;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>That&#8217;s like this:<\/p>\n\n\n\n<div class=\"wp-block-cp-codepen-gutenberg-embed-block cp_embed_wrapper\"><iframe id=\"cp_embed_JjqQQQa\" src=\"\/\/codepen.io\/anon\/embed\/JjqQQQa?height=450&amp;theme-id=47434&amp;slug-hash=JjqQQQa&amp;default-tab=html,result\" height=\"450\" scrolling=\"no\" frameborder=\"0\" allowfullscreen allowpaymentrequest name=\"CodePen Embed JjqQQQa\" title=\"CodePen Embed JjqQQQa\" class=\"cp_embed_iframe\" style=\"width:100%;overflow:hidden\">CodePen Embed Fallback<\/iframe><\/div>\n\n\n\n<p>But the best way to use it is right in the README:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Use this as your HTML, load the script asynchronously, and let the JS progressively enhance it.<\/p>\n<\/blockquote>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span> <span class=\"hljs-attr\">defer<\/span> <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/lite-youtube-embed\/0.3.2\/lite-yt-embed.js\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">link<\/span> <span class=\"hljs-attr\">rel<\/span>=<span class=\"hljs-string\">\"stylesheet\"<\/span> <span class=\"hljs-attr\">href<\/span>=<span class=\"hljs-string\">\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/lite-youtube-embed\/0.3.2\/lite-yt-embed.css\"<\/span> <span class=\"hljs-attr\">integrity<\/span>=<span class=\"hljs-string\">\"sha512-utq8YFW0J2abvPCECXM0zfICnIVpbEpW4lI5gl01cdJu+Ct3W6GQMszVITXMtBLJunnaTp6bbzk5pheKX2XuXQ==\"<\/span> <span class=\"hljs-attr\">crossorigin<\/span>=<span class=\"hljs-string\">\"anonymous\"<\/span> <span class=\"hljs-attr\">referrerpolicy<\/span>=<span class=\"hljs-string\">\"no-referrer\"<\/span> \/&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">lite-youtube<\/span> <span class=\"hljs-attr\">videoid<\/span>=<span class=\"hljs-string\">\"ogfYd705cRs\"<\/span> <span class=\"hljs-attr\">style<\/span>=<span class=\"hljs-string\">\"background-image: url('https:\/\/i.ytimg.com\/vi\/ogfYd705cRs\/hqdefault.jpg');\"<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">a<\/span> <span class=\"hljs-attr\">href<\/span>=<span class=\"hljs-string\">\"https:\/\/youtube.com\/watch?v=ogfYd705cRs\"<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"lty-playbtn\"<\/span> <span class=\"hljs-attr\">title<\/span>=<span class=\"hljs-string\">\"Play Video\"<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">span<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"lyt-visually-hidden\"<\/span>&gt;<\/span>Play Video: Keynote (Google I\/O '18)<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">span<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">a<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">lite-youtube<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>With async loaded JavaScript, note the <code>background-image<\/code> is put into the HTML so it can all look right before the JavaScript loads. <\/p>\n\n\n\n<div class=\"wp-block-cp-codepen-gutenberg-embed-block cp_embed_wrapper\"><iframe id=\"cp_embed_zYQVgva\" src=\"\/\/codepen.io\/anon\/embed\/zYQVgva?height=450&amp;theme-id=47434&amp;slug-hash=zYQVgva&amp;default-tab=html,result\" height=\"450\" scrolling=\"no\" frameborder=\"0\" allowfullscreen allowpaymentrequest name=\"CodePen Embed zYQVgva\" title=\"CodePen Embed zYQVgva\" class=\"cp_embed_iframe\" style=\"width:100%;overflow:hidden\">CodePen Embed Fallback<\/iframe><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Alternatives<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/github.com\/justinribeiro\/lite-youtube\">Shadow DOM version<\/a> (more protected styling, more annoying to style)<\/li>\n\n\n\n<li>Do it yourself\n<ul class=\"wp-block-list\">\n<li>Raymond Camden: <a href=\"https:\/\/www.raymondcamden.com\/2022\/11\/17\/building-a-youtube-embed-web-component-both-vanilla-and-webc-flavored\">Building a YouTube Embed Web Component (both vanilla and WebC flavored)<\/a><\/li>\n\n\n\n<li>Adrian Roselli: <a href=\"https:\/\/adrianroselli.com\/2024\/06\/youtube-and-vimeo-web-component.html\">YouTube and Vimeo Web Component<\/a><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Mux: <code><a href=\"https:\/\/github.com\/muxinc\/media-elements\/tree\/main\/packages\/youtube-video-element\">&lt;youtube-video><\/a><\/code> (matches <code>&lt;video><\/code> DOM APIs)<\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/ibrahimcesar\/react-lite-youtube-embed\">React Port<\/a> &amp; <a href=\"https:\/\/github.com\/vercel\/next.js\/tree\/canary\/packages\/third-parties#youtube-embed\">Next.js Official Version<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Which one makes more sense to use, big and slow or small and fast? Especially with the same appearance and functionality, the youtube-lite component is a no-brainer.<\/p>\n","protected":false},"author":1,"featured_media":2897,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"sig_custom_text":"","sig_image_type":"featured-image","sig_custom_image":0,"sig_is_disabled":false,"inline_featured_image":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[31,3,70,193,36],"class_list":["post-2881","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog-post","tag-html","tag-javascript","tag-performance","tag-video","tag-web-components"],"acf":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/07\/youtube-lite-embed.png?fit=1280%2C728&ssl=1","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/posts\/2881","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/comments?post=2881"}],"version-history":[{"count":15,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/posts\/2881\/revisions"}],"predecessor-version":[{"id":2900,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/posts\/2881\/revisions\/2900"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/media\/2897"}],"wp:attachment":[{"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/media?parent=2881"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/categories?post=2881"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/tags?post=2881"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}