{"id":24957,"date":"2016-11-09T00:00:00","date_gmt":"2016-11-09T00:00:00","guid":{"rendered":"https:\/\/alienroad.com\/google-bilgi-bankasi\/building-indexable-progressive-web-apps\/"},"modified":"2016-11-09T00:00:00","modified_gmt":"2016-11-09T00:00:00","slug":"building-indexable-progressive-web-apps","status":"publish","type":"ar_kb","link":"https:\/\/alienroad.com\/google-bilgi-bankasi\/building-indexable-progressive-web-apps\/","title":{"rendered":"Building Indexable Progressive Web Apps"},"content":{"rendered":"<p class=\"gargardate\">Wednesday, November 09, 2016<\/p>\n<p>\n  <a href=\"https:\/\/developers.google.com\/web\/progressive-web-apps\" class=\"external-link\">Progressive Web Apps<\/a><br \/>\n  (PWAs) are taking advantage of new technologies to bring the best of mobile sites and native<br \/>\n  applications to users&mdash;and they&#8217;re one of the most exciting new ideas on the web. But to truly<br \/>\n  have an impact, it&#8217;s important that they&#8217;re indexable and linkable. Every recommendation presented<br \/>\n  in this article is an existing best practice for indexability&mdash;regardless of whether you&#8217;re<br \/>\n  building a Progressive Web App or a simple static website. Nonetheless, we have collated these<br \/>\n  best practices to provide a checklist to guide you:\n<\/p>\n<p><img decoding=\"async\" alt height=\"300\" src=\"https:\/\/alienroad.com\/wp-content\/uploads\/kb-gorsel\/g-6e2e3b503915.jpg\" loading=\"lazy\" width=\"400\"><\/p>\n<h2 id=\"make-your-content-crawlable\" tabindex=\"-1\">Make Your Content Crawlable<\/h2>\n<p>\n  <b>Why?<\/b> Historically, websites would always generate or render their HTML on the server which<br \/>\n  is the simplest way to ensure your content is directly linkable. Web applications popularised the<br \/>\n  concept of client-side rendering in which content is updated dynamically on the page as the users<br \/>\n  navigates without requiring the page to be reloaded.\n<\/p>\n<p>\n  The modern approach is hybrid rendering, in which server-side rendering is used when a user<br \/>\n  navigates directly to a URL and client-side rendering is used after the initial page load for<br \/>\n  subsequent navigation and asynchronous requests.\n<\/p>\n<p>\n  Our<br \/>\n  <a href=\"https:\/\/github.com\/google\/indexable-pwa-samples#server-sample\" class=\"external-link\">server-side PWA sample<\/a><br \/>\n  demonstrates pure server-side rendering, while our<br \/>\n  <a href=\"https:\/\/github.com\/google\/indexable-pwa-samples#hybrid-sample\" class=\"external-link\">hybrid PWA sample<\/a><br \/>\n  demonstrates the combined approach.\n<\/p>\n<p>\n  If you are unfamiliar with the <b>server-side<\/b> and <b>client-side<\/b> rendering terminology,<br \/>\n  check out these articles about<br \/>\n  <a href=\"https:\/\/openmymind.net\/2012\/5\/30\/Client-Side-vs-Server-Side-Rendering\/\" class=\"external-link\">client and server side rendering<\/a>, and<br \/>\n  <a href=\"https:\/\/www.smashingmagazine.com\/2016\/03\/server-side-rendering-react-node-express\/\" class=\"external-link\">server side rendering in react and node.js.<\/a>\n<\/p>\n<div class=\"boxbox goodbox\">\n<p><b>Best practices:<\/b><\/p>\n<p>\n    Use server-side or hybrid rendering so users receive the content in the initial payload of their<br \/>\n    web request.\n  <\/p>\n<p>\n    Always ensure your URLs are independently accessible:\n  <\/p>\n<div><\/div>\n<p>\n    The above should deep link to that particular resource.\n  <\/p>\n<p>\n    If you can&#8217;t support server-side or hybrid rendering for your Progressive Web App and you decide<br \/>\n    to use client-side rendering, we recommend using the Google Search Console &#8220;Fetch as Google<br \/>\n    tool&#8221; to verify your content successfully renders for our Search crawler.\n  <\/p>\n<\/div>\n<div class=\"boxbox badbox\">\n<p>\n    Don&#8217;t redirect users accessing deep links back to your web app&#8217;s home page.\n  <\/p>\n<p>\n    Additionally, serving an error page to users instead of deep linking should also be avoided.\n  <\/p>\n<\/div>\n<p><br class=\"endboxen\"\/><\/p>\n<h2 class=\"subhead\" id=\"provide-clean-urls\" tabindex=\"-1\">Provide Clean URLs<\/h2>\n<p>\n  <b>Why?<\/b> Fragment identifiers (<code>#user\/24601\/<\/code> oder <code>#!user\/24601\/<\/code>) were an<br \/>\n  effective workaround for browsers to AJAX new content from a server without reloading the page.<br \/>\n  This design is known as client-side rendering.\n<\/p>\n<p>\n  However, the fragment identifier syntax isn&#8217;t compatible with some web tools, frameworks and<br \/>\n  protocols such as <a href=\"https:\/\/ogp.me\/\" class=\"external-link\">Facebook&#8217;s Open Graph protocol<\/a>.\n<\/p>\n<p>\n  The <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/History_API\" class=\"external-link\">History API<\/a> enables<br \/>\n  us to update the URL without fragment identifiers while still fetching resources asynchronously<br \/>\n  and therefore avoiding page reloads&mdash;it&#8217;s the best of both worlds. The AJAX crawling scheme<br \/>\n  (with its <code>#!<\/code> \/ escaped-fragment URLs) made sense at its time, but is now no longer<br \/>\n  recommended.\n<\/p>\n<p>\n  Our <a href=\"https:\/\/github.com\/google\/indexable-pwa-samples\" class=\"external-link\">hybrid PWA and client-side PWA samples<\/a><br \/>\n  demonstrate the History API.\n<\/p>\n<div class=\"boxbox goodbox\">\n<p><b>Best practices:<\/b><\/p>\n<p>\n    Provide clean URLs without fragment identifiers (<code>#<\/code> oder <code>#!<\/code>) such as:\n  <\/p>\n<div><\/div>\n<p>\n    If using client-side or hybrid rendering be sure to support browser navigation with the History<br \/>\n    API.\n  <\/p>\n<\/div>\n<div class=\"boxbox avoidbox\">\n<h3 id=\"avoid:\" tabindex=\"-1\">Avoid:<\/h3>\n<p>\n    Using the <code>#!<\/code> URL structure to drive unique URLs is discouraged:\n  <\/p>\n<div><\/div>\n<p>\n    It was introduced as a workaround before the advent of the History API. It is considered a<br \/>\n    separate pattern to the purely <code>#<\/code> URL structure.\n  <\/p>\n<\/div>\n<div class=\"boxbox badbox\">\n<p>\n    Using the <code>#<\/code> URL structure without the accompanying <code>!<\/code> symbol is<br \/>\n    unsupported:\n  <\/p>\n<p>\n    https:\/\/www.example.com\/#product\/25\/\n  <\/p>\n<p>\n    This URL structure is already a concept in the web and relates to deep linking into content on a<br \/>\n    particular page.\n  <\/p>\n<\/div>\n<p><br class=\"endboxen\"\/><\/p>\n<h2 class=\"subhead\" id=\"specify-canonical-urls\" tabindex=\"-1\">Specify Canonical URLs<\/h2>\n<p>\n  <b>Why?<\/b> The best way to eliminate confusion for indexing when the same content is available<br \/>\n  under multiple URLs (be it the same or different domains) is to mark one page as the canonical,<br \/>\n  and all other pages that duplicate that content to refer to it.\n<\/p>\n<div class=\"boxbox goodbox\">\n<p><b>Best practices:<\/b><\/p>\n<p>\n    Include the following tag across all pages mirroring a particular piece of content:\n  <\/p>\n<div><\/div>\n<p>\n    If you are supporting Accelerated Mobile Pages be sure to correctly use its counterpart<br \/>\n    <code>rel=\"amphtml\"<\/code> instruction as well.\n  <\/p>\n<\/div>\n<div class=\"boxbox avoidbox\">\n<h3 id=\"avoid:_1\" tabindex=\"-1\">Avoid:<\/h3>\n<p>\n    Avoid purposely duplicating content across multiple URLs and not using the<br \/>\n    <code>rel=\"canonical\"<\/code> link element.\n  <\/p>\n<p>\n    For example, the <code>rel=\"canonical\"<\/code> link element can reduce ambiguity for URLs with<br \/>\n    tracking parameters.\n  <\/p>\n<\/div>\n<div class=\"boxbox badbox\">\n<p>\n    Avoid creating conflicting canonical references between your pages.\n  <\/p>\n<\/div>\n<p><br class=\"endboxen\"\/><\/p>\n<h2 class=\"subhead\" id=\"design-for-multiple-devices\" tabindex=\"-1\">Design for Multiple Devices<\/h2>\n<p>\n  <b>Why?<\/b> It&#8217;s important that all your users get the best experience possible when viewing your<br \/>\n  website, regardless of their device.\n<\/p>\n<p>\n  Make your site<br \/>\n  <a href=\"https:\/\/developers.google.com\/web\/fundamentals\/design-and-ui\/responsive\/fundamentals\" class=\"external-link\">responsive in its design<\/a><br \/>\n  &mdash;fonts, margins, paddings, buttons and general design of your site should scale dynamically<br \/>\n  based on screen resolutions and device viewports.\n<\/p>\n<p>\n  Small images scaled up for desktop or tablet devices give a poor experience. Conversely, super<br \/>\n  high resolution images take a long time to download on mobile phones and may impact mobile scroll<br \/>\n  performance.\n<\/p>\n<p>\n  Read more about<br \/>\n  <a href=\"https:\/\/medium.com\/@owencm\/designing-great-uis-for-progressive-web-apps-dd38c1d20f7#.c0avg96qb\" class=\"external-link\">UX for PWAs<\/a>.\n<\/p>\n<div class=\"boxbox goodbox\">\n<p><b>Best practices:<\/b><\/p>\n<p>\n    Use<br \/>\n    <a href=\"https:\/\/developers.google.com\/web\/fundamentals\/design-and-ui\/media\/images\/images-in-markup\" class=\"external-link\"><code>srcset<\/code> attribute<\/a><br \/>\n    to fetch different resolution images for different density screens to avoid downloading images<br \/>\n    larger than the device&#8217;s screen is capable of displaying.\n  <\/p>\n<p>\n    Scale your font size and line height to ensure your text is legible no matter the size of the<br \/>\n    device. Similarly ensure the padding and margins of elements also scale sensibly.\n  <\/p>\n<p>\n    Test<br \/>\n    <a href=\"https:\/\/developers.google.com\/web\/tools\/chrome-devtools\/iterate\/device-mode\/emulate-mobile-viewports\" class=\"external-link\">various screen resolutions<\/a><br \/>\n    using the<br \/>\n    <a href=\"https:\/\/developers.google.com\/web\/tools\/chrome-devtools\/iterate\/device-mode\" class=\"external-link\">Chrome Developer Tool&#8217;s Device Mode<\/a><br \/>\n    feature and<br \/>\n    <a href=\"https:\/\/search.google.com\/test\/mobile-friendly\" class=\"external-link\">Mobile Friendly Test tool<\/a>.\n  <\/p>\n<\/div>\n<div class=\"boxbox badbox\">\n<p>\n    Don&#8217;t show different content to users than you show to Google. If you use<br \/>\n    <a href=\"https:\/\/support.google.com\/webmasters\/answer\/2604723\" class=\"external-link\">redirects or user agent detection<\/a><br \/>\n    (a.k.a. browser sniffing or<br \/>\n    <a href=\"https:\/\/alienroad.com\/google-bilgi-bankasi\/mobile-site-and-mobile-first-indexing-best-practices\/\">dynamic serving<\/a>) to alter the<br \/>\n    design of your site for different devices it&#8217;s important that the content itself remains the<br \/>\n    same.\n  <\/p>\n<p>\n    Use the Search Console &#8220;Fetch as Google&#8221; tool to verify the content fetched by Google matches<br \/>\n    the content a user sees.\n  <\/p>\n<p>\n    For usability reasons, avoid using fixed-size fonts.\n  <\/p>\n<\/div>\n<p><\/p>\n<h2 class=\"subhead\" id=\"develop-iteratively\" tabindex=\"-1\">Develop Iteratively<\/h2>\n<p>\n  <b>Why?<\/b> One of the safest paths to take when adding features to a web application is to make<br \/>\n  changes iteratively. If you add features one at a time you can observe the impact of each<br \/>\n  individual change.\n<\/p>\n<p>\n  Alternatively many developers prefer to view their progressive web application as an opportunity<br \/>\n  to overhaul their mobile site in one fell swoop&mdash;developing the new web app in an isolated<br \/>\n  environment and swapping it with their existing mobile site once ready.\n<\/p>\n<p>\n  When developing features iteratively try to break the changes into separate pieces. For example,<br \/>\n  if you intend to move from server-side rendering to hybrid rendering then tackle that as a single<br \/>\n  iteration&mdash;rather than in combination with other features.\n<\/p>\n<p>\n  Both approaches have their own pros and cons. Iterating reduces the complexity of dealing with<br \/>\n  search indexability as the transition is continuous. However, iterating might result in a slower<br \/>\n  development process and potentially a less innovative overhaul if development is not starting from<br \/>\n  scratch.\n<\/p>\n<p>\n  In either case, the most sensitive areas to keep an eye on are your canonical URLs and your site&#8217;s<br \/>\n  robots.txt configuration.\n<\/p>\n<div class=\"boxbox goodbox\">\n<p><b>Best practices:<\/b><\/p>\n<p>\n    Iterate on your website incrementally by adding new features piece by piece.\n  <\/p>\n<p>\n    For example, if don&#8217;t support HTTPS yet then start by migrating to a secure site.\n  <\/p>\n<\/div>\n<div class=\"boxbox avoidbox\">\n<p><b>Avoid:<\/b><\/p>\n<p>\n    If you&#8217;ve developed your progressive web app in an isolated environment, then avoid launching it<br \/>\n    without checking the rel-canonical links and robots.txt are setup appropriately.\n  <\/p>\n<p>\n    Ensure your rel-canonical links point to the real site and that your robots.txt configuration<br \/>\n    allows crawlers to crawl your new site.\n  <\/p>\n<\/div>\n<div class=\"boxbox badbox\">\n<p>\n    It&#8217;s logical to prevent crawlers from indexing your in-development site before launch but don&#8217;t<br \/>\n    forget to unblock crawlers from accessing your new site when you launch.\n  <\/p>\n<\/div>\n<p><br class=\"endboxen\"\/><\/p>\n<h2 class=\"subhead\" id=\"use-progressive-enhancement\" tabindex=\"-1\">Use Progressive Enhancement<\/h2>\n<p>\n  <b>Why?<\/b> Wherever possible it&#8217;s important to detect browser features before using them. Feature<br \/>\n  detection is also better than testing for browsers that you believe support a given feature.\n<\/p>\n<p>\n  A common bad practice in the past was to enable or disable features by testing which browser the<br \/>\n  user had. However, as browsers are constantly evolving with features this technique is strongly<br \/>\n  discouraged.\n<\/p>\n<p>\n  Service Worker is a relatively new technology and it&#8217;s important to not break compatibility in the<br \/>\n  pursuit of progress&mdash;it&#8217;s a perfect example of when to use progressive enhancement.\n<\/p>\n<div class=\"boxbox goodbox\">\n<p><b>Best practices:<\/b><\/p>\n<p>\n    Before registering a Service Worker check for the availability of its API:\n  <\/p>\n<div><\/div>\n<p>\n    Use per API detection method for all your website&#8217;s features.\n  <\/p>\n<\/div>\n<div class=\"boxbox badbox\">\n<p>\n    Never use the browser&#8217;s user agent to enable or disable features in your web app. Always check<br \/>\n    whether the feature&#8217;s API is available and gracefully degrade if unavailable.\n  <\/p>\n<p>\n    Avoid updating or launching your site without testing across multiple browsers! Check your site<br \/>\n    analytics to learn which browsers are most popular among your user base.\n  <\/p>\n<\/div>\n<p><br class=\"endboxen\"\/><\/p>\n<h2 class=\"subhead\" id=\"test-with-search-console\" tabindex=\"-1\">Test with Search Console<\/h2>\n<p>\n  <b>Why?<\/b> It&#8217;s important to understand how Google Search views your site&#8217;s content. You can use<br \/>\n  <a href=\"https:\/\/search.google.com\/search-console\" class=\"external-link\">Search Console<\/a> to<br \/>\n  <a href=\"https:\/\/support.google.com\/webmasters\/answer\/6066468\" class=\"external-link\">fetch individual URLs from your site<\/a><br \/>\n  and see how Google Search views them using the &#8220;Crawl &gt; Fetch as Google&#8221; feature. Search<br \/>\n  Console will process your JavaScript and render the page when that option is selected; otherwise<br \/>\n  only the raw HTML response is shown.\n<\/p>\n<p>\n  Google Search Console also analyses the content on your page in a variety of ways including<br \/>\n  detecting the presence of Structured Data, Rich Cards, Sitelinks and Accelerated Mobile Pages.\n<\/p>\n<div class=\"boxbox goodbox\">\n<p><b>Best practices:<\/b><\/p>\n<p>\n    Monitor your site using Search Console and explore its features including Fetch as Google.\n  <\/p>\n<p>\n    Provide a sitemap via Search Console <b>Crawl <span aria-label=\"and then\">><\/span> Sitemaps<\/b>.<br \/>\n    It can be an effective way to ensure Google Search is aware of all your site&#8217;s pages.\n  <\/p>\n<\/div>\n<p><br class=\"endboxen\"\/><\/p>\n<h2 class=\"subhead\" id=\"annotate-with-schema.org-structured-data\" tabindex=\"-1\">Annotate with Schema.org structured data<\/h2>\n<p>\n  <b>Why?<\/b> <a href=\"https:\/\/schema.org\/\" class=\"external-link\">Schema.org<\/a> structured data is a<br \/>\n  flexible vocabulary for summarizing the most important parts of your page as machine-processable<br \/>\n  data. This can be as general as simply saying that a page is a <code>NewsArticle<\/code>, or as<br \/>\n  specific as detailing the location, band name, venue and ticket vendor for a touring band, or<br \/>\n  summarizing the ingredients and steps for a recipe.\n<\/p>\n<p>\n  The use of this metadata may not make sense for every page on your web application but it&#8217;s<br \/>\n  recommended where it&#8217;s sensible. Google extracts it after the page is rendered.\n<\/p>\n<p>\n  There are a variety of data types including <code>NewsArticle<\/code>, <code>Recipe<\/code>, and<br \/>\n  <code>Product<\/code> to name a few. You can also explore  all the<br \/>\n  <a href=\"https:\/\/alienroad.com\/google-bilgi-bankasi\/structured-data-types\/\">supported data types here<\/a>.\n<\/p>\n<div class=\"boxbox goodbox\">\n<p><b>Best practices:<\/b><\/p>\n<p>\n    Verify that your Schema.org meta data is correct using Google&#8217;s<br \/>\n    <a href=\"https:\/\/alienroad.com\/google-bilgi-bankasi\/schema-markup-testing-tool\/\">Structured Data Testing Tool<\/a>.\n  <\/p>\n<p>\n    Check that the data you provided is appearing and there are no errors present.\n  <\/p>\n<\/div>\n<div class=\"boxbox badbox\">\n<p>\n    Avoid using a data type that doesn&#8217;t match your page&#8217;s actual content. For example don&#8217;t use<br \/>\n    <code>Recipe<\/code> for a T-Shirt you&#8217;re selling&mdash;use <code>Product<\/code> instead.\n  <\/p>\n<\/div>\n<p><br class=\"endboxen\"\/><\/p>\n<h2 class=\"subhead\" id=\"annotate-with-open-graph-and-twitter-cards\" tabindex=\"-1\">Annotate with Open Graph and Twitter Cards<\/h2>\n<p>\n  <b>Why?<\/b> In addition to the Schema.org metadata it can be helpful to add support for Facebook&#8217;s<br \/>\n  Open Graph protocol and Twitter rich cards as well.\n<\/p>\n<p>\n  These metadata formats improve the user experience when your content is shared on their<br \/>\n  corresponding social networks.\n<\/p>\n<p>\n  If your existing site or web application utilises these formats it&#8217;s important to ensure they are<br \/>\n  included in your progressive web application as well for optimal virality.\n<\/p>\n<div class=\"boxbox goodbox\">\n<p><b>Best practices:<\/b><\/p>\n<p>\n    Test your Open Graph markup with the<br \/>\n    <a href=\"https:\/\/developers.facebook.com\/tools\/debug\/\" class=\"external-link\">Facebook Object Debugger Tool<\/a>.\n  <\/p>\n<p>\n    Familiarise yourself with<br \/>\n    <a href=\"https:\/\/dev.twitter.com\/cards\/overview\" class=\"external-link\">Twitter&#8217;s metadata format<\/a>.\n  <\/p>\n<\/div>\n<div class=\"boxbox badbox\">\n<p>\n    Don&#8217;t forget to include these formats if your existing site supports them.\n  <\/p>\n<\/div>\n<p><br class=\"endboxen\"\/><\/p>\n<h2 class=\"subhead\" id=\"test-with-multiple-browsers\" tabindex=\"-1\">Test with Multiple Browsers<\/h2>\n<p>\n  <b>Why?<\/b> Clearly from a user perspective it&#8217;s important that a website behaviors the same<br \/>\n  across all browsers. While the experience might adapt for different screen sizes we all expect a<br \/>\n  mobile site to work the same on similarly sized devices whether it&#8217;s an iPhone or an Android<br \/>\n  mobile phone.\n<\/p>\n<p>\n  While the web can be perceived as fragmented due to number of browsers in use around the world,<br \/>\n  this variety and competition is part of what makes the web such an innovative platform.<br \/>\n  Thankfully, web standards have never been more mature than they are now and modern tools enable<br \/>\n  developers to build rich, cross browser compatible websites with confidence.\n<\/p>\n<div class=\"boxbox goodbox\">\n<p><b>Best practices:<\/b><\/p>\n<p>\n    Use cross browser testing tools such as<br \/>\n    <a href=\"https:\/\/www.browserstack.com\/\" class=\"external-link\">BrowserStack.com<\/a>,<br \/>\n    <a href=\"https:\/\/www.browserling.com\/\" class=\"external-link\">Browserling.com<\/a> oder<br \/>\n    <a href=\"https:\/\/browsershots.org\/\" class=\"external-link\">BrowserShots.org<\/a> to ensure your PWA is<br \/>\n    cross browser<br \/>\n    compatible.\n  <\/p>\n<\/div>\n<p><br class=\"endboxen\"\/><\/p>\n<h2 class=\"subhead\" id=\"measure-page-load-performance\" tabindex=\"-1\">Measure Page Load Performance<\/h2>\n<p>\n  <b>Why?<\/b> The faster a website loads for a user the better their user experience will be.<br \/>\n  Optimizing for page speed is already a well known focus in web development but sometimes when<br \/>\n  developing a new version of a site the necessary optimizations are not considered a high priority.\n<\/p>\n<p>\n  When developing a progressive web application we recommend measuring the performance of your page<br \/>\n  load speed and optimizing before launching the site for the best results.\n<\/p>\n<div class=\"boxbox goodbox\">\n<p><b>Best practices:<\/b><\/p>\n<p>\n    Use tools such as<br \/>\n    <a href=\"https:\/\/pagespeed.web.dev\/\" class=\"external-link\">Page Speed Insights<\/a> and<br \/>\n    <a href=\"https:\/\/webpagetest.org\" class=\"external-link\">Web Page Test<\/a><br \/>\n    to measure the page load performance of your site. While Googlebot has a bit more patience in<br \/>\n    rendering,<br \/>\n    <a href=\"https:\/\/www.thinkwithgoogle.com\/articles\/mobile-page-speed-load-time\" class=\"external-link\">research has shown<\/a><br \/>\n    that 40% of consumers will leave a page that takes longer than three seconds to load.\n  <\/p>\n<p>\n    Read more about our web page performance recommendations and the<br \/>\n    <a href=\"https:\/\/developers.google.com\/web\/fundamentals\/performance\/critical-rendering-path\" class=\"external-link\">critical rendering path here<\/a>.\n  <\/p>\n<\/div>\n<div class=\"boxbox badbox\">\n<p>\n    Avoid leaving optimization as a post-launch step. If your website&#8217;s content loads quickly before<br \/>\n    migrating to a new progressive web application then it&#8217;s important to not regress in your<br \/>\n    optimizations.\n  <\/p>\n<\/div>\n<p><br class=\"endboxen\"\/><\/p>\n<p>\n  We hope that the above checklist is useful and provides the right guidance to help you develop<br \/>\n  your Progressive Web Applications with indexability in mind.\n<\/p>\n<p>\n  As you get started, be sure to check out our<br \/>\n  <a href=\"https:\/\/github.com\/google\/indexable-pwa-samples\" class=\"external-link\">Progressive Web App indexability samples<\/a><br \/>\n  that demonstrate server-side, client-side, and hybrid rendering. As always, if you have any<br \/>\n  questions, please reach out on our<br \/>\n  <a href=\"https:\/\/support.google.com\/webmasters\/go\/community\" class=\"external-link\">Webmaster Forums<\/a>.\n<\/p>\n<p>\n  <span class=\"byline-author\">Posted by Tom Greenaway, Developer Advocate<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wednesday, November 09, 2016 Progressive Web Apps (PWAs) are taking advantage of new technologies to bring the best of mobile sites and native applications to users&mdash;and they&#8217;re one of the most exciting new ideas on the web. But to truly have an impact, it&#8217;s important that they&#8217;re indexable and linkable. Every recommendation presented in this [&hellip;]<\/p>\n","protected":false},"menu_order":82886,"template":"","meta":{"footnotes":""},"ar_kb_kategori":[665],"ar_kb_etiket":[],"class_list":["post-24957","ar_kb","type-ar_kb","status-publish","has-post-thumbnail","hentry","ar_kb_kategori-blog"],"_links":{"self":[{"href":"https:\/\/alienroad.com\/wp-json\/wp\/v2\/ar_kb\/24957","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/alienroad.com\/wp-json\/wp\/v2\/ar_kb"}],"about":[{"href":"https:\/\/alienroad.com\/wp-json\/wp\/v2\/types\/ar_kb"}],"version-history":[{"count":0,"href":"https:\/\/alienroad.com\/wp-json\/wp\/v2\/ar_kb\/24957\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/alienroad.com\/wp-json\/wp\/v2\/media\/27123"}],"wp:attachment":[{"href":"https:\/\/alienroad.com\/wp-json\/wp\/v2\/media?parent=24957"}],"wp:term":[{"taxonomy":"ar_kb_kategori","embeddable":true,"href":"https:\/\/alienroad.com\/wp-json\/wp\/v2\/ar_kb_kategori?post=24957"},{"taxonomy":"ar_kb_etiket","embeddable":true,"href":"https:\/\/alienroad.com\/wp-json\/wp\/v2\/ar_kb_etiket?post=24957"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}