CINXE.COM

Official Google Webmaster Central Blog: January 2019

<!DOCTYPE html> <html class='v2 list-page' dir='ltr' itemscope='' itemtype='http://schema.org/Blog' lang='en' xmlns='http://www.w3.org/1999/xhtml' xmlns:b='http://www.google.com/2005/gml/b' xmlns:data='http://www.google.com/2005/gml/data' xmlns:expr='http://www.google.com/2005/gml/expr'> <head> <link href='https://www.blogger.com/static/v1/widgets/3566091532-css_bundle_v2.css' rel='stylesheet' type='text/css'/> <title> Official Google Webmaster Central Blog: January 2019 </title> <script type='text/javascript'> var newhost = 'https://developers.google.com'; var target_blog_path = '/search/blog' var target_search_path = '/s/results/search/blog/?q=' var pathname = window.location.pathname if (pathname.startsWith('/search/label/')) { pathname = target_search_path.concat(pathname.slice(14)); } else if (pathname.endsWith('.html')) { pathname = target_blog_path.concat(pathname.slice(0, -5)); } else { pathname = target_blog_path; } var redir_target = newhost.concat(pathname); window.location.href = redir_target; </script> <meta content='evCklrdiBeZ3REnk8pXEV6_6iEdNf1ZLgUpwH9XirGg' name='google-site-verification'/> <meta content='width=device-width, height=device-height, minimum-scale=1.0, initial-scale=1.0, user-scalable=0' name='viewport'/> <meta content='IE=Edge' http-equiv='X-UA-Compatible'/> <meta content='Official Google Webmaster Central Blog' property='og:title'/> <meta content='Official news on crawling and indexing sites for the Google index' property='og:description'/> <meta content='en_US' property='og:locale'/> <meta content='https://webmasters.googleblog.com/2019/01/' property='og:url'/> <meta content='Official Google Webmaster Central Blog' property='og:site_name'/> <!-- Twitter Card properties --> <meta content='Official Google Webmaster Central Blog' property='og:title'/> <meta content='Official news on crawling and indexing sites for the Google index' property='twitter:description'/> <meta content='summary' name='twitter:card'/> <meta content='@googlewmc' name='twitter:creator'/> <link href='https://fonts.googleapis.com/css?family=Roboto:400italic,400,500,500italic,700,700italic' rel='stylesheet' type='text/css'/> <link href='https://fonts.googleapis.com/icon?family=Material+Icons' rel='stylesheet'/> <script src='https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js' type='text/javascript'></script> <!-- End --> <style id='page-skin-1' type='text/css'><!-- /* <Group description="Header Color" selector="header"> <Variable name="header.background.color" description="Header Background" type="color" default="#ffffff"/> </Group> */ .header-outer { border-bottom: 1px solid #e0e0e0; background: #ffffff; } html, .Label h2, #sidebar .rss a, .BlogArchive h2, .FollowByEmail h2.title, .widget .post h2 { font-family: Roboto, sans-serif; } .plusfollowers h2.title, .post h2.title, .widget h2.title { font-family: Roboto, sans-serif; } .widget-item-control { height: 100%; } .widget.Header, #header { position: relative; height: 100%; width: 100%; } } .widget.Header .header-logo1 { float: left; margin-right: 15px; padding-right: 15px; border-right: 1px solid #ddd; } .header-title h2 { color: rgba(0,0,0,.54); display: inline-block; font-size: 40px; font-family: Roboto, sans-serif; font-weight: normal; line-height: 48px; vertical-align: top; } .header-inner { background-repeat: no-repeat; background-position: right 0px; } .post-author, .byline-author { font-size: 14px; font-weight: normal; color: #757575; color: rgba(0,0,0,.54); } .post-content .img-border { border: 1px solid rgb(235, 235, 235); padding: 4px; } .header-title a { text-decoration: none !important; } pre { border: 1px solid #bbbbbb; margin-top: 1em 0 0 0; padding: 0.99em; overflow-x: auto; overflow-y: auto; } pre, code { font-size: 9pt; background-color: #fafafa; line-height: 125%; font-family: monospace; } pre, code { color: #060; font: 13px/1.54 "courier new",courier,monospace; } .header-left .header-logo1 { width: 128px !important; } .header-desc { line-height: 20px; margin-top: 8px; } .fb-custom img, .twitter-custom img, .gplus-share img { cursor: pointer; opacity: 0.54; } .fb-custom img:hover, .twitter-custom img:hover, .gplus-share img:hover { opacity: 0.87; } .fb-like { width: 80px; } .post .share { float: right; } #twitter-share{ border: #CCC solid 1px; border-radius: 3px; background-image: -webkit-linear-gradient(top,#ffffff,#dedede); } .twitter-follow { background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgCqNmeVJSIp9EYGk0-d8ScFMrhQri2E5oiIe_wCB-iIf4iefN9xnmLKurx839utT42R76mVmed7FkHd-6nUhw_fEg8XVL_Gn8tamWEtM7QPe7OZcOkWNXN0qSNmnp8qdoYt1KVg/s1600/twitter-bird.png) no-repeat left center; padding-left: 18px; font: normal normal normal 11px/18px 'Helvetica Neue',Arial,sans-serif; font-weight: bold; text-shadow: 0 1px 0 rgba(255,255,255,.5); cursor: pointer; margin-bottom: 10px; } .twitter-fb { padding-top: 2px; } .fb-follow-button { background: -webkit-linear-gradient(#4c69ba, #3b55a0); background: -moz-linear-gradient(#4c69ba, #3b55a0); background: linear-gradient(#4c69ba, #3b55a0); border-radius: 2px; height: 18px; padding: 4px 0 0 3px; width: 57px; border: #4c69ba solid 1px; } .fb-follow-button a { text-decoration: none !important; text-shadow: 0 -1px 0 #354c8c; text-align: center; white-space: nowrap; font-size: 11px; color: white; vertical-align: top; } .fb-follow-button a:visited { color: white; } .fb-follow { padding: 0px 5px 3px 0px; width: 14px; vertical-align: bottom; } .gplus-wrapper { margin-top: 3px; display: inline-block; vertical-align: top; } .twitter-custom, .gplus-share { margin-right: 12px; } .fb-follow-button{ margin: 10px auto; } /** CUSTOM CODE **/ --></style> <style id='template-skin-1' type='text/css'><!-- .header-outer { clear: both; } .header-inner { margin: auto; padding: 0px; } .footer-outer { background: #f5f5f5; clear: both; margin: 0; } .footer-inner { margin: auto; padding: 0px; } .footer-inner-2 { /* Account for right hand column elasticity. */ max-width: calc(100% - 248px); } .google-footer-outer { clear: both; } .cols-wrapper, .google-footer-outer, .footer-inner, .header-inner { max-width: 978px; margin-left: auto; margin-right: auto; } .cols-wrapper { margin: auto; clear: both; margin-top: 60px; margin-bottom: 60px; overflow: hidden; } .col-main-wrapper { float: left; width: 100%; } .col-main { margin-right: 278px; max-width: 660px; } .col-right { float: right; width: 248px; margin-left: -278px; } /* Tweaks for layout mode. */ body#layout .google-footer-outer { display: none; } body#layout .header-outer, body#layout .footer-outer { background: none; } body#layout .header-inner { height: initial; } body#layout .cols-wrapper { margin-top: initial; margin-bottom: initial; } --></style> <!-- start all head --> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='blogger' name='generator'/> <link href='https://webmasters.googleblog.com/favicon.ico' rel='icon' type='image/x-icon'/> <link href='https://webmasters.googleblog.com/2019/01/' rel='canonical'/> <link rel="alternate" type="application/atom+xml" title="Official Google Webmaster Central Blog - Atom" href="https://webmasters.googleblog.com/feeds/posts/default" /> <link rel="alternate" type="application/rss+xml" title="Official Google Webmaster Central Blog - RSS" href="https://webmasters.googleblog.com/feeds/posts/default?alt=rss" /> <link rel="service.post" type="application/atom+xml" title="Official Google Webmaster Central Blog - Atom" href="https://www.blogger.com/feeds/32069983/posts/default" /> <!--Can't find substitution for tag [blog.ieCssRetrofitLinks]--> <meta content='Official news on crawling and indexing sites for the Google index' name='description'/> <meta content='https://webmasters.googleblog.com/2019/01/' property='og:url'/> <meta content='Official Google Webmaster Central Blog' property='og:title'/> <meta content='Official news on crawling and indexing sites for the Google index' property='og:description'/> <!-- end all head --> <base target='_self'/> <style> html { font-family: Roboto, sans-serif; -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; } body { padding: 0; /* This ensures that the scroll bar is always present, which is needed */ /* because content render happens after page load; otherwise the header */ /* would "bounce" in-between states. */ min-height: 150%; } h2 { font-size: 16px; } h1, h2, h3, h4, h5 { line-height: 2em; } html, h4, h5, h6 { font-size: 14px; } a, a:visited { color: #4184F3; text-decoration: none; } a:focus, a:hover, a:active { text-decoration: none; } .Header { margin-top: 15px; } .Header h1 { font-size: 32px; font-weight: 300; line-height: 32px; height: 42px; } .header-inner .Header .titlewrapper { padding: 0; margin-top: 30px; } .header-inner .Header .descriptionwrapper { padding: 0; margin: 0; } .cols-wrapper { margin-top: 56px; } .header-outer, .cols-wrapper, .footer-outer, .google-footer-outer { padding: 0 60px; } .header-inner { height: 256px; position: relative; } html, .header-inner a { color: #212121; color: rgba(0,0,0,.87); } .header-inner .google-logo { display: inline-block; background-size: contain; z-index: 1; height: 46px; overflow: hidden; margin-top: 4px; margin-right: 8px; } .header-left { position: absolute; top: 50%; -webkit-transform: translateY(-50%); transform: translateY(-50%); margin-top: 12px; width: 100%; } .google-logo { margin-left: -4px; } #google-footer { position: relative; font-size: 13px; list-style: none; text-align: right; } #google-footer a { color: #444; } #google-footer ul { margin: 0; padding: 0; height: 144px; line-height: 144px; } #google-footer ul li { display: inline; } #google-footer ul li:before { color: #999; content: "\00b7"; font-weight: bold; margin: 5px; } #google-footer ul li:first-child:before { content: ''; } #google-footer .google-logo-dark { left: 0; margin-top: -16px; position: absolute; top: 50%; } /** Sitemap links. **/ .footer-inner-2 { font-size: 14px; padding-top: 42px; padding-bottom: 74px; } .footer-inner-2 .HTML h2 { color: #212121; color: rgba(0,0,0,.87); font-size: 14px; font-weight: 500; padding-left: 0; margin: 10px 0; } .footer-inner-2 .HTML ul { font-weight: normal; list-style: none; padding-left: 0; } .footer-inner-2 .HTML li { line-height: 24px; padding: 0; } .footer-inner-2 li a { color: rgba(65,132,243,.87); } /** Archive widget. **/ .BlogArchive { font-size: 13px; font-weight: normal; } .BlogArchive .widget-content { display: none; } .BlogArchive h2, .Label h2 { color: #4184F3; text-decoration: none; } .BlogArchive .hierarchy li { display: inline-block; } /* Specificity needed here to override widget CSS defaults. */ .BlogArchive #ArchiveList ul li, .BlogArchive #ArchiveList ul ul li { margin: 0; padding-left: 0; text-indent: 0; } .BlogArchive .intervalToggle { cursor: pointer; } .BlogArchive .expanded .intervalToggle .new-toggle { -ms-transform: rotate(180deg); transform: rotate(180deg); } .BlogArchive .new-toggle { float: right; padding-top: 3px; opacity: 0.87; } #ArchiveList { text-transform: uppercase; } #ArchiveList .expanded > ul:last-child { margin-bottom: 16px; } #ArchiveList .archivedate { width: 100%; } /* Months */ .BlogArchive .items { max-width: 150px; margin-left: -4px; } .BlogArchive .expanded .items { margin-bottom: 10px; overflow: hidden; } .BlogArchive .items > ul { float: left; height: 32px; } .BlogArchive .items a { padding: 0 4px; } .Label { font-size: 13px; font-weight: normal; } .sidebar-icon { display: inline-block; width: 24px; height: 24px; vertical-align: middle; margin-right: 12px; margin-top: -1px } .Label a { margin-right: 4px; } .Label .widget-content { display: none; } .FollowByEmail { font-size: 13px; font-weight: normal; } .FollowByEmail h2 { background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAALCAYAAACZIGYHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAUBJREFUeNrMkSGLAlEUhb+ZB4JFi8mx2cz+ApvhRUGTcUCrNqNJDYIi+DO0GUwmQXDK2DSIoGgZcSaIjDrzwrK4ssvChj1w0733O+fdp+m6PozH4yQSCfb7Pa7r8pOi0SjJZBLP8zgej4gAIMvlMuPxmADIYrHger1+C6lUKmo+NJ/NZojb7SZDWiwWo1qtks1msW2bw+HwZdkwDHq9HvV6nel0SqvVYrvdIh6Ph3Qch+VyqRYLhQJSSjRNw7IsfN9XgGKxSLfbJZfL0e/3aTabrFYr7vc7IujLcOh8PqunrNdr0uk0pVKJVCpFJBJRgEajweVyod1uMxgM2O12BAGUgRbU8DV2JpOhVquRz+cRQii3+XxOp9NRN3jVR5LPOp1OjEYjlSL8hclkgmmabDabt4d+m+S30vkD/R/IU4ABAPTZgnZdmG/PAAAAAElFTkSuQmCC"); background-repeat: no-repeat; background-position: 0 50%; text-indent: 30px; } .FollowByEmail .widget-content { display: none; } .searchBox input { border: 1px solid #eee; color: #212121; color: rgba(0,0,0,.87); font-size: 14px; padding: 8px 8px 8px 40px; width: 164px; font-family: Roboto, sans-serif; background: url("https://www.gstatic.com/images/icons/material/system/1x/search_grey600_24dp.png") 8px center no-repeat; } .searchBox ::-webkit-input-placeholder { /* WebKit, Blink, Edge */ color: rgba(0,0,0,.54); } .searchBox :-moz-placeholder { /* Mozilla Firefox 4 to 18 */ color: #000; opacity: 0.54; } .searchBox ::-moz-placeholder { /* Mozilla Firefox 19+ */ color: #000; opacity: 0.54; } .searchBox :-ms-input-placeholder { /* Internet Explorer 10-11 */ color: #757575; } .widget-item-control { margin-top: 0px; } .section { margin: 0; padding: 0; } #sidebar-top { border: 1px solid #eee; } #sidebar-top > div { margin: 16px 0; } .widget ul { line-height: 1.6; } /*main post*/ .post { margin-bottom:30px; } #main .post .title { margin: 0; } #main .post .title a { color: #212121; color: rgba(0,0,0,.87); font-weight: normal; font-size: 24px; } #main .post .title a:hover { text-decoration:none; color:#4184F3; } .message, #main .post .post-header { margin: 0; padding: 0; } #main .post .post-header .caption, #main .post .post-header .labels-caption, #main .post .post-footer .caption, #main .post .post-footer .labels-caption { color: #444; font-weight: 500; } #main .tr-caption-container td { text-align: left; } #main .post .tr-caption { color: #757575; color: rgba(0,0,0,.54); display: block; max-width: 560px; padding-bottom: 20px; } #main .post .tr-caption-container { line-height: 24px; margin: -1px 0 0 0 !important; padding: 4px 0; text-align: left; } #main .post .post-header .published{ font-size:11px; font-weight:bold; } .post-header .publishdate { font-size: 17px; font-weight:normal; color: #757575; color: rgba(0,0,0,.54); } #main .post .post-footer{ font-size:12px; padding-bottom: 21px; } .label-footer { margin-bottom: 12px; margin-top: 12px; } .comment-img { margin-right: 16px; opacity: 0.54; vertical-align: middle; } #main .post .post-header .published { margin-bottom: 40px; margin-top: -2px; } .post .post-content { color: #212121; color: rgba(0,0,0,.87); font-size: 17px; margin: 25px 0 36px 0; line-height: 32px; } .post-body .post-content ul, .post-body .post-content ol { margin: 16px 0; padding: 0 48px; } .post-summary { display: none; } /* Another old-style caption. */ .post-content div i, .post-content div + i { font-size: 14px; font-style: normal; color: #757575; color: rgba(0,0,0,.54); display: block; line-height: 24px; margin-bottom: 16px; text-align: left; } /* Another old-style caption (with link) */ .post-content a > i { color: #4184F3 !important; } /* Old-style captions for images. */ .post-content .separator + div:not(.separator) { margin-top: -16px; } /* Capture section headers. */ .post-content br + br + b, .post-content .space + .space + b, .post-content .separator + b { display: inline-block; margin-bottom: 8px; margin-top: 24px; } .post-content li { line-height: 32px; } /* Override all post images/videos to left align. */ .post-content .separator, .post-content > div { text-align: left; } .post-content .separator > a, .post-content .separator > span { margin-left: 0 !important; } .post-content img { max-width: 100%; height: auto; width: auto; } .post-content .tr-caption-container img { margin-bottom: 12px; } .post-content iframe, .post-content embed { max-width: 100%; } .post-content .carousel-container { margin-bottom: 48px; } #main .post-content b { font-weight: 500; } /* These are the main paragraph spacing tweaks. */ #main .post-content br { content: ' '; display: block; padding: 4px; } .post-content .space { display: block; height: 8px; } .post-content iframe + .space, .post-content iframe + br { padding: 0 !important; } #main .post .jump-link { margin-bottom:10px; } .post-content img, .post-content iframe { margin: 30px 0 20px 0; } .post-content > img:first-child, .post-content > iframe:first-child { margin-top: 0; } .col-right .section { padding: 0 16px; } #aside { background:#fff; border:1px solid #eee; border-top: 0; } #aside .widget { margin:0; } #aside .widget h2, #ArchiveList .toggle + a.post-count-link { color: #212121; color: rgba(0,0,0,.87); font-weight: 400 !important; margin: 0; } #ArchiveList .toggle { float: right; } #ArchiveList .toggle .material-icons { padding-top: 4px; } #sidebar .tab { cursor: pointer; } #sidebar .tab .arrow { display: inline-block; float: right; } #sidebar .tab .icon { display: inline-block; vertical-align: top; height: 24px; width: 24px; margin-right: 13px; margin-left: -1px; margin-top: 1px; color: #757575; color: rgba(0,0,0,.54); } #sidebar .widget-content > :first-child { padding-top: 8px; } #sidebar .active .tab .arrow { -ms-transform: rotate(180deg); transform: rotate(180deg); } #sidebar .arrow { color: #757575; color: rgba(0,0,0,.54); } #sidebar .widget h2 { font-size: 14px; line-height: 24px; display: inline-block; } #sidebar .widget .BlogArchive { padding-bottom: 8px; } #sidebar .widget { border-bottom: 1px solid #eee; box-shadow: 0px 1px 0 white; margin-bottom: 0; padding: 14px 0; min-height: 20px; } #sidebar .widget:last-child { border-bottom: none; box-shadow: none; margin-bottom: 0; } #sidebar ul { margin: 0; padding: 0; } #sidebar ul li { list-style:none; padding:0; } #sidebar ul li a { line-height: 32px; } #sidebar .archive { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAYCAYAAADzoH0MAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAE1JREFUeNpiNDY23s9AAWBioBCwYBM8c+YMVsUmJibEGYBNMS5DaeMFfDYSZQA2v9I3FrB5AZeriI4FmnrBccCT8mhmGs1MwyAzAQQYAKEWG9zm9QFEAAAAAElFTkSuQmCC"); height: 24px; line-height: 24px; padding-left: 30px; } #sidebar .labels { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAUxJREFUeNpiNDY23s9AAMycOfM7UF05kHkZmzwTMkdSUhKrIcXFxZy3bt3qBjIN8RrS09PDsHnzZjCNDr58+cKQlpbGDjSoHcg1w2oIyAUODg5gARCNzUVIBrUCuVYYhjx//pzhwIEDYAEQDeJjA1CDWIAGNQK59jBxRuSABbkAlwHIgIeHh2HWrFn/1NTU2oDcvSgBS4wBSC5iArqoCsj1YGIgEyAZVMoEchqlBjEB/cZAiUHg2AEGznpKDAImxOeM////B4VLKtBvEUCngZ1ILKivr3/u6+ubBzJAGZQ9gC5aQoqLgAY8BhkAZL4BuQQkxgXE34A4BuiiZEIuAhrwEGhAEZD5DpzYoIaA2UAM4kQADUrHZRDUgAIg8wO2XAwzbQXQa5OweQ1owB10AyA6gS7BgX1u3ry5397eHow3bdo0EyjGi00tQIABANPgyAH1q1eaAAAAAElFTkSuQmCC"); height: 20px; line-height: 20px; padding-left: 30px; } #sidebar .rss a { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAX5JREFUeNqsVDGSgkAQHL2rIiIikohIc/EBRkbwAIwuwgfwAXiAD9AHSI7kEkECRCb6AIyINDLx7K0aa6kT7uq0q7YYtnZ7umdnt7darXbr9Zpegeu61DNNc0dvwCcH4/GYJpMJnc9nOhwOVJbl/4hAAokMECZJQtvt9k+kH7qufyEYDAakqqqYxFdRFBqNRmTbNg2HQ0rTlK7XayvR0xqBdDqdkuM4dE/0ULhYLOh4PHYrknG5XGi/31MYhuL/nkwonM1mlGUZ1XXdrsiyLGEDhY7juJEZ1u5tIixDGdYhmYw+B7CAzPP5nDabjdgIAgCksMX1832/3drtdqPT6SQWapomiGEFNkDEdpDMMAzK81ys/7XYy+XyoQgq2WoURSIJ2iIIgp/WZCCTvFm2wgeAU31aI3Q2GhIDMeB53qPYPIcm5VrxXIOIOxsDMStjVawAc1VViRgN22lNBiuQN3GR+SY07hpOoStmFQAKXRRFY93bnpG+fONfedi+BRgAbkS8Fxp7QQIAAAAASUVORK5CYII="); } #sidebar .subscription a { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAALCAYAAACZIGYHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAUBJREFUeNrMkSGLAlEUhb+ZB4JFi8mx2cz+ApvhRUGTcUCrNqNJDYIi+DO0GUwmQXDK2DSIoGgZcSaIjDrzwrK4ssvChj1w0733O+fdp+m6PozH4yQSCfb7Pa7r8pOi0SjJZBLP8zgej4gAIMvlMuPxmADIYrHger1+C6lUKmo+NJ/NZojb7SZDWiwWo1qtks1msW2bw+HwZdkwDHq9HvV6nel0SqvVYrvdIh6Ph3Qch+VyqRYLhQJSSjRNw7IsfN9XgGKxSLfbJZfL0e/3aTabrFYr7vc7IujLcOh8PqunrNdr0uk0pVKJVCpFJBJRgEajweVyod1uMxgM2O12BAGUgRbU8DV2JpOhVquRz+cRQii3+XxOp9NRN3jVR5LPOp1OjEYjlSL8hclkgmmabDabt4d+m+S30vkD/R/IU4ABAPTZgnZdmG/PAAAAAElFTkSuQmCC"); } #sidebar-bottom { background: #f5f5f5; border-top:1px solid #eee; } #sidebar-bottom .widget { border-bottom: 1px solid #e0e0e0; padding: 15px 0; text-align: center; } #sidebar-bottom > div:last-child { border-bottom: 0; } #sidebar-bottom .text { line-height: 20px; } /* Home, forward, and backward pagination. */ .blog-pager { border-top : 1px #e0e0e0 solid; padding-top: 10px; margin-top: 15px; text-align: right !important; } #blog-pager { margin-botom: 0; margin-top: -14px; padding: 16px 0 0 0; } #blog-pager a { display: inline-block; } .blog-pager i.disabled { opacity: 0.2 !important; } .blog-pager i { color: black; margin-left: 16px; opacity: 0.54; } .blog-pager i:hover, .blog-pager i:active { opacity: 0.87; } #blog-pager-older-link, #blog-pager-newer-link { float: none; } .gplus-profile { background-color: #fafafa; border: 1px solid #eee; overflow: hidden; width: 212px; } .gplus-profile-inner { margin-left: -1px; margin-top: -1px; } /* Sidebar follow buttons. */ .followgooglewrapper { padding: 12px 0 0 0; } .loading { visibility: hidden; } .detail-page .post-footer .cmt_iframe_holder { padding-top: 40px !important; } /** Desktop **/ @media (max-width: 900px) { .col-right { display: none; } .col-main { margin-right: 0; min-width: initial; } .footer-outer { display: none; } .cols-wrapper { min-width: initial; } .google-footer-outer { background-color: #f5f5f5; } } /** Tablet **/ @media (max-width: 712px) { .header-outer, .cols-wrapper, .footer-outer, .google-footer-outer { padding: 0 40px; } } /* An extra breakpoint accommodating for long blog titles. */ @media (max-width: 600px) { .header-left { height: 100%; top: inherit; margin-top: 0; -webkit-transform: initial; transform: initial; } .header-title { margin-top: 18px; } .header-inner .google-logo { height: 40px; margin-top: 3px; } .header-inner .google-logo img { height: 42px; } .header-title h2 { font-size: 32px; line-height: 40px; } .header-desc { bottom: 24px; position: absolute; } } /** Mobile/small desktop window; also landscape. **/ @media (max-width: 480px), (max-height: 480px) { .header-outer, .cols-wrapper, .footer-outer, .google-footer-outer { padding: 0 16px; } .cols-wrapper { margin-top: 0; } .post-header .publishdate, .post .post-content { font-size: 16px; } .post .post-content { line-height: 28px; margin-bottom: 30px; } .post { margin-top: 30px; } .byline-author { display: block; font-size: 12px; line-height: 24px; margin-top: 6px; } #main .post .title a { font-weight: 500; color: #4c4c4c; color: rgba(0,0,0,.70); } #main .post .post-header { padding-bottom: 12px; } #main .post .post-header .published { margin-bottom: -8px; margin-top: 3px; } .post .read-more { display: block; margin-top: 14px; } .post .tr-caption { font-size: 12px; } #main .post .title a { font-size: 20px; line-height: 30px; } .post-content iframe { /* iframe won't keep aspect ratio when scaled down. */ max-height: 240px; } .post-content .separator img, .post-content .tr-caption-container img, .post-content iframe { margin-left: -16px; max-width: inherit; width: calc(100% + 32px); } .post-content table, .post-content td { width: 100%; } #blog-pager { margin: 0; padding: 16px 0; } /** List page tweaks. **/ .list-page .post-original { display: none; } .list-page .post-summary { display: block; } .list-page .comment-container { display: none; } .list-page #blog-pager { padding-top: 0; border: 0; margin-top: -8px; } .list-page .label-footer { display: none; } .list-page #main .post .post-footer { border-bottom: 1px solid #eee; margin: -16px 0 0 0; padding: 0 0 20px 0; } .list-page .post .share { display: none; } /** Detail page tweaks. **/ .detail-page .post-footer .cmt_iframe_holder { padding-top: 32px !important; } .detail-page .label-footer { margin-bottom: 0; } .detail-page #main .post .post-footer { padding-bottom: 0; } .detail-page #comments { display: none; } } [data-about-pullquote], [data-is-preview], [data-about-syndication] { display: none; } </style> <noscript> <style> .loading { visibility: visible }</style> </noscript> <script type='text/javascript'> (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); ga('create', 'UA-18009-4', 'auto', 'blogger'); ga('blogger.send', 'pageview'); </script> <link href='https://www.blogger.com/dyn-css/authorization.css?targetBlogID=32069983&amp;zx=3f8a6738-5406-40b0-8cd8-0b94d8cd2f84' media='none' onload='if(media!=&#39;all&#39;)media=&#39;all&#39;' rel='stylesheet'/><noscript><link href='https://www.blogger.com/dyn-css/authorization.css?targetBlogID=32069983&amp;zx=3f8a6738-5406-40b0-8cd8-0b94d8cd2f84' rel='stylesheet'/></noscript> <meta name='google-adsense-platform-account' content='ca-host-pub-1556223355139109'/> <meta name='google-adsense-platform-domain' content='blogspot.com'/> </head> <body> <script type='text/javascript'> //<![CDATA[ var axel = Math.random() + ""; var a = axel * 10000000000000; document.write('<iframe src="https://2542116.fls.doubleclick.net/activityi;src=2542116;type=gblog;cat=googl0;ord=ord=' + a + '?" width="1" height="1" frameborder="0" style="display:none"></iframe>'); //]]> </script> <noscript> <img alt='' height='1' src='https://ad.doubleclick.net/ddm/activity/src=2542116;type=gblog;cat=googl0;ord=1?' width='1'/> </noscript> <!-- Header --> <div class='header-outer'> <div class='header-inner'> <div class='section' id='header'><div class='widget Header' data-version='1' id='Header1'> <div class='header-left'> <div class='header-title'> <a class='google-logo' href='https://webmasters.googleblog.com/?hl=en'> <img height='50' src='https://www.gstatic.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png'/> </a> <a href='/'> <h2> Webmaster Central Blog </h2> </a> </div> <div class='header-desc'> Official news on crawling and indexing sites for the Google index </div> </div> </div></div> </div> </div> <!-- all content wrapper start --> <div class='cols-wrapper loading'> <div class='col-main-wrapper'> <div class='col-main'> <div class='section' id='main'><div class='widget Blog' data-version='1' id='Blog1'> <div class='post' data-id='4484886283393310278' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='https://webmasters.googleblog.com/2019/01/dynamic-rendering-with-rendertron.html?hl=en' itemprop='url' title='Dynamic Rendering with Rendertron'> Dynamic Rendering with Rendertron </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Thursday, January 31, 2019 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <div dir="ltr" style="text-align: left;" trbidi="on"> Many frontend frameworks rely on JavaScript to show content. This can mean Google might take some time to index your content or update the indexed content. <br /> <a href="https://www.youtube.com/watch?v=PFwUbgvpdaQ">A workaround we discussed at Google I/O</a> this year is <a href="https://developers.google.com/search/docs/guides/dynamic-rendering">dynamic rendering</a>. There are many ways to implement this. This blog post shows an example implementation of dynamic rendering using Rendertron, which is an open source solution based on headless Chromium.<br /> <h3> Which sites should consider dynamic rendering?</h3> Not all search engines or social media bots visiting your website can run JavaScript. Googlebot might take time to run your JavaScript and has <a href="https://developers.google.com/search/docs/guides/rendering">some limitations</a>, for example. <br /> Dynamic rendering is useful for content that changes often and needs JavaScript to display. Your site's user experience (especially the time to <a href="https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint">first meaningful paint</a>) may benefit from considering hybrid rendering (for example, <a href="https://angular.io/guide/universal" rel="nofollow">Angular Universal</a>). <br /> <h3> How does dynamic rendering work?</h3> <a href="https://developers.google.com/search/docs/guides/images/how-dynamic-rendering-works.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="215" data-original-width="800" height="106" src="https://developers.google.com/search/docs/guides/images/how-dynamic-rendering-works.png" width="400" /></a> <a href="https://developers.google.com/search/docs/guides/dynamic-rendering">Dynamic rendering</a> means switching between client-side rendered and pre-rendered content for specific user agents. <br /> You will need a renderer to execute the JavaScript and produce static HTML. Rendertron is an open source project that uses <a href="https://developers.google.com/web/updates/2017/04/headless-chrome">headless Chromium</a> to render. Single Page Apps often load data in the background or defer work to render their content. Rendertron has mechanisms to determine when a website has completed rendering. It waits until all network requests have finished and there is no outstanding work. <br /> <br /> This post covers: <br /> <ol style="text-align: left;"> <li>Take a look at a sample web app</li> <li>Set up a small express.js server to serve the web app</li> <li>Install and configure Rendertron as a middleware for dynamic rendering</li> </ol> <h3> The sample web app</h3> <a href="https://kitten-corner.glitch.me/" rel="nofollow">The &#8220;kitten corner&#8221; web app</a> uses JavaScript to load a variety of cat images from an API and displays them in a grid. <br /> <table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody> <tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/dIYa8bXkTFOwgm8eRCFOblqiZeRD1dcb7nUeLd2NMFehZFT_kiRus6u71jS-Vb1WCcPiOurWtsnCFzoWt_NtpNZDQ_9W-jZzgtmmYqh3jJuovmVKiO5rASJ-1OlEipqYaboXdQLy" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1087" data-original-width="1600" height="271" src="https://1.bp.blogspot.com/dIYa8bXkTFOwgm8eRCFOblqiZeRD1dcb7nUeLd2NMFehZFT_kiRus6u71jS-Vb1WCcPiOurWtsnCFzoWt_NtpNZDQ_9W-jZzgtmmYqh3jJuovmVKiO5rASJ-1OlEipqYaboXdQLy" width="400" /></a></td></tr> <tr><td class="tr-caption" style="text-align: center;">Cute cat images in a grid and a button to show more - this web app truly has it all! <br /> <span style="text-align: left;">Here is the JavaScript:</span></td></tr> </tbody></table> <span id="docs-internal-guid-49bf4ac8-7fff-e932-d45b-78bbf2e263ef"></span><br /> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-top: 0pt;"> <span id="docs-internal-guid-49bf4ac8-7fff-e932-d45b-78bbf2e263ef"><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"><br /> &nbsp;&nbsp;</span><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">const</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">apiUrl</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> = </span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">'https://api.thecatapi.com/v1/images/search?limit=50'</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">;</span></span></div> <span id="docs-internal-guid-49bf4ac8-7fff-e932-d45b-78bbf2e263ef"> </span> <br /> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;</span><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">const</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">tpl</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> = </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">document</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">querySelector</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">'template'</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">).</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">content</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">;</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;</span><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">const</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">container</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> = </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">document</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">querySelector</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">'ul'</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">);</span></div> <br /> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;</span><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">function</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">init</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> () {</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">fetch</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">apiUrl</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">)</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">then</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">response</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">=&gt;</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">response</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">json</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">())</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">then</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">cats</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">=&gt;</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> {</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">container</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">innerHTML</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> = </span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">''</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">;</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">cats</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">map</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">cat</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">=&gt;</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> {</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">const</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">li</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> = </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">document</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">importNode</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">tpl</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">, </span><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">true</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">);</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">li</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">querySelector</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">'img'</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">).</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">src</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> = </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">cat</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">url</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">;</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #af00db; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">return</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">li</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">;</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}).</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">forEach</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">li</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">=&gt;</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">container</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">appendChild</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">li</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">));</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;&nbsp;&nbsp;})</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;}</span></div> <br /> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">init</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">();</span></div> <br /> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">document</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">querySelector</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">'button'</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">).</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">addEventListener</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">'click'</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">, </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">init</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">);</span></div> <div> <br /></div> <div> The web app uses modern JavaScript (ES6), which <a href="https://developers.google.com/search/docs/guides/rendering">isn't supported in Googlebot yet</a>. We can use the <a href="https://g.co/mobile-friendly">mobile-friendly test</a> to check if Googlebot can see the content:</div> <table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody> <tr><td style="text-align: center;"><a href="https://4.bp.blogspot.com/2OM7ftN_N2q91cZT616ZXKtI84t2VPwU1Y9dRyWDX97g-uebUE-GdUBhyiuVNY5erRK9X5HIdSryl0fv68l9-j2IJgiJmVMwxjiMB41yyRDgSGyB4NWEg3WzmySWzb-cxu5trjjS" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1087" data-original-width="1600" height="271" src="https://4.bp.blogspot.com/2OM7ftN_N2q91cZT616ZXKtI84t2VPwU1Y9dRyWDX97g-uebUE-GdUBhyiuVNY5erRK9X5HIdSryl0fv68l9-j2IJgiJmVMwxjiMB41yyRDgSGyB4NWEg3WzmySWzb-cxu5trjjS" width="400" /></a></td></tr> <tr><td class="tr-caption">The mobile-friendly test shows that the page is mobile-friendly, but the screenshot is missing all the cats! The headline and button appear but none of the cat pictures are there.</td></tr> </tbody></table> <div> While this problem is simple to fix, it's a good exercise to learn how to setup dynamic rendering. Dynamic rendering will allow Googlebot to see the cat pictures without changes to the web app code.</div> <div> <h3 style="text-align: left;"> Set up the server</h3> <div> To serve the web application, let's use <a href="https://expressjs.com/" rel="nofollow">express</a>, a node.js library, to build web servers.</div> <div> The server code looks like this (find the <a href="https://glitch.com/edit/#!/kitten-corner?path=server.js:1:1" rel="nofollow">full project source code</a> here):</div> </div> <div> <span id="docs-internal-guid-955b5506-7fff-6a06-02f0-bbee3095293c"></span><br /> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span id="docs-internal-guid-955b5506-7fff-6a06-02f0-bbee3095293c"><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">const</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">express</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> = </span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">require</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">'express'</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">);</span></span></div> <span id="docs-internal-guid-955b5506-7fff-6a06-02f0-bbee3095293c"> </span> <br /> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">const</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">app</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> = </span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">express</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">();</span></div> <br /> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">const</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">DIST_FOLDER</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> = </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">process</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">cwd</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">() + </span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">'/docs'</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">;</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">const</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">PORT</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> = </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">process</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">env</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">PORT</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> || </span><span style="color: #09885a; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">8080</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">;</span></div> <br /> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span style="color: green; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">// Serve static assets (images, css, etc.)</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">app</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">get</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">'*.*'</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">, </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">express</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">static</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">DIST_FOLDER</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">));</span></div> <br /> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span style="color: green; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">// Point all other URLs to index.html for our single page app</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">app</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">get</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">'*'</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">, (</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">req</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">, </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">res</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">) </span><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">=&gt;</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> {</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">res</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">sendFile</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">DIST_FOLDER</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> + </span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">'/index.html'</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">);</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">});</span></div> <br /> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span style="color: green; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">// Start Express Server</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">app</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">listen</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">PORT</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">, () </span><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">=&gt;</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> {</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;</span><span style="color: #267f99; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">console</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">log</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">`Node Express server listening on http://localhost:</span><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">${</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">PORT</span><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">}</span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> from </span><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">${</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">DIST_FOLDER</span><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">}</span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">`</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">);</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">});</span></div> <div> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div> <div> You can <a href="https://kitten-corner.glitch.me/" rel="nofollow">try the live example here</a> - you should see a bunch of cat pictures, if you are using a modern browser. To run the project from your computer, you need <a href="https://nodejs.org/en/" rel="nofollow">node.js</a> to run the following commands: <span style="font-family: &quot;courier new&quot;;"><span style="font-size: 14px; white-space: pre-wrap;"> </span></span></div> <div> <span style="font-family: &quot;courier new&quot;;"><span style="font-size: 14px; white-space: pre-wrap;"> npm install --save express rendertron-middleware node server.js </span></span></div> <div> Then point your browser to <a href="http://localhost:8080/">http://localhost:8080</a>. Now it&#8217;s time to set up dynamic rendering. <br /> <h3 style="text-align: left;"> Deploy a Rendertron instance</h3> Rendertron runs a server that takes a URL and returns static HTML for the URL by using headless Chromium. We'll follow <a href="https://github.com/GoogleChrome/rendertron#deploying-to-google-cloud-platform" rel="nofollow">the recommendation from the Rendertron project</a> and use <a href="https://console.cloud.google.com/">Google Cloud Platform</a>.</div> <table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody> <tr><td style="text-align: center;"><a href="https://4.bp.blogspot.com/_UOqxVtYffYz0NvJAXjwOLbouiNoPaJENqZXjdW7Velg4AD8rnOB_0Bczu2Vyjxz3GnqTrTdpyAnkUKJp_r714NtmnneodB5atakrjfqF7tSrV_oB0yUYa2bbMynUuBp_d5sVJLl" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="948" data-original-width="1114" height="340" src="https://4.bp.blogspot.com/_UOqxVtYffYz0NvJAXjwOLbouiNoPaJENqZXjdW7Velg4AD8rnOB_0Bczu2Vyjxz3GnqTrTdpyAnkUKJp_r714NtmnneodB5atakrjfqF7tSrV_oB0yUYa2bbMynUuBp_d5sVJLl" width="400" /></a></td></tr> <tr><td class="tr-caption">The form to create a new Google Cloud Platform project.</td></tr> </tbody></table> <div> <div> Please note that you can get started with <a href="https://cloud.google.com/free/docs/always-free-usage-limits">the free usage tier</a>, using this setup in production may incur costs according to the <a href="https://cloud.google.com/pricing/">Google Cloud Platform pricing</a>.</div> <div> <ol style="text-align: left;"> <li><span id="docs-internal-guid-49bf4ac8-7fff-e932-d45b-78bbf2e263ef"><div> <span id="docs-internal-guid-955b5506-7fff-6a06-02f0-bbee3095293c"></span><br /> <div> <div> <span id="docs-internal-guid-955b5506-7fff-6a06-02f0-bbee3095293c">Create a new project in the <a href="https://console.cloud.google.com/">Google Cloud console</a>. Take note of the &#8220;Project ID&#8221; below the input field.</span></div> </div> <span id="docs-internal-guid-955b5506-7fff-6a06-02f0-bbee3095293c"> </span></div> </span></li> <li><span id="docs-internal-guid-49bf4ac8-7fff-e932-d45b-78bbf2e263ef"><div> <span id="docs-internal-guid-955b5506-7fff-6a06-02f0-bbee3095293c"></span><br /> <div> <div> <span id="docs-internal-guid-955b5506-7fff-6a06-02f0-bbee3095293c">Install the <a href="https://cloud.google.com/sdk/docs/quickstarts">Google Cloud SDK as described in the documentation</a> and log in.</span></div> </div> <span id="docs-internal-guid-955b5506-7fff-6a06-02f0-bbee3095293c"> </span></div> </span></li> <li><span id="docs-internal-guid-49bf4ac8-7fff-e932-d45b-78bbf2e263ef"><span id="docs-internal-guid-955b5506-7fff-6a06-02f0-bbee3095293c">Clone the Rendertron repository from GitHub with:<br /><blockquote style="border: none; margin: 0 0 0 40px; padding: 0px;"> <span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">git clone https://github.com/GoogleChrome/rendertron.git&nbsp;</span></blockquote> <blockquote style="border: none; margin: 0 0 0 40px; padding: 0px;"> <span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">cd rendertron</span>&nbsp;</blockquote> </span></span></li> <li><span id="docs-internal-guid-49bf4ac8-7fff-e932-d45b-78bbf2e263ef"><span id="docs-internal-guid-955b5506-7fff-6a06-02f0-bbee3095293c">Run the following commands to install dependencies and build Rendertron on your computer:<br /><blockquote style="border: none; margin: 0 0 0 40px; padding: 0px;"> <span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">npm install &amp;&amp; npm run build</span></blockquote> </span></span></li> <li><span id="docs-internal-guid-49bf4ac8-7fff-e932-d45b-78bbf2e263ef"><span id="docs-internal-guid-955b5506-7fff-6a06-02f0-bbee3095293c">Enable Rendertron&#8217;s cache by creating a new file called config.json in the rendertron directory with the following content:<br /><blockquote style="border: none; margin: 0 0 0 40px; padding: 0px;"> <span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">{ "datastoreCache": true }</span></blockquote> </span></span></li> <li><span id="docs-internal-guid-49bf4ac8-7fff-e932-d45b-78bbf2e263ef"><span id="docs-internal-guid-955b5506-7fff-6a06-02f0-bbee3095293c">Run the following command from the rendertron directory. Substitute YOUR_PROJECT_ID with your project ID from step 1.<br /><blockquote style="border: none; margin: 0 0 0 40px; padding: 0px;"> <span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">gcloud app deploy app.yaml --project YOUR_PROJECT_ID</span></blockquote> </span></span></li> <li><span id="docs-internal-guid-49bf4ac8-7fff-e932-d45b-78bbf2e263ef"><div> <span id="docs-internal-guid-955b5506-7fff-6a06-02f0-bbee3095293c"></span><br /> <div> <div> <span id="docs-internal-guid-955b5506-7fff-6a06-02f0-bbee3095293c">Select a region of your choice and confirm the deployment. Wait for it to finish.</span></div> </div> <span id="docs-internal-guid-955b5506-7fff-6a06-02f0-bbee3095293c"> </span></div> </span></li> <li><span id="docs-internal-guid-49bf4ac8-7fff-e932-d45b-78bbf2e263ef"><div> <span id="docs-internal-guid-955b5506-7fff-6a06-02f0-bbee3095293c"></span><br /> <div> <div> <span id="docs-internal-guid-955b5506-7fff-6a06-02f0-bbee3095293c">Enter the URL YOUR_PROJECT_ID.appspot.com (substitute YOUR_PROJECT_ID for your actual project ID from step 1 in your browser. You should see Rendertron&#8217;s interface with an input field and a few buttons.</span></div> </div> <span id="docs-internal-guid-955b5506-7fff-6a06-02f0-bbee3095293c"> </span></div> </span></li> </ol> </div> </div> <table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody> <tr><td style="text-align: center;"><a href="https://4.bp.blogspot.com/fx7Es-jvM6G20PtNlkpZtoNEbflUMxM2BLlD0WZyCHYpwC5rq5-HVY4uud3bZA-AYF2uqY3N1NorRq9_MMCT2dRBN4_-UddM2WDF86W95u1z9Hll_czRwJhl4fMS3wDbA0WeyrxF" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1250" data-original-width="1454" height="343" src="https://4.bp.blogspot.com/fx7Es-jvM6G20PtNlkpZtoNEbflUMxM2BLlD0WZyCHYpwC5rq5-HVY4uud3bZA-AYF2uqY3N1NorRq9_MMCT2dRBN4_-UddM2WDF86W95u1z9Hll_czRwJhl4fMS3wDbA0WeyrxF" width="400" /></a></td></tr> <tr><td class="tr-caption" style="text-align: center;">Rendertron&#8217;s UI after deploying to Google Cloud Platform</td></tr> </tbody></table> <div> <div> When you see the Rendertron web interface, you have successfully deployed your own Rendertron instance. Take note of your project&#8217;s URL (YOUR_PROJECT_ID.appspot.com) as you will need it in the next part of the process.</div> </div> <div> <h3 style="text-align: left;"> Add Rendertron to the server</h3> <div> The web server is using express.js and Rendertron has an express.js middleware. Run the following command in the directory of the server.js file:</div> <div> <br /></div> <div> <span style="white-space: pre;"> </span><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">npm install --save rendertron-middleware</span></div> <div> <br /></div> <div> This command installs the rendertron-middleware from npm so we can add it to the server:</div> </div> <div> <span id="docs-internal-guid-b92b81d2-7fff-7db3-aad0-fe97905f4200"></span><br /> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span id="docs-internal-guid-b92b81d2-7fff-7db3-aad0-fe97905f4200"><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">const</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">express</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> = </span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">require</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">'express'</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">);</span></span></div> <span id="docs-internal-guid-b92b81d2-7fff-7db3-aad0-fe97905f4200"> </span> <br /> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span id="docs-internal-guid-b92b81d2-7fff-7db3-aad0-fe97905f4200"><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">const</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">app</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> = </span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">express</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">();</span></span></div> <span id="docs-internal-guid-b92b81d2-7fff-7db3-aad0-fe97905f4200"> </span> <br /> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span id="docs-internal-guid-b92b81d2-7fff-7db3-aad0-fe97905f4200"><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">const</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">rendertron</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> = </span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">require</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">'rendertron-middleware'</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">);</span></span></div> <span id="docs-internal-guid-b92b81d2-7fff-7db3-aad0-fe97905f4200"> </span><br /> <h3 style="text-align: left;"> <span id="docs-internal-guid-b92b81d2-7fff-7db3-aad0-fe97905f4200"> Configure the bot list</span></h3> <span id="docs-internal-guid-b92b81d2-7fff-7db3-aad0-fe97905f4200"> <div> Rendertron uses the user-agent HTTP header to determine if a request comes from a bot or a user&#8217;s browser. It has a <a href="https://github.com/GoogleChrome/rendertron/blob/30446bd7caae87de9fcd8c8263b588c350130852/middleware/src/middleware.ts#L24-L41" rel="nofollow">well-maintained list of bot user agents</a> to compare with. By default this list does not include Googlebot, because Googlebot can execute JavaScript. To make Rendertron render Googlebot requests as well, add Googlebot to the list of user agents:</div> <div> <span id="docs-internal-guid-15720cef-7fff-0595-29dd-1bcec64bb1e7"></span><br /> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span id="docs-internal-guid-15720cef-7fff-0595-29dd-1bcec64bb1e7"><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">const</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">BOTS</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> = </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">rendertron</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">botUserAgents</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">concat</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">'googlebot'</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">);</span></span></div> <span id="docs-internal-guid-15720cef-7fff-0595-29dd-1bcec64bb1e7"> </span> <br /> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span id="docs-internal-guid-15720cef-7fff-0595-29dd-1bcec64bb1e7"><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">const</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">BOT_UA_PATTERN</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> = </span><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">new</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #267f99; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">RegExp</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">BOTS</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">join</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">'|'</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">), </span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">'i'</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">);</span></span></div> <span id="docs-internal-guid-15720cef-7fff-0595-29dd-1bcec64bb1e7"> </span></div> <div> <br /></div> <div> Rendertron compares the user-agent header against this regular expression later.</div> <h3 style="text-align: left;"> Add the middleware</h3> <div> To send bot requests to the Rendertron instance, we need to add the middleware to our express.js server. The middleware checks the requesting user agent and forwards requests from known bots to the Rendertron instance. Add the following code to server.js and don&#8217;t forget to substitute &#8220;YOUR_PROJECT_ID&#8221; with your Google Cloud Platform project ID:</div> <div> <span id="docs-internal-guid-f875fb12-7fff-a3c5-3c8a-0260047ee9ef"></span><br /> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span id="docs-internal-guid-f875fb12-7fff-a3c5-3c8a-0260047ee9ef"><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">app</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">use</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">rendertron</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">makeMiddleware</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">({</span></span></div> <span id="docs-internal-guid-f875fb12-7fff-a3c5-3c8a-0260047ee9ef"> </span> <br /> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span id="docs-internal-guid-f875fb12-7fff-a3c5-3c8a-0260047ee9ef"><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">proxyUrl:</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">'https://YOUR_PROJECT_ID.appspot.com/render'</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">,</span></span></div> <span id="docs-internal-guid-f875fb12-7fff-a3c5-3c8a-0260047ee9ef"> </span> <br /> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span id="docs-internal-guid-f875fb12-7fff-a3c5-3c8a-0260047ee9ef"><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">userAgentPattern:</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">BOT_UA_PATTERN</span></span></div> <span id="docs-internal-guid-f875fb12-7fff-a3c5-3c8a-0260047ee9ef"> </span> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span id="docs-internal-guid-f875fb12-7fff-a3c5-3c8a-0260047ee9ef"><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">}));</span></span></div> <span id="docs-internal-guid-f875fb12-7fff-a3c5-3c8a-0260047ee9ef"> </span></div> <div> <br /></div> <div> Bots requesting the sample website receive the static HTML from Rendertron, so the bots don&#8217;t need to run JavaScript to display the content.</div> <h3 style="text-align: left;"> Testing our setup</h3> <div> To test if the Rendertron setup was successful, run the mobile-friendly test again.</div> <div class="separator" style="clear: both; text-align: center;"> <a href="https://2.bp.blogspot.com/JU7pTGkt2YbjBAQvNjwCVF2_m3gkwwtah3H3Gh0WQsPvcxvgO_7KE1ycx_AnoZAfq8Y8ITCVC2qnk-gENpCaxe5BTSwF7JZ0vDl3jhkM88klwDR6GqHduPPohyQrfixHxgUIH3Wb" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1209" data-original-width="1600" height="301" src="https://2.bp.blogspot.com/JU7pTGkt2YbjBAQvNjwCVF2_m3gkwwtah3H3Gh0WQsPvcxvgO_7KE1ycx_AnoZAfq8Y8ITCVC2qnk-gENpCaxe5BTSwF7JZ0vDl3jhkM88klwDR6GqHduPPohyQrfixHxgUIH3Wb" width="400" /></a></div> <div> <div> Unlike the first test, the cat pictures are visible. In the HTML tab we can see all HTML the JavaScript code generated and that Rendertron has removed the need for JavaScript to display the content.</div> </div> <div> <h3 style="text-align: left;"> Conclusion</h3> <div> You created a dynamic rendering setup without making any changes to the web app. With these changes, you can serve a static HTML version of the web app to crawlers.</div> </div> <div> <br /></div> <div> <span class="byline-author">Posted by Martin Splitt, Open Web Unicorn</span></div> </span></div> </div> </div> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <div dir="ltr" style="text-align: left;" trbidi="on"> Many frontend frameworks rely on JavaScript to show content. This can mean Google might take some time to index your content or update the indexed content. <br /> <a href="https://www.youtube.com/watch?v=PFwUbgvpdaQ">A workaround we discussed at Google I/O</a> this year is <a href="https://developers.google.com/search/docs/guides/dynamic-rendering">dynamic rendering</a>. There are many ways to implement this. This blog post shows an example implementation of dynamic rendering using Rendertron, which is an open source solution based on headless Chromium.<br /> <h3> Which sites should consider dynamic rendering?</h3> Not all search engines or social media bots visiting your website can run JavaScript. Googlebot might take time to run your JavaScript and has <a href="https://developers.google.com/search/docs/guides/rendering">some limitations</a>, for example. <br /> Dynamic rendering is useful for content that changes often and needs JavaScript to display. Your site's user experience (especially the time to <a href="https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint">first meaningful paint</a>) may benefit from considering hybrid rendering (for example, <a href="https://angular.io/guide/universal" rel="nofollow">Angular Universal</a>). <br /> <h3> How does dynamic rendering work?</h3> <a href="https://developers.google.com/search/docs/guides/images/how-dynamic-rendering-works.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="215" data-original-width="800" height="106" src="https://developers.google.com/search/docs/guides/images/how-dynamic-rendering-works.png" width="400" /></a> <a href="https://developers.google.com/search/docs/guides/dynamic-rendering">Dynamic rendering</a> means switching between client-side rendered and pre-rendered content for specific user agents. <br /> You will need a renderer to execute the JavaScript and produce static HTML. Rendertron is an open source project that uses <a href="https://developers.google.com/web/updates/2017/04/headless-chrome">headless Chromium</a> to render. Single Page Apps often load data in the background or defer work to render their content. Rendertron has mechanisms to determine when a website has completed rendering. It waits until all network requests have finished and there is no outstanding work. <br /> <br /> This post covers: <br /> <ol style="text-align: left;"> <li>Take a look at a sample web app</li> <li>Set up a small express.js server to serve the web app</li> <li>Install and configure Rendertron as a middleware for dynamic rendering</li> </ol> <h3> The sample web app</h3> <a href="https://kitten-corner.glitch.me/" rel="nofollow">The &#8220;kitten corner&#8221; web app</a> uses JavaScript to load a variety of cat images from an API and displays them in a grid. <br /> <table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody> <tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/dIYa8bXkTFOwgm8eRCFOblqiZeRD1dcb7nUeLd2NMFehZFT_kiRus6u71jS-Vb1WCcPiOurWtsnCFzoWt_NtpNZDQ_9W-jZzgtmmYqh3jJuovmVKiO5rASJ-1OlEipqYaboXdQLy" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1087" data-original-width="1600" height="271" src="https://1.bp.blogspot.com/dIYa8bXkTFOwgm8eRCFOblqiZeRD1dcb7nUeLd2NMFehZFT_kiRus6u71jS-Vb1WCcPiOurWtsnCFzoWt_NtpNZDQ_9W-jZzgtmmYqh3jJuovmVKiO5rASJ-1OlEipqYaboXdQLy" width="400" /></a></td></tr> <tr><td class="tr-caption" style="text-align: center;">Cute cat images in a grid and a button to show more - this web app truly has it all! <br /> <span style="text-align: left;">Here is the JavaScript:</span></td></tr> </tbody></table> <span id="docs-internal-guid-49bf4ac8-7fff-e932-d45b-78bbf2e263ef"></span><br /> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-top: 0pt;"> <span id="docs-internal-guid-49bf4ac8-7fff-e932-d45b-78bbf2e263ef"><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"><br /> &nbsp;&nbsp;</span><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">const</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">apiUrl</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> = </span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">'https://api.thecatapi.com/v1/images/search?limit=50'</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">;</span></span></div> <span id="docs-internal-guid-49bf4ac8-7fff-e932-d45b-78bbf2e263ef"> </span> <br /> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;</span><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">const</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">tpl</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> = </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">document</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">querySelector</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">'template'</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">).</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">content</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">;</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;</span><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">const</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">container</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> = </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">document</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">querySelector</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">'ul'</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">);</span></div> <br /> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;</span><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">function</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">init</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> () {</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">fetch</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">apiUrl</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">)</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">then</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">response</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">=&gt;</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">response</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">json</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">())</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">then</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">cats</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">=&gt;</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> {</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">container</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">innerHTML</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> = </span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">''</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">;</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">cats</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">map</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">cat</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">=&gt;</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> {</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">const</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">li</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> = </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">document</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">importNode</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">tpl</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">, </span><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">true</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">);</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">li</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">querySelector</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">'img'</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">).</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">src</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> = </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">cat</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">url</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">;</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #af00db; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">return</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">li</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">;</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}).</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">forEach</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">li</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">=&gt;</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">container</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">appendChild</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">li</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">));</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;&nbsp;&nbsp;})</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;}</span></div> <br /> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">init</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">();</span></div> <br /> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">document</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">querySelector</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">'button'</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">).</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">addEventListener</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">'click'</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">, </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">init</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">);</span></div> <div> <br /></div> <div> The web app uses modern JavaScript (ES6), which <a href="https://developers.google.com/search/docs/guides/rendering">isn't supported in Googlebot yet</a>. We can use the <a href="https://g.co/mobile-friendly">mobile-friendly test</a> to check if Googlebot can see the content:</div> <table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody> <tr><td style="text-align: center;"><a href="https://4.bp.blogspot.com/2OM7ftN_N2q91cZT616ZXKtI84t2VPwU1Y9dRyWDX97g-uebUE-GdUBhyiuVNY5erRK9X5HIdSryl0fv68l9-j2IJgiJmVMwxjiMB41yyRDgSGyB4NWEg3WzmySWzb-cxu5trjjS" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1087" data-original-width="1600" height="271" src="https://4.bp.blogspot.com/2OM7ftN_N2q91cZT616ZXKtI84t2VPwU1Y9dRyWDX97g-uebUE-GdUBhyiuVNY5erRK9X5HIdSryl0fv68l9-j2IJgiJmVMwxjiMB41yyRDgSGyB4NWEg3WzmySWzb-cxu5trjjS" width="400" /></a></td></tr> <tr><td class="tr-caption">The mobile-friendly test shows that the page is mobile-friendly, but the screenshot is missing all the cats! The headline and button appear but none of the cat pictures are there.</td></tr> </tbody></table> <div> While this problem is simple to fix, it's a good exercise to learn how to setup dynamic rendering. Dynamic rendering will allow Googlebot to see the cat pictures without changes to the web app code.</div> <div> <h3 style="text-align: left;"> Set up the server</h3> <div> To serve the web application, let's use <a href="https://expressjs.com/" rel="nofollow">express</a>, a node.js library, to build web servers.</div> <div> The server code looks like this (find the <a href="https://glitch.com/edit/#!/kitten-corner?path=server.js:1:1" rel="nofollow">full project source code</a> here):</div> </div> <div> <span id="docs-internal-guid-955b5506-7fff-6a06-02f0-bbee3095293c"></span><br /> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span id="docs-internal-guid-955b5506-7fff-6a06-02f0-bbee3095293c"><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">const</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">express</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> = </span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">require</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">'express'</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">);</span></span></div> <span id="docs-internal-guid-955b5506-7fff-6a06-02f0-bbee3095293c"> </span> <br /> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">const</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">app</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> = </span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">express</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">();</span></div> <br /> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">const</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">DIST_FOLDER</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> = </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">process</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">cwd</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">() + </span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">'/docs'</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">;</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">const</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">PORT</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> = </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">process</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">env</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">PORT</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> || </span><span style="color: #09885a; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">8080</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">;</span></div> <br /> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span style="color: green; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">// Serve static assets (images, css, etc.)</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">app</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">get</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">'*.*'</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">, </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">express</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">static</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">DIST_FOLDER</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">));</span></div> <br /> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span style="color: green; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">// Point all other URLs to index.html for our single page app</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">app</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">get</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">'*'</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">, (</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">req</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">, </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">res</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">) </span><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">=&gt;</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> {</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">res</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">sendFile</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">DIST_FOLDER</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> + </span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">'/index.html'</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">);</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">});</span></div> <br /> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span style="color: green; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">// Start Express Server</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">app</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">listen</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">PORT</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">, () </span><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">=&gt;</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> {</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;</span><span style="color: #267f99; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">console</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">log</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">`Node Express server listening on http://localhost:</span><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">${</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">PORT</span><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">}</span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> from </span><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">${</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">DIST_FOLDER</span><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">}</span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">`</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">);</span></div> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">});</span></div> <div> <span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div> <div> You can <a href="https://kitten-corner.glitch.me/" rel="nofollow">try the live example here</a> - you should see a bunch of cat pictures, if you are using a modern browser. To run the project from your computer, you need <a href="https://nodejs.org/en/" rel="nofollow">node.js</a> to run the following commands: <span style="font-family: &quot;courier new&quot;;"><span style="font-size: 14px; white-space: pre-wrap;"> </span></span></div> <div> <span style="font-family: &quot;courier new&quot;;"><span style="font-size: 14px; white-space: pre-wrap;"> npm install --save express rendertron-middleware node server.js </span></span></div> <div> Then point your browser to <a href="http://localhost:8080/">http://localhost:8080</a>. Now it&#8217;s time to set up dynamic rendering. <br /> <h3 style="text-align: left;"> Deploy a Rendertron instance</h3> Rendertron runs a server that takes a URL and returns static HTML for the URL by using headless Chromium. We'll follow <a href="https://github.com/GoogleChrome/rendertron#deploying-to-google-cloud-platform" rel="nofollow">the recommendation from the Rendertron project</a> and use <a href="https://console.cloud.google.com/">Google Cloud Platform</a>.</div> <table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody> <tr><td style="text-align: center;"><a href="https://4.bp.blogspot.com/_UOqxVtYffYz0NvJAXjwOLbouiNoPaJENqZXjdW7Velg4AD8rnOB_0Bczu2Vyjxz3GnqTrTdpyAnkUKJp_r714NtmnneodB5atakrjfqF7tSrV_oB0yUYa2bbMynUuBp_d5sVJLl" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="948" data-original-width="1114" height="340" src="https://4.bp.blogspot.com/_UOqxVtYffYz0NvJAXjwOLbouiNoPaJENqZXjdW7Velg4AD8rnOB_0Bczu2Vyjxz3GnqTrTdpyAnkUKJp_r714NtmnneodB5atakrjfqF7tSrV_oB0yUYa2bbMynUuBp_d5sVJLl" width="400" /></a></td></tr> <tr><td class="tr-caption">The form to create a new Google Cloud Platform project.</td></tr> </tbody></table> <div> <div> Please note that you can get started with <a href="https://cloud.google.com/free/docs/always-free-usage-limits">the free usage tier</a>, using this setup in production may incur costs according to the <a href="https://cloud.google.com/pricing/">Google Cloud Platform pricing</a>.</div> <div> <ol style="text-align: left;"> <li><span id="docs-internal-guid-49bf4ac8-7fff-e932-d45b-78bbf2e263ef"><div> <span id="docs-internal-guid-955b5506-7fff-6a06-02f0-bbee3095293c"></span><br /> <div> <div> <span id="docs-internal-guid-955b5506-7fff-6a06-02f0-bbee3095293c">Create a new project in the <a href="https://console.cloud.google.com/">Google Cloud console</a>. Take note of the &#8220;Project ID&#8221; below the input field.</span></div> </div> <span id="docs-internal-guid-955b5506-7fff-6a06-02f0-bbee3095293c"> </span></div> </span></li> <li><span id="docs-internal-guid-49bf4ac8-7fff-e932-d45b-78bbf2e263ef"><div> <span id="docs-internal-guid-955b5506-7fff-6a06-02f0-bbee3095293c"></span><br /> <div> <div> <span id="docs-internal-guid-955b5506-7fff-6a06-02f0-bbee3095293c">Install the <a href="https://cloud.google.com/sdk/docs/quickstarts">Google Cloud SDK as described in the documentation</a> and log in.</span></div> </div> <span id="docs-internal-guid-955b5506-7fff-6a06-02f0-bbee3095293c"> </span></div> </span></li> <li><span id="docs-internal-guid-49bf4ac8-7fff-e932-d45b-78bbf2e263ef"><span id="docs-internal-guid-955b5506-7fff-6a06-02f0-bbee3095293c">Clone the Rendertron repository from GitHub with:<br /><blockquote style="border: none; margin: 0 0 0 40px; padding: 0px;"> <span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">git clone https://github.com/GoogleChrome/rendertron.git&nbsp;</span></blockquote> <blockquote style="border: none; margin: 0 0 0 40px; padding: 0px;"> <span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">cd rendertron</span>&nbsp;</blockquote> </span></span></li> <li><span id="docs-internal-guid-49bf4ac8-7fff-e932-d45b-78bbf2e263ef"><span id="docs-internal-guid-955b5506-7fff-6a06-02f0-bbee3095293c">Run the following commands to install dependencies and build Rendertron on your computer:<br /><blockquote style="border: none; margin: 0 0 0 40px; padding: 0px;"> <span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">npm install &amp;&amp; npm run build</span></blockquote> </span></span></li> <li><span id="docs-internal-guid-49bf4ac8-7fff-e932-d45b-78bbf2e263ef"><span id="docs-internal-guid-955b5506-7fff-6a06-02f0-bbee3095293c">Enable Rendertron&#8217;s cache by creating a new file called config.json in the rendertron directory with the following content:<br /><blockquote style="border: none; margin: 0 0 0 40px; padding: 0px;"> <span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">{ "datastoreCache": true }</span></blockquote> </span></span></li> <li><span id="docs-internal-guid-49bf4ac8-7fff-e932-d45b-78bbf2e263ef"><span id="docs-internal-guid-955b5506-7fff-6a06-02f0-bbee3095293c">Run the following command from the rendertron directory. Substitute YOUR_PROJECT_ID with your project ID from step 1.<br /><blockquote style="border: none; margin: 0 0 0 40px; padding: 0px;"> <span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">gcloud app deploy app.yaml --project YOUR_PROJECT_ID</span></blockquote> </span></span></li> <li><span id="docs-internal-guid-49bf4ac8-7fff-e932-d45b-78bbf2e263ef"><div> <span id="docs-internal-guid-955b5506-7fff-6a06-02f0-bbee3095293c"></span><br /> <div> <div> <span id="docs-internal-guid-955b5506-7fff-6a06-02f0-bbee3095293c">Select a region of your choice and confirm the deployment. Wait for it to finish.</span></div> </div> <span id="docs-internal-guid-955b5506-7fff-6a06-02f0-bbee3095293c"> </span></div> </span></li> <li><span id="docs-internal-guid-49bf4ac8-7fff-e932-d45b-78bbf2e263ef"><div> <span id="docs-internal-guid-955b5506-7fff-6a06-02f0-bbee3095293c"></span><br /> <div> <div> <span id="docs-internal-guid-955b5506-7fff-6a06-02f0-bbee3095293c">Enter the URL YOUR_PROJECT_ID.appspot.com (substitute YOUR_PROJECT_ID for your actual project ID from step 1 in your browser. You should see Rendertron&#8217;s interface with an input field and a few buttons.</span></div> </div> <span id="docs-internal-guid-955b5506-7fff-6a06-02f0-bbee3095293c"> </span></div> </span></li> </ol> </div> </div> <table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody> <tr><td style="text-align: center;"><a href="https://4.bp.blogspot.com/fx7Es-jvM6G20PtNlkpZtoNEbflUMxM2BLlD0WZyCHYpwC5rq5-HVY4uud3bZA-AYF2uqY3N1NorRq9_MMCT2dRBN4_-UddM2WDF86W95u1z9Hll_czRwJhl4fMS3wDbA0WeyrxF" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1250" data-original-width="1454" height="343" src="https://4.bp.blogspot.com/fx7Es-jvM6G20PtNlkpZtoNEbflUMxM2BLlD0WZyCHYpwC5rq5-HVY4uud3bZA-AYF2uqY3N1NorRq9_MMCT2dRBN4_-UddM2WDF86W95u1z9Hll_czRwJhl4fMS3wDbA0WeyrxF" width="400" /></a></td></tr> <tr><td class="tr-caption" style="text-align: center;">Rendertron&#8217;s UI after deploying to Google Cloud Platform</td></tr> </tbody></table> <div> <div> When you see the Rendertron web interface, you have successfully deployed your own Rendertron instance. Take note of your project&#8217;s URL (YOUR_PROJECT_ID.appspot.com) as you will need it in the next part of the process.</div> </div> <div> <h3 style="text-align: left;"> Add Rendertron to the server</h3> <div> The web server is using express.js and Rendertron has an express.js middleware. Run the following command in the directory of the server.js file:</div> <div> <br /></div> <div> <span style="white-space: pre;"> </span><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">npm install --save rendertron-middleware</span></div> <div> <br /></div> <div> This command installs the rendertron-middleware from npm so we can add it to the server:</div> </div> <div> <span id="docs-internal-guid-b92b81d2-7fff-7db3-aad0-fe97905f4200"></span><br /> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span id="docs-internal-guid-b92b81d2-7fff-7db3-aad0-fe97905f4200"><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">const</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">express</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> = </span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">require</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">'express'</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">);</span></span></div> <span id="docs-internal-guid-b92b81d2-7fff-7db3-aad0-fe97905f4200"> </span> <br /> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span id="docs-internal-guid-b92b81d2-7fff-7db3-aad0-fe97905f4200"><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">const</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">app</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> = </span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">express</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">();</span></span></div> <span id="docs-internal-guid-b92b81d2-7fff-7db3-aad0-fe97905f4200"> </span> <br /> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span id="docs-internal-guid-b92b81d2-7fff-7db3-aad0-fe97905f4200"><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">const</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">rendertron</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> = </span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">require</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">'rendertron-middleware'</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">);</span></span></div> <span id="docs-internal-guid-b92b81d2-7fff-7db3-aad0-fe97905f4200"> </span><br /> <h3 style="text-align: left;"> <span id="docs-internal-guid-b92b81d2-7fff-7db3-aad0-fe97905f4200"> Configure the bot list</span></h3> <span id="docs-internal-guid-b92b81d2-7fff-7db3-aad0-fe97905f4200"> <div> Rendertron uses the user-agent HTTP header to determine if a request comes from a bot or a user&#8217;s browser. It has a <a href="https://github.com/GoogleChrome/rendertron/blob/30446bd7caae87de9fcd8c8263b588c350130852/middleware/src/middleware.ts#L24-L41" rel="nofollow">well-maintained list of bot user agents</a> to compare with. By default this list does not include Googlebot, because Googlebot can execute JavaScript. To make Rendertron render Googlebot requests as well, add Googlebot to the list of user agents:</div> <div> <span id="docs-internal-guid-15720cef-7fff-0595-29dd-1bcec64bb1e7"></span><br /> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span id="docs-internal-guid-15720cef-7fff-0595-29dd-1bcec64bb1e7"><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">const</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">BOTS</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> = </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">rendertron</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">botUserAgents</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">concat</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">'googlebot'</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">);</span></span></div> <span id="docs-internal-guid-15720cef-7fff-0595-29dd-1bcec64bb1e7"> </span> <br /> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span id="docs-internal-guid-15720cef-7fff-0595-29dd-1bcec64bb1e7"><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">const</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">BOT_UA_PATTERN</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> = </span><span style="color: blue; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">new</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #267f99; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">RegExp</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">BOTS</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">join</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">'|'</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">), </span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">'i'</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">);</span></span></div> <span id="docs-internal-guid-15720cef-7fff-0595-29dd-1bcec64bb1e7"> </span></div> <div> <br /></div> <div> Rendertron compares the user-agent header against this regular expression later.</div> <h3 style="text-align: left;"> Add the middleware</h3> <div> To send bot requests to the Rendertron instance, we need to add the middleware to our express.js server. The middleware checks the requesting user agent and forwards requests from known bots to the Rendertron instance. Add the following code to server.js and don&#8217;t forget to substitute &#8220;YOUR_PROJECT_ID&#8221; with your Google Cloud Platform project ID:</div> <div> <span id="docs-internal-guid-f875fb12-7fff-a3c5-3c8a-0260047ee9ef"></span><br /> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span id="docs-internal-guid-f875fb12-7fff-a3c5-3c8a-0260047ee9ef"><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">app</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">use</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">rendertron</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="color: #795e26; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">makeMiddleware</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">({</span></span></div> <span id="docs-internal-guid-f875fb12-7fff-a3c5-3c8a-0260047ee9ef"> </span> <br /> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span id="docs-internal-guid-f875fb12-7fff-a3c5-3c8a-0260047ee9ef"><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">proxyUrl:</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #a31515; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">'https://YOUR_PROJECT_ID.appspot.com/render'</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">,</span></span></div> <span id="docs-internal-guid-f875fb12-7fff-a3c5-3c8a-0260047ee9ef"> </span> <br /> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span id="docs-internal-guid-f875fb12-7fff-a3c5-3c8a-0260047ee9ef"><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;</span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">userAgentPattern:</span><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #001080; font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">BOT_UA_PATTERN</span></span></div> <span id="docs-internal-guid-f875fb12-7fff-a3c5-3c8a-0260047ee9ef"> </span> <div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"> <span id="docs-internal-guid-f875fb12-7fff-a3c5-3c8a-0260047ee9ef"><span style="font-family: &quot;courier new&quot;; font-size: 10.5pt; vertical-align: baseline; white-space: pre-wrap;">}));</span></span></div> <span id="docs-internal-guid-f875fb12-7fff-a3c5-3c8a-0260047ee9ef"> </span></div> <div> <br /></div> <div> Bots requesting the sample website receive the static HTML from Rendertron, so the bots don&#8217;t need to run JavaScript to display the content.</div> <h3 style="text-align: left;"> Testing our setup</h3> <div> To test if the Rendertron setup was successful, run the mobile-friendly test again.</div> <div class="separator" style="clear: both; text-align: center;"> <a href="https://2.bp.blogspot.com/JU7pTGkt2YbjBAQvNjwCVF2_m3gkwwtah3H3Gh0WQsPvcxvgO_7KE1ycx_AnoZAfq8Y8ITCVC2qnk-gENpCaxe5BTSwF7JZ0vDl3jhkM88klwDR6GqHduPPohyQrfixHxgUIH3Wb" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1209" data-original-width="1600" height="301" src="https://2.bp.blogspot.com/JU7pTGkt2YbjBAQvNjwCVF2_m3gkwwtah3H3Gh0WQsPvcxvgO_7KE1ycx_AnoZAfq8Y8ITCVC2qnk-gENpCaxe5BTSwF7JZ0vDl3jhkM88klwDR6GqHduPPohyQrfixHxgUIH3Wb" width="400" /></a></div> <div> <div> Unlike the first test, the cat pictures are visible. In the HTML tab we can see all HTML the JavaScript code generated and that Rendertron has removed the need for JavaScript to display the content.</div> </div> <div> <h3 style="text-align: left;"> Conclusion</h3> <div> You created a dynamic rendering setup without making any changes to the web app. With these changes, you can serve a static HTML version of the web app to crawlers.</div> </div> <div> <br /></div> <div> <span class="byline-author">Posted by Martin Splitt, Open Web Unicorn</span></div> </span></div> </div> </div> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Official Google Webmaster Central Blog:Dynamic Rendering with Rendertron&url=https://webmasters.googleblog.com/2019/01/dynamic-rendering-with-rendertron.html?hl=en&via=googlewmc'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=https://webmasters.googleblog.com/2019/01/dynamic-rendering-with-rendertron.html?hl=en'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='https://webmasters.googleblog.com/2019/01/dynamic-rendering-with-rendertron.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='https://webmasters.googleblog.com/search/label/javascript?hl=en' rel='tag'> javascript </a> </span> </div> </div> </div> <div class='post' data-id='2350991959496997521' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='https://webmasters.googleblog.com/2019/01/focusing-on-new-search-console.html?hl=en' itemprop='url' title='Focusing on the new Search Console'> Focusing on the new Search Console </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Friday, January 25, 2019 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <div dir="ltr" style="text-align: left;" trbidi="on"> <p>Over the last year, the <a href="https://support.google.com/webmasters/answer/7451491">new Search Console</a> has been <a href="https://webmasters.googleblog.com/2018/01/introducing-new-search-console.html">growing</a> and <a href="https://webmasters.googleblog.com/2018/09/the-new-search-console-is-graduating.html">growing</a>, with the goal of making it easier for site owners to focus on the important tasks. For us, focus means being able to put in all our work into the new Search Console, being committed to the users, and with that, being able to turn off some of the older, perhaps already-improved, aspects of the old Search Console. This gives us space to further build out the new Search Console, adding and improving features over time.</p> <p>Here are some of the upcoming <a href="https://support.google.com/webmasters/answer/9073702?hl=en">changes in Search Console</a> that we're planning on making towards end of March, 2019:</p> <h3>Crawl errors in the new Index Coverage report</h3> <p>One of the more common pieces of feedback we received was that the list of crawl errors in Search Console was not actionable when it came to setting priorities (it's normal that Google crawls URLs which don't exist, it's not something that needs to be fixed on the website). By changing the focus on issues and patterns used for site indexing, we believe that site owners will be able to find and fix issues much faster (and when issues are fixed, you can request reprocessing quickly too). With this, we're going to remove the old Crawl Errors report - for desktop, smartphone, and site-wide errors. We'll continue to improve the way issues are recognized and flagged, so if there's something that would help you, please submit feedback in the tools.</p> <p>Along with the Crawl Errors report, we're also deprecating the crawl errors API that's based on the same internal systems. At the moment, we don't have a replacement for this API. We'll inform API users of this change directly. </p> <h3>Sitemaps data in Index Coverage</h3> <p>As we move forward with the new Search Console, we're turning the old sitemaps report off. The new sitemaps report has most of the functionality of the old report, and we're aiming to bring the rest of the information - specifically for images &amp; video - to the new reports over time. Moreover, to track URLs submitted in sitemap files, within the Index Coverage report you can select and filter using your sitemap files. This makes it easier to focus on URLs that you care about.</p> <h3>Using the URL inspection tool to fetch as Google</h3> <p>The new <a href="https://support.google.com/webmasters/answer/9012289?hl=en">URL inspection tool</a> offers many ways to check and review URLs on your website. It provides both a look into the current indexing, as well as a live check of URLs that you've recently changed. In the meantime, this tool shows even more information on URLs, such as the HTTP headers, page resource, the JavaScript console log, and a screenshot of the page. From there, you can also submit pages for re-processing, to have them added or updated in our search results as quickly as possible.</p> <h3>User-management is now in settings</h3> <p>We've improved the user management interface and decreased clutter from the tool by merging it with the Settings section of the new Search Console. This replaces the <a href="https://support.google.com/webmasters/answer/2453966?hl=en">user-management features</a> in the old Search Console. </p> <h3>Structured data dashboard to dedicated reports per vertical</h3> <p>To help you implement Rich Results for you site, we added several reports to the new Search Console last year. These include Jobs, Recipes, Events and Q&amp;A. We are committed to keep adding reports like these to the new Search Console. When Google encounters a syntax error parsing Structured Data on a page, it will also be reported in aggregate to make sure you don&#8217;t miss anything critical.</p> <p>Other Structured Data types that are not supported with Rich Results features, will not be reported in Search Console anymore. We hope this reduces distraction from non-critical issues, and help you to focus on fixing problems which could be visible in Search. </p> <h3>Letting go of some old features</h3> <p>With the focus on features that we believe are critical to site owners, we've had to make a hard decision to drop some features in Search Console. In particular:</p> <p>HTML suggestions - finding short and duplicated titles can be useful for site owners, but Google's algorithms have gotten <a href="https://support.google.com/webmasters/answer/35624?hl=en">better at showing and improving titles</a> over the years. We still believe this is something useful for sites to look into, and there are some really good tools that help you to <a href="https://www.google.com/search?q=crawl+website+for+titles+and+descriptions">crawl your website to extract titles &amp; descriptions</a> too. </p> <p>Property Sets - while they're loved by some site owners, the small number of users makes it hard to justify maintaining this feature. However, we did learn that users need a more comprehensive view of their website and so we will soon add the option of managing a search console account over an entire domain (regardless of schema type and sub-domains). Stay tuned!</p> <p>Android Apps - most of the relevant functionality has been moved to the <a href="https://console.firebase.google.com/">Firebase console</a> over the years. </p> <p>Blocked resources - we added this functionality to help sites with unblocking of CSS and JavaScript files for mobile-friendliness several years back. In the meantime, these issues have gotten much fewer, the usage of this tool has dropped significantly, and you're able to find blocked resources directly in the <a href="https://support.google.com/webmasters/answer/9012289?hl=en">URL inspection tool</a>.</p> <h3>Please send us feedback!</h3> <p>We realize some of these changes will affect your work-flows, so we want to let you know about them as early as possible. Please send us your feedback directly in the new Search Console, if there are aspects which are unclear, or which would ideally be different for your use-case. For more detailed feedback, please use our <a href="https://support.google.com/webmasters/go/community">help forums</a>, feel free to include screenshots &amp; ideas. In the long run, we believe the new Search Console will make things much easier, help you focus on the issues affecting your site, and the opportunities available to your site, with regards to search. </p> <p>We're looking forward to an exciting year!</p> <br> <span class="byline-author">Posted by Hillel Maoz, Search Console Team</span></div> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <div dir="ltr" style="text-align: left;" trbidi="on"> <p>Over the last year, the <a href="https://support.google.com/webmasters/answer/7451491">new Search Console</a> has been <a href="https://webmasters.googleblog.com/2018/01/introducing-new-search-console.html">growing</a> and <a href="https://webmasters.googleblog.com/2018/09/the-new-search-console-is-graduating.html">growing</a>, with the goal of making it easier for site owners to focus on the important tasks. For us, focus means being able to put in all our work into the new Search Console, being committed to the users, and with that, being able to turn off some of the older, perhaps already-improved, aspects of the old Search Console. This gives us space to further build out the new Search Console, adding and improving features over time.</p> <p>Here are some of the upcoming <a href="https://support.google.com/webmasters/answer/9073702?hl=en">changes in Search Console</a> that we're planning on making towards end of March, 2019:</p> <h3>Crawl errors in the new Index Coverage report</h3> <p>One of the more common pieces of feedback we received was that the list of crawl errors in Search Console was not actionable when it came to setting priorities (it's normal that Google crawls URLs which don't exist, it's not something that needs to be fixed on the website). By changing the focus on issues and patterns used for site indexing, we believe that site owners will be able to find and fix issues much faster (and when issues are fixed, you can request reprocessing quickly too). With this, we're going to remove the old Crawl Errors report - for desktop, smartphone, and site-wide errors. We'll continue to improve the way issues are recognized and flagged, so if there's something that would help you, please submit feedback in the tools.</p> <p>Along with the Crawl Errors report, we're also deprecating the crawl errors API that's based on the same internal systems. At the moment, we don't have a replacement for this API. We'll inform API users of this change directly. </p> <h3>Sitemaps data in Index Coverage</h3> <p>As we move forward with the new Search Console, we're turning the old sitemaps report off. The new sitemaps report has most of the functionality of the old report, and we're aiming to bring the rest of the information - specifically for images &amp; video - to the new reports over time. Moreover, to track URLs submitted in sitemap files, within the Index Coverage report you can select and filter using your sitemap files. This makes it easier to focus on URLs that you care about.</p> <h3>Using the URL inspection tool to fetch as Google</h3> <p>The new <a href="https://support.google.com/webmasters/answer/9012289?hl=en">URL inspection tool</a> offers many ways to check and review URLs on your website. It provides both a look into the current indexing, as well as a live check of URLs that you've recently changed. In the meantime, this tool shows even more information on URLs, such as the HTTP headers, page resource, the JavaScript console log, and a screenshot of the page. From there, you can also submit pages for re-processing, to have them added or updated in our search results as quickly as possible.</p> <h3>User-management is now in settings</h3> <p>We've improved the user management interface and decreased clutter from the tool by merging it with the Settings section of the new Search Console. This replaces the <a href="https://support.google.com/webmasters/answer/2453966?hl=en">user-management features</a> in the old Search Console. </p> <h3>Structured data dashboard to dedicated reports per vertical</h3> <p>To help you implement Rich Results for you site, we added several reports to the new Search Console last year. These include Jobs, Recipes, Events and Q&amp;A. We are committed to keep adding reports like these to the new Search Console. When Google encounters a syntax error parsing Structured Data on a page, it will also be reported in aggregate to make sure you don&#8217;t miss anything critical.</p> <p>Other Structured Data types that are not supported with Rich Results features, will not be reported in Search Console anymore. We hope this reduces distraction from non-critical issues, and help you to focus on fixing problems which could be visible in Search. </p> <h3>Letting go of some old features</h3> <p>With the focus on features that we believe are critical to site owners, we've had to make a hard decision to drop some features in Search Console. In particular:</p> <p>HTML suggestions - finding short and duplicated titles can be useful for site owners, but Google's algorithms have gotten <a href="https://support.google.com/webmasters/answer/35624?hl=en">better at showing and improving titles</a> over the years. We still believe this is something useful for sites to look into, and there are some really good tools that help you to <a href="https://www.google.com/search?q=crawl+website+for+titles+and+descriptions">crawl your website to extract titles &amp; descriptions</a> too. </p> <p>Property Sets - while they're loved by some site owners, the small number of users makes it hard to justify maintaining this feature. However, we did learn that users need a more comprehensive view of their website and so we will soon add the option of managing a search console account over an entire domain (regardless of schema type and sub-domains). Stay tuned!</p> <p>Android Apps - most of the relevant functionality has been moved to the <a href="https://console.firebase.google.com/">Firebase console</a> over the years. </p> <p>Blocked resources - we added this functionality to help sites with unblocking of CSS and JavaScript files for mobile-friendliness several years back. In the meantime, these issues have gotten much fewer, the usage of this tool has dropped significantly, and you're able to find blocked resources directly in the <a href="https://support.google.com/webmasters/answer/9012289?hl=en">URL inspection tool</a>.</p> <h3>Please send us feedback!</h3> <p>We realize some of these changes will affect your work-flows, so we want to let you know about them as early as possible. Please send us your feedback directly in the new Search Console, if there are aspects which are unclear, or which would ideally be different for your use-case. For more detailed feedback, please use our <a href="https://support.google.com/webmasters/go/community">help forums</a>, feel free to include screenshots &amp; ideas. In the long run, we believe the new Search Console will make things much easier, help you focus on the issues affecting your site, and the opportunities available to your site, with regards to search. </p> <p>We're looking forward to an exciting year!</p> <br> <span class="byline-author">Posted by Hillel Maoz, Search Console Team</span></div> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Official Google Webmaster Central Blog:Focusing on the new Search Console&url=https://webmasters.googleblog.com/2019/01/focusing-on-new-search-console.html?hl=en&via=googlewmc'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=https://webmasters.googleblog.com/2019/01/focusing-on-new-search-console.html?hl=en'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='https://webmasters.googleblog.com/2019/01/focusing-on-new-search-console.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='https://webmasters.googleblog.com/search/label/search%20console?hl=en' rel='tag'> search console </a> , <a class='label' href='https://webmasters.googleblog.com/search/label/webmaster%20tools?hl=en' rel='tag'> webmaster tools </a> </span> </div> </div> </div> <div class='post' data-id='3051682362674471538' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='https://webmasters.googleblog.com/2019/01/ways-to-succeed-in-google-news.html?hl=en' itemprop='url' title='Ways to succeed in Google News'> Ways to succeed in Google News </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Thursday, January 17, 2019 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <div dir="ltr" style="text-align: left;" trbidi="on"> With the New Year now underway, we'd like to offer some best practices and advice we hope will lead publishers to more success within Google News in 2019. <br /> <h2> General advice</h2> There is a lot of helpful information to consider within the <a href="https://support.google.com/news/publisher-center/#topic=9010378">Google News Publisher Help Center</a>. Be sure to have read the material in this area, in particular the <a href="https://support.google.com/news/publisher-center/answer/6204050">content</a> and <a href="https://support.google.com/news/publisher-center/topic/9010253">technical</a> guidelines. <br /> <h2> Headlines and dates</h2> <br /> <ul style="text-align: left;"> <li><strong>Present clear headlines:</strong> Google News looks at a variety of signals to determine the headline of an article, including within your HTML title tag and for the most prominent text on the page. <a href="https://support.google.com/news/publisher-center/answer/93981">Review our headline tips</a>.</li> <li><strong>Provide accurate times and dates:</strong> Google News tries to determine the time and date to display for an article in a variety of ways. You can help ensure we get it right by using the following methods:</li> <ul> <li><strong>Show one clear date and time:</strong> As per our <a href="https://support.google.com/news/publisher-center/answer/70871">date guidelines</a>, show a clear, visible date and time between the headline and the article text. Prevent other dates from appearing on the page whenever possible, such as for related stories.</li> <li><strong>Use structured data: </strong>Use the <code>datePublished</code> and <code>dateModified</code> schema and use the correct time zone designator for <a href="https://developers.google.com/search/docs/data-types/article#amp">AMP</a> or <a href="https://developers.google.com/search/docs/data-types/article#non-amp">non-AMP pages</a>.&nbsp;</li> </ul> </ul> <ul style="text-align: left;"> <li><strong>Avoid artificially freshening stories:</strong> If an article has been substantially changed, it can make sense to give it a fresh date and time. However, don't artificially freshen a story without adding significant information or some other compelling reason for the freshening. Also, do not create a very slightly updated story from one previously published, then delete the old story and redirect to the new one. That's against our <a href="https://support.google.com/news/publisher-center/answer/68323">article URLs</a> guidelines.</li> </ul> <h2> Duplicate content</h2> Google News seeks to reward independent, original journalistic content by giving credit to the originating publisher, as both users and publishers would prefer. This means we try not to allow duplicate content&#8212;which includes scraped, rewritten, or republished material&#8212;to perform better than the original content. In line with this, these are guidelines publishers should follow: <br /> <br /> <ul style="text-align: left;"> <li><strong>Block scraped content: </strong><a href="https://support.google.com/webmasters/answer/2721312">Scraping</a><strong> </strong>commonly refers to taking material from another site, often on an automated basis. Sites that scrape content must <a href="https://support.google.com/news/publisher-center/answer/93977">block</a> scraped content from Google News.</li> <li><strong>Block rewritten content: </strong>Rewriting refers to taking material from another site, then rewriting that material so that it is not identical. Sites that rewrite content in a way that provides no substantial or clear added value must <a href="https://support.google.com/news/publisher-center/answer/93977">block</a> that rewritten content from Google News. This includes, but is not limited to, rewrites that make only very slight changes or those that make many word replacements but still keep the original article's overall meaning.</li> <li><strong>Block or consider canonical for republished content:</strong> Republishing<strong> </strong>refers to when a publisher has permission from another publisher or author to republish an original work, such as material from wire services or in partnership with other publications.<br />Publishers that allow others to republish content can help ensure that their original versions perform better in Google News by asking those republishing to <a href="https://support.google.com/news/publisher-center/answer/93977">block</a> or make use of <a href="https://support.google.com/news/publisher-center/answer/2589949">canonical</a>.<br />Google News also encourages those that republish material to consider proactively <a href="https://support.google.com/news/publisher-center/answer/93977">blocking</a> such content or making use of the <a href="https://support.google.com/news/publisher-center/answer/2589949">canonical</a>, so that we can better identify the original content and credit it appropriately.</li> <li><strong>Avoid duplicate content: </strong>If you operate a network of news sites that share content, the advice above about republishing is applicable to your network. Select what you consider to be the original article and consider <a href="https://support.google.com/news/publisher-center/answer/2589949">blocking duplicates</a> or making use of the <a href="https://support.google.com/news/publisher-center/answer/2589949">canonical</a> to point to the original.</li> </ul> <br /> <h2> Transparency</h2> <br /> <ul style="text-align: left;"> <li><strong>Be transparent:</strong> Visitors to your site want to trust and understand who publishes it and information about those who have written articles. That's why our <a href="https://support.google.com/news/publisher-center/answer/6204050">content guidelines</a> stress that content should have posts with clear bylines, information about authors, and contact information for the publication.</li> <li><strong>Don't be deceptive: </strong>Our <a href="https://support.google.com/news/producer/answer/6204050">content policies</a> do not allow sites or accounts that impersonate any person or organization, or that misrepresent or conceal their ownership or primary purpose. We do not allow sites or accounts that engage in coordinated activity to mislead users. This includes, but isn't limited to, sites or accounts that misrepresent or conceal their country of origin or that direct content at users in another country under false premises.</li> </ul> <br /> <h2> More tips</h2> <br /> <ul style="text-align: left;"> <li><strong>Avoid taking part in link schemes: </strong>Don't participate in link schemes, which can include <a href="https://webmasters.googleblog.com/2017/05/a-reminder-about-links-in-large-scale.html">large-scale article marketing programs</a> or selling links that pass PageRank. Review our page on <a href="https://support.google.com/webmasters/answer/66356">link schemes</a> for more information.</li> <li><strong>Use structured data for rich presentation:</strong> Both those using <a href="https://www.ampproject.org/">AMP</a> and non-AMP pages can make use of <a href="https://developers.google.com/search/docs/data-types/article#non-amp-sd">structured data</a> to optimize your content for rich results or carousel-like presentations.</li> <li><strong>Protect your users and their data</strong>: Consider securing every page of your website with HTTPS to protect the integrity and confidentiality of the data users exchange on your site. You can find more useful tips in our <a href="https://support.google.com/webmasters/answer/6073543?hl=en">best practices</a> on how to implement HTTPS.</li> </ul> <br /> <h2> Here's to a great 2019!</h2> We hope these tips help publishers succeed in Google News over the coming year. For those who have more questions about Google News, we are unable to do one-to-one support. However, we do monitor our <a href="https://support.google.com/news/publisher-center/threads?hl=en&amp;max_results=20">Google News Publisher Forum</a>&#8212;which has been newly-revamped&#8212;and try to provide guidance on questions that might help a number of publishers all at once. The forum is also a great resource where publishers share tips and advice with each other. <br /> <span class="byline-author">Posted by Danny Sullivan, Public Liaison for Search</span></div> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <div dir="ltr" style="text-align: left;" trbidi="on"> With the New Year now underway, we'd like to offer some best practices and advice we hope will lead publishers to more success within Google News in 2019. <br /> <h2> General advice</h2> There is a lot of helpful information to consider within the <a href="https://support.google.com/news/publisher-center/#topic=9010378">Google News Publisher Help Center</a>. Be sure to have read the material in this area, in particular the <a href="https://support.google.com/news/publisher-center/answer/6204050">content</a> and <a href="https://support.google.com/news/publisher-center/topic/9010253">technical</a> guidelines. <br /> <h2> Headlines and dates</h2> <br /> <ul style="text-align: left;"> <li><strong>Present clear headlines:</strong> Google News looks at a variety of signals to determine the headline of an article, including within your HTML title tag and for the most prominent text on the page. <a href="https://support.google.com/news/publisher-center/answer/93981">Review our headline tips</a>.</li> <li><strong>Provide accurate times and dates:</strong> Google News tries to determine the time and date to display for an article in a variety of ways. You can help ensure we get it right by using the following methods:</li> <ul> <li><strong>Show one clear date and time:</strong> As per our <a href="https://support.google.com/news/publisher-center/answer/70871">date guidelines</a>, show a clear, visible date and time between the headline and the article text. Prevent other dates from appearing on the page whenever possible, such as for related stories.</li> <li><strong>Use structured data: </strong>Use the <code>datePublished</code> and <code>dateModified</code> schema and use the correct time zone designator for <a href="https://developers.google.com/search/docs/data-types/article#amp">AMP</a> or <a href="https://developers.google.com/search/docs/data-types/article#non-amp">non-AMP pages</a>.&nbsp;</li> </ul> </ul> <ul style="text-align: left;"> <li><strong>Avoid artificially freshening stories:</strong> If an article has been substantially changed, it can make sense to give it a fresh date and time. However, don't artificially freshen a story without adding significant information or some other compelling reason for the freshening. Also, do not create a very slightly updated story from one previously published, then delete the old story and redirect to the new one. That's against our <a href="https://support.google.com/news/publisher-center/answer/68323">article URLs</a> guidelines.</li> </ul> <h2> Duplicate content</h2> Google News seeks to reward independent, original journalistic content by giving credit to the originating publisher, as both users and publishers would prefer. This means we try not to allow duplicate content&#8212;which includes scraped, rewritten, or republished material&#8212;to perform better than the original content. In line with this, these are guidelines publishers should follow: <br /> <br /> <ul style="text-align: left;"> <li><strong>Block scraped content: </strong><a href="https://support.google.com/webmasters/answer/2721312">Scraping</a><strong> </strong>commonly refers to taking material from another site, often on an automated basis. Sites that scrape content must <a href="https://support.google.com/news/publisher-center/answer/93977">block</a> scraped content from Google News.</li> <li><strong>Block rewritten content: </strong>Rewriting refers to taking material from another site, then rewriting that material so that it is not identical. Sites that rewrite content in a way that provides no substantial or clear added value must <a href="https://support.google.com/news/publisher-center/answer/93977">block</a> that rewritten content from Google News. This includes, but is not limited to, rewrites that make only very slight changes or those that make many word replacements but still keep the original article's overall meaning.</li> <li><strong>Block or consider canonical for republished content:</strong> Republishing<strong> </strong>refers to when a publisher has permission from another publisher or author to republish an original work, such as material from wire services or in partnership with other publications.<br />Publishers that allow others to republish content can help ensure that their original versions perform better in Google News by asking those republishing to <a href="https://support.google.com/news/publisher-center/answer/93977">block</a> or make use of <a href="https://support.google.com/news/publisher-center/answer/2589949">canonical</a>.<br />Google News also encourages those that republish material to consider proactively <a href="https://support.google.com/news/publisher-center/answer/93977">blocking</a> such content or making use of the <a href="https://support.google.com/news/publisher-center/answer/2589949">canonical</a>, so that we can better identify the original content and credit it appropriately.</li> <li><strong>Avoid duplicate content: </strong>If you operate a network of news sites that share content, the advice above about republishing is applicable to your network. Select what you consider to be the original article and consider <a href="https://support.google.com/news/publisher-center/answer/2589949">blocking duplicates</a> or making use of the <a href="https://support.google.com/news/publisher-center/answer/2589949">canonical</a> to point to the original.</li> </ul> <br /> <h2> Transparency</h2> <br /> <ul style="text-align: left;"> <li><strong>Be transparent:</strong> Visitors to your site want to trust and understand who publishes it and information about those who have written articles. That's why our <a href="https://support.google.com/news/publisher-center/answer/6204050">content guidelines</a> stress that content should have posts with clear bylines, information about authors, and contact information for the publication.</li> <li><strong>Don't be deceptive: </strong>Our <a href="https://support.google.com/news/producer/answer/6204050">content policies</a> do not allow sites or accounts that impersonate any person or organization, or that misrepresent or conceal their ownership or primary purpose. We do not allow sites or accounts that engage in coordinated activity to mislead users. This includes, but isn't limited to, sites or accounts that misrepresent or conceal their country of origin or that direct content at users in another country under false premises.</li> </ul> <br /> <h2> More tips</h2> <br /> <ul style="text-align: left;"> <li><strong>Avoid taking part in link schemes: </strong>Don't participate in link schemes, which can include <a href="https://webmasters.googleblog.com/2017/05/a-reminder-about-links-in-large-scale.html">large-scale article marketing programs</a> or selling links that pass PageRank. Review our page on <a href="https://support.google.com/webmasters/answer/66356">link schemes</a> for more information.</li> <li><strong>Use structured data for rich presentation:</strong> Both those using <a href="https://www.ampproject.org/">AMP</a> and non-AMP pages can make use of <a href="https://developers.google.com/search/docs/data-types/article#non-amp-sd">structured data</a> to optimize your content for rich results or carousel-like presentations.</li> <li><strong>Protect your users and their data</strong>: Consider securing every page of your website with HTTPS to protect the integrity and confidentiality of the data users exchange on your site. You can find more useful tips in our <a href="https://support.google.com/webmasters/answer/6073543?hl=en">best practices</a> on how to implement HTTPS.</li> </ul> <br /> <h2> Here's to a great 2019!</h2> We hope these tips help publishers succeed in Google News over the coming year. For those who have more questions about Google News, we are unable to do one-to-one support. However, we do monitor our <a href="https://support.google.com/news/publisher-center/threads?hl=en&amp;max_results=20">Google News Publisher Forum</a>&#8212;which has been newly-revamped&#8212;and try to provide guidance on questions that might help a number of publishers all at once. The forum is also a great resource where publishers share tips and advice with each other. <br /> <span class="byline-author">Posted by Danny Sullivan, Public Liaison for Search</span></div> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Official Google Webmaster Central Blog:Ways to succeed in Google News&url=https://webmasters.googleblog.com/2019/01/ways-to-succeed-in-google-news.html?hl=en&via=googlewmc'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=https://webmasters.googleblog.com/2019/01/ways-to-succeed-in-google-news.html?hl=en'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='https://webmasters.googleblog.com/2019/01/ways-to-succeed-in-google-news.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='https://webmasters.googleblog.com/search/label/Google%20News?hl=en' rel='tag'> Google News </a> , <a class='label' href='https://webmasters.googleblog.com/search/label/search%20results?hl=en' rel='tag'> search results </a> , <a class='label' href='https://webmasters.googleblog.com/search/label/structured%20data?hl=en' rel='tag'> structured data </a> </span> </div> </div> </div> <div class='post' data-id='2765331181265641171' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='https://webmasters.googleblog.com/2019/01/an-update-on-google-webmaster-central.html?hl=en' itemprop='url' title='An update on the Google Webmaster Central blog comments'> An update on the Google Webmaster Central blog comments </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Friday, January 11, 2019 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <div dir="ltr" style="text-align: left;" trbidi="on"> For every train there's a passenger, but it turns out comments are not our train.<br /> <br /> Over the years we read thousands of comments we've received on our blog posts on the Google Webmaster Central blog. Sometimes they were extremely thoughtful, other times they made us laugh out loud, but most of the time they were off-topic or even outright spammy; if you think about it, the latter is rather ironic, considering this is the Google Webmaster Blog.<br /> <br /> Effective today, we're closing the commenting feature on the Google Webmaster Central blog. Instead of reading the comments here on the blog, we're going to focus on interacting with the community on our other channels. For all of our subsequent posts, if you have comments, feedback, or funny stories, you can find us in our <a href="https://support.google.com/webmasters/go/community" target="_blank">help forums</a> or on <a href="https://twitter.com/googlewmc" target="_blank">Twitter</a>.<br /> <br /> Posted by <a href="https://twitter.com/methode" target="_blank">Gary</a>, House elf</div> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <div dir="ltr" style="text-align: left;" trbidi="on"> For every train there's a passenger, but it turns out comments are not our train.<br /> <br /> Over the years we read thousands of comments we've received on our blog posts on the Google Webmaster Central blog. Sometimes they were extremely thoughtful, other times they made us laugh out loud, but most of the time they were off-topic or even outright spammy; if you think about it, the latter is rather ironic, considering this is the Google Webmaster Blog.<br /> <br /> Effective today, we're closing the commenting feature on the Google Webmaster Central blog. Instead of reading the comments here on the blog, we're going to focus on interacting with the community on our other channels. For all of our subsequent posts, if you have comments, feedback, or funny stories, you can find us in our <a href="https://support.google.com/webmasters/go/community" target="_blank">help forums</a> or on <a href="https://twitter.com/googlewmc" target="_blank">Twitter</a>.<br /> <br /> Posted by <a href="https://twitter.com/methode" target="_blank">Gary</a>, House elf</div> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Official Google Webmaster Central Blog:An update on the Google Webmaster Central blog comments&url=https://webmasters.googleblog.com/2019/01/an-update-on-google-webmaster-central.html?hl=en&via=googlewmc'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=https://webmasters.googleblog.com/2019/01/an-update-on-google-webmaster-central.html?hl=en'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='https://webmasters.googleblog.com/2019/01/an-update-on-google-webmaster-central.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> </div> </div> </div> <div class='blog-pager' id='blog-pager'> <a class='home-link' href='https://webmasters.googleblog.com/?hl=en'> <i class='material-icons'> &#59530; </i> </a> <span id='blog-pager-newer-link'> <a class='blog-pager-newer-link' href='https://webmasters.googleblog.com/search?updated-max=2019-04-04T02:19:00-07:00&max-results=7&reverse-paginate=true&hl=en' id='Blog1_blog-pager-newer-link' title='Newer Posts'> <i class='material-icons'> &#58820; </i> </a> </span> <span id='blog-pager-older-link'> <a class='blog-pager-older-link' href='https://webmasters.googleblog.com/search?updated-max=2019-01-11T01:00:00-08:00&max-results=7&hl=en' id='Blog1_blog-pager-older-link' title='Older Posts'> <i class='material-icons'> &#58824; </i> </a> </span> </div> <div class='clear'></div> </div></div> </div> </div> <div class='col-right'> <div class='section' id='sidebar-top'><div class='widget HTML' data-version='1' id='HTML9'> <div class='widget-content'> <a href="https://www.google.com/webmasters/tools/mobile-friendly/?utm_source=wmc-blog&utm_medium=referral&utm_campaign=blog-nav"><img src="https://lh3.googleusercontent.com/-osGJupx0-HY/VQta1nmaAPI/AAAAAAAACfs/UdMPzubsXFk/w80-h1368-no/blog%2Bpromo.png" align="left" width="80" /></a> Hey! <a href="https://search.google.com/test/mobile-friendly">Check here if your site is mobile-friendly.</a> </div> <div class='clear'></div> </div><div class='widget HTML' data-version='1' id='HTML10'> <div class='widget-content'> <div class='searchBox'> <input type='text' title='Search This Blog' placeholder='Search blog ...' /> </div> </div> <div class='clear'></div> </div></div> <div id='aside'> <div class='section' id='sidebar'><div class='widget Label' data-version='1' id='Label1'> <div class='tab'> <img class='sidebar-icon' src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAYpJREFUeNrs2aFuwzAQBmAvKRkMKRjZA4QMDJaWFgyMjuzFRg37DIUlA3uFkoGQSaWzJU+tpri5O9+l/zSfdFJlpe59yTmyVedq1PjfcZMZ70NuQnaF8w8htyE/rABtpviXkLcK88c5HhLkMBfgVan43zfFBNGMjHVGT/s55KP2pAvidbGHd+nzKt1RKSLG3rKF1iPFv6UWiPke8i7kEqGdGsI1O+LYVdqJAjgirwkKYD0ytkJBUNbAMvX8V3q9PhUsYvU1sWD8SO/sQvx2ahxOiNoJCSBCoAHYCEQAC4EKICOQASQEOmAS8RcAFxFN5hiIiugpgC3wk9hQAHH/70EBHXUN7IER5EWMiBgo2+nzOKQv9SCAeEM/OQAkhE/ncccFICB87qzQMia5FsJfOui0zMnmRvipU1ormHQuxGTxUsAcCFLxJQBLBLn4UoAFglW8BkATwS5eC6CBEBWvCShBiIvXBkgQRcVbADiI4uKtABSESvGWgB9EzHt3+tNwyO0qa9SoIYtvAQYAqDJhaWWeMecAAAAASUVORK5CYII='/> <h2> Labels </h2> <i class='material-icons arrow'> &#58821; </i> </div> <div class='widget-content list-label-widget-content'> <ul> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/accessibility?hl=en'> accessibility </a> <span dir='ltr'> 10 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/advanced?hl=en'> advanced </a> <span dir='ltr'> 195 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/AMP?hl=en'> AMP </a> <span dir='ltr'> 13 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/Android?hl=en'> Android </a> <span dir='ltr'> 2 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/API?hl=en'> API </a> <span dir='ltr'> 7 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/apps?hl=en'> apps </a> <span dir='ltr'> 7 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/autocomplete?hl=en'> autocomplete </a> <span dir='ltr'> 2 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/beginner?hl=en'> beginner </a> <span dir='ltr'> 173 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/CAPTCHA?hl=en'> CAPTCHA </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/Chrome?hl=en'> Chrome </a> <span dir='ltr'> 2 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/cms?hl=en'> cms </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/crawling%20and%20indexing?hl=en'> crawling and indexing </a> <span dir='ltr'> 158 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/encryption?hl=en'> encryption </a> <span dir='ltr'> 3 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/events?hl=en'> events </a> <span dir='ltr'> 51 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/feedback%20and%20communication?hl=en'> feedback and communication </a> <span dir='ltr'> 83 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/forums?hl=en'> forums </a> <span dir='ltr'> 5 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/general%20tips?hl=en'> general tips </a> <span dir='ltr'> 90 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/geotargeting?hl=en'> geotargeting </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/Google%20Assistant?hl=en'> Google Assistant </a> <span dir='ltr'> 3 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/Google%20I%2FO?hl=en'> Google I/O </a> <span dir='ltr'> 3 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/Google%20Images?hl=en'> Google Images </a> <span dir='ltr'> 3 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/Google%20News?hl=en'> Google News </a> <span dir='ltr'> 2 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/hacked%20sites?hl=en'> hacked sites </a> <span dir='ltr'> 12 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/hangout?hl=en'> hangout </a> <span dir='ltr'> 2 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/hreflang?hl=en'> hreflang </a> <span dir='ltr'> 3 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/https?hl=en'> https </a> <span dir='ltr'> 5 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/images?hl=en'> images </a> <span dir='ltr'> 12 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/intermediate?hl=en'> intermediate </a> <span dir='ltr'> 205 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/interstitials?hl=en'> interstitials </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/javascript?hl=en'> javascript </a> <span dir='ltr'> 8 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/job%20search?hl=en'> job search </a> <span dir='ltr'> 2 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/localization?hl=en'> localization </a> <span dir='ltr'> 21 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/malware?hl=en'> malware </a> <span dir='ltr'> 6 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/mobile?hl=en'> mobile </a> <span dir='ltr'> 63 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/mobile-friendly?hl=en'> mobile-friendly </a> <span dir='ltr'> 14 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/nohacked?hl=en'> nohacked </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/performance?hl=en'> performance </a> <span dir='ltr'> 17 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/product%20expert?hl=en'> product expert </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/product%20experts?hl=en'> product experts </a> <span dir='ltr'> 2 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/products%20and%20services?hl=en'> products and services </a> <span dir='ltr'> 63 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/questions?hl=en'> questions </a> <span dir='ltr'> 3 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/ranking?hl=en'> ranking </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/recipes?hl=en'> recipes </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/rendering?hl=en'> rendering </a> <span dir='ltr'> 2 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/Responsive%20Web%20Design?hl=en'> Responsive Web Design </a> <span dir='ltr'> 3 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/rich%20cards?hl=en'> rich cards </a> <span dir='ltr'> 7 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/rich%20results?hl=en'> rich results </a> <span dir='ltr'> 10 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/search%20console?hl=en'> search console </a> <span dir='ltr'> 35 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/search%20for%20beginners?hl=en'> search for beginners </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/search%20queries?hl=en'> search queries </a> <span dir='ltr'> 7 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/search%20results?hl=en'> search results </a> <span dir='ltr'> 140 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/security?hl=en'> security </a> <span dir='ltr'> 12 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/seo?hl=en'> seo </a> <span dir='ltr'> 3 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/sitemaps?hl=en'> sitemaps </a> <span dir='ltr'> 46 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/speed?hl=en'> speed </a> <span dir='ltr'> 6 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/structured%20data?hl=en'> structured data </a> <span dir='ltr'> 33 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/summit?hl=en'> summit </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/TLDs?hl=en'> TLDs </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/url%20removals?hl=en'> url removals </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/UX?hl=en'> UX </a> <span dir='ltr'> 3 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/verification?hl=en'> verification </a> <span dir='ltr'> 8 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/video?hl=en'> video </a> <span dir='ltr'> 6 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/webmaster%20community?hl=en'> webmaster community </a> <span dir='ltr'> 24 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/webmaster%20forum?hl=en'> webmaster forum </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/webmaster%20guidelines?hl=en'> webmaster guidelines </a> <span dir='ltr'> 57 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/webmaster%20tools?hl=en'> webmaster tools </a> <span dir='ltr'> 177 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/webmasters?hl=en'> webmasters </a> <span dir='ltr'> 3 </span> </li> <li> <a dir='ltr' href='https://webmasters.googleblog.com/search/label/youtube%20channel?hl=en'> youtube channel </a> <span dir='ltr'> 6 </span> </li> </ul> <div class='clear'></div> </div> </div><div class='widget BlogArchive' data-version='1' id='BlogArchive1'> <div class='tab'> <i class='material-icons icon'> &#58055; </i> <h2> Archive </h2> <i class='material-icons arrow'> &#58821; </i> </div> <div class='widget-content'> <div id='ArchiveList'> <div id='BlogArchive1_ArchiveList'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'> &#58821; </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'> &#58821; </i> &#160; </span> </a> <a class='post-count-link' href='https://webmasters.googleblog.com/2020/?hl=en'> 2020 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2020/11/?hl=en'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2020/10/?hl=en'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2020/09/?hl=en'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2020/08/?hl=en'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2020/07/?hl=en'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2020/06/?hl=en'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2020/05/?hl=en'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2020/04/?hl=en'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2020/03/?hl=en'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2020/02/?hl=en'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2020/01/?hl=en'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate expanded'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'> &#58821; </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy toggle-open'> <i class='material-icons'> &#58823; </i> &#160; </span> </a> <a class='post-count-link' href='https://webmasters.googleblog.com/2019/?hl=en'> 2019 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2019/12/?hl=en'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2019/11/?hl=en'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2019/10/?hl=en'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2019/09/?hl=en'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2019/08/?hl=en'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2019/07/?hl=en'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2019/06/?hl=en'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2019/05/?hl=en'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2019/04/?hl=en'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2019/03/?hl=en'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2019/02/?hl=en'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate expanded'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2019/01/?hl=en'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'> &#58821; </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'> &#58821; </i> &#160; </span> </a> <a class='post-count-link' href='https://webmasters.googleblog.com/2018/?hl=en'> 2018 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2018/12/?hl=en'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2018/11/?hl=en'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2018/10/?hl=en'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2018/09/?hl=en'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2018/08/?hl=en'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2018/07/?hl=en'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2018/06/?hl=en'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2018/05/?hl=en'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2018/04/?hl=en'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2018/03/?hl=en'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2018/02/?hl=en'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2018/01/?hl=en'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'> &#58821; </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'> &#58821; </i> &#160; </span> </a> <a class='post-count-link' href='https://webmasters.googleblog.com/2017/?hl=en'> 2017 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2017/12/?hl=en'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2017/11/?hl=en'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2017/10/?hl=en'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2017/09/?hl=en'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2017/08/?hl=en'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2017/06/?hl=en'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2017/05/?hl=en'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2017/04/?hl=en'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2017/03/?hl=en'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2017/02/?hl=en'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2017/01/?hl=en'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'> &#58821; </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'> &#58821; </i> &#160; </span> </a> <a class='post-count-link' href='https://webmasters.googleblog.com/2016/?hl=en'> 2016 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2016/12/?hl=en'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2016/11/?hl=en'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2016/10/?hl=en'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2016/09/?hl=en'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2016/08/?hl=en'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2016/06/?hl=en'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2016/05/?hl=en'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2016/04/?hl=en'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2016/03/?hl=en'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2016/01/?hl=en'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'> &#58821; </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'> &#58821; </i> &#160; </span> </a> <a class='post-count-link' href='https://webmasters.googleblog.com/2015/?hl=en'> 2015 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2015/12/?hl=en'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2015/11/?hl=en'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2015/10/?hl=en'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2015/09/?hl=en'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2015/08/?hl=en'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2015/07/?hl=en'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2015/05/?hl=en'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2015/04/?hl=en'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2015/03/?hl=en'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2015/02/?hl=en'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2015/01/?hl=en'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'> &#58821; </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'> &#58821; </i> &#160; </span> </a> <a class='post-count-link' href='https://webmasters.googleblog.com/2014/?hl=en'> 2014 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2014/12/?hl=en'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2014/11/?hl=en'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2014/10/?hl=en'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2014/09/?hl=en'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2014/08/?hl=en'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2014/07/?hl=en'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2014/06/?hl=en'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2014/05/?hl=en'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2014/04/?hl=en'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2014/03/?hl=en'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2014/02/?hl=en'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2014/01/?hl=en'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'> &#58821; </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'> &#58821; </i> &#160; </span> </a> <a class='post-count-link' href='https://webmasters.googleblog.com/2013/?hl=en'> 2013 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2013/12/?hl=en'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2013/11/?hl=en'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2013/10/?hl=en'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2013/09/?hl=en'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2013/08/?hl=en'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2013/07/?hl=en'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2013/06/?hl=en'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2013/05/?hl=en'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2013/04/?hl=en'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2013/03/?hl=en'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2013/02/?hl=en'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2013/01/?hl=en'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'> &#58821; </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'> &#58821; </i> &#160; </span> </a> <a class='post-count-link' href='https://webmasters.googleblog.com/2012/?hl=en'> 2012 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2012/12/?hl=en'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2012/11/?hl=en'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2012/10/?hl=en'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2012/09/?hl=en'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2012/08/?hl=en'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2012/07/?hl=en'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2012/06/?hl=en'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2012/05/?hl=en'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2012/04/?hl=en'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2012/03/?hl=en'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2012/02/?hl=en'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2012/01/?hl=en'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'> &#58821; </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'> &#58821; </i> &#160; </span> </a> <a class='post-count-link' href='https://webmasters.googleblog.com/2011/?hl=en'> 2011 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2011/12/?hl=en'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2011/11/?hl=en'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2011/10/?hl=en'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2011/09/?hl=en'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2011/08/?hl=en'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2011/07/?hl=en'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2011/06/?hl=en'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2011/05/?hl=en'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2011/04/?hl=en'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2011/03/?hl=en'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2011/02/?hl=en'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2011/01/?hl=en'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'> &#58821; </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'> &#58821; </i> &#160; </span> </a> <a class='post-count-link' href='https://webmasters.googleblog.com/2010/?hl=en'> 2010 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2010/12/?hl=en'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2010/11/?hl=en'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2010/10/?hl=en'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2010/09/?hl=en'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2010/08/?hl=en'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2010/07/?hl=en'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2010/06/?hl=en'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2010/05/?hl=en'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2010/04/?hl=en'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2010/03/?hl=en'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2010/02/?hl=en'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2010/01/?hl=en'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'> &#58821; </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'> &#58821; </i> &#160; </span> </a> <a class='post-count-link' href='https://webmasters.googleblog.com/2009/?hl=en'> 2009 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2009/12/?hl=en'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2009/11/?hl=en'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2009/10/?hl=en'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2009/09/?hl=en'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2009/08/?hl=en'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2009/07/?hl=en'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2009/06/?hl=en'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2009/05/?hl=en'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2009/04/?hl=en'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2009/03/?hl=en'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2009/02/?hl=en'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2009/01/?hl=en'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'> &#58821; </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'> &#58821; </i> &#160; </span> </a> <a class='post-count-link' href='https://webmasters.googleblog.com/2008/?hl=en'> 2008 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2008/12/?hl=en'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2008/11/?hl=en'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2008/10/?hl=en'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2008/09/?hl=en'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2008/08/?hl=en'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2008/07/?hl=en'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2008/06/?hl=en'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2008/05/?hl=en'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2008/04/?hl=en'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2008/03/?hl=en'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2008/02/?hl=en'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2008/01/?hl=en'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'> &#58821; </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'> &#58821; </i> &#160; </span> </a> <a class='post-count-link' href='https://webmasters.googleblog.com/2007/?hl=en'> 2007 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2007/12/?hl=en'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2007/11/?hl=en'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2007/10/?hl=en'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2007/09/?hl=en'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2007/08/?hl=en'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2007/07/?hl=en'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2007/06/?hl=en'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2007/05/?hl=en'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2007/04/?hl=en'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2007/03/?hl=en'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2007/02/?hl=en'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2007/01/?hl=en'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'> &#58821; </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'> &#58821; </i> &#160; </span> </a> <a class='post-count-link' href='https://webmasters.googleblog.com/2006/?hl=en'> 2006 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2006/12/?hl=en'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2006/11/?hl=en'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2006/10/?hl=en'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2006/09/?hl=en'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://webmasters.googleblog.com/2006/08/?hl=en'> Aug </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> </div> </div> <div class='clear'></div> </div> </div><div class='widget HTML' data-version='1' id='HTML6'> <div class='widget-content'> <a href="https://googlewebmastercentral.blogspot.com/atom.xml"> <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAihJREFUeNrsWa9Pw0AU7viRMDFRBAkzJDMIBIhJJhCzk7NILIqMv4AEhdz+BCY3OYssAlGBoAJREpZwAlHEBO8lr8nSvNeVbu1dyX3JlzTrXfa+u/e9d7c5joWFhYVO1Fa8PwH2gK6m+BRwAvSlAdsrgr8E1jUuMH73GTAEzrkBWymTewZlihhLmgDXIAFuHgGVQOUF7OSYM1p6PgTuA1vAZlUEvAnPdapcMY0VICECekQ0XRfYrqoHsAGNgXfAoMomRiFDEhOZkkL3S88hMaB2LwXp0bj+ps2edpToZpjfoIDQtBeU+xjoDzP2G/gCPKZ5f8WsCAFJoJgOCcFdWSTeL9YQMSvTA1h9BkI5jaiXhLpSCL/8mVZY0UpyJ9ZdOkniu1dmJ96BpzQu9w6s28gcOq9j6pwLdR8/36NK5CQKwJSMrb2MhhSglBpt4UjsrdsnNu0B3J0HCozbCc4TjyY2srEgos/4RQljCzNxl4ireQD8FOq+T+W0mTB2g7njhlR+Sy2jsXFvU658U8YTbeaGpdIu7mWkEAq5ZtIjIhFZdtfX7QHckSvB2B6zC3VdAkZk0kAQwaXTk/CzTXK3wjIExCs6ZJpTnE4uY1KV+KzFzA3KTiFPENHJkOPcsfpLhwe4btoSuvUqAR+6TOxlCE6ZfKUsJLgsqGW8OpqAGx2X+sLxrwUog+JUeQRMDBIwyXOcnlPtPnL0/UsT/8LnOxYWFhZG4leAAQAAQHEaYuzHbAAAAABJRU5ErkJggg==" class="sidebar-icon" /> <h2>Feed</h2> </a> </div> <div class='clear'></div> </div></div> <div class='section' id='sidebar-bottom'><div class='widget HTML' data-version='1' id='HTML5'> <div class='widget-content'> <div class='followgooglewrapper'> <script src="https://apis.google.com/js/plusone.js"></script></div> <div class="g-ytsubscribe class='followgooglewrapper'" data-channel="GoogleWebmasterHelp" data-layout="full"></div> <div class="share followgooglewrapper"> <button data-href="https://twitter.com/intent/follow?original_referer=https://googlewebmastercentral.blogspot.com/&amp;screen_name=googlewmc" onclick='sharingPopup(this);' id='twitter-share'><span class="twitter-follow">Follow @googlewmc</span></button> <script> function sharingPopup (button) { var url = button.getAttribute("data-href"); window.open( url,'popUpWindow','height=500,width=500,left=10,top=10,resizable=yes,scrollbars=yes,toolbar=yes,menubar=no,location=no,directories=no,status=yes'); } </script> </div> </div> <div class='clear'></div> </div><div class='widget HTML' data-version='1' id='HTML1'> <div class='widget-content'> Give us feedback in our <a href="https://support.google.com/webmasters/go/community">Product Forums</a>. </div> <div class='clear'></div> </div><div class='widget HTML' data-version='1' id='HTML8'> <h2 class='title'> Subscribe via email </h2> <div class='widget-content'> <form #nsubmit="window.open('https://www.feedburner.com/fb/a/emailverifySubmit?feedId=1092589', 'popupwindow', 'scrollbars=yes,width=550,height=520');return true" action="https://www.feedburner.com/fb/a/emailverify" style="border:1px solid #ccc;padding:3px;text-align:center;" target="popupwindow" method="post"><p>Enter your email address:</p><p><input style="width:140px" name="email" type="text"/></p><input value="https://feeds.feedburner.com/~e?ffid=1092589" name="url" type="hidden"/><input value="Official Google Webmaster Central Blog" name="title" type="hidden"/><input value="en_US" name="loc" type="hidden"/><input value="Subscribe" type="submit"/><p>Delivered by <a href="https://www.feedburner.com" target="_blank">FeedBurner</a></p></form> </div> <div class='clear'></div> </div></div> </div> </div> <div style='clear:both;'></div> </div> <!-- Footer --> <div class='google-footer-outer loading'> <div id='google-footer'> <a href='//www.google.com/'> <img class='google-logo-dark' height='36' src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALgAAABICAYAAABFoT/eAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAACLVJREFUeNrsXd+L20YQ3vOprdLqiMXFXE2qB7dcwEcTSB7ykIc+9A/PQx/yEMq1TWhNuYIpJriNr7XpmZ5IxFEvmW2EKs3Ornb1w50PxIFP0kiz387OzM6uhGAwGAxGP3Ho+f7x7ri1O7LdccPqZjSNA4dEHsLfaHcEFedJom93x9Xu2OyOFTcBo6sED3fHZHeMEELrkAHJF0B8Rr+gDFsZ5n0luLTQ95AXs4W06D/tjpR50xtM4CjD0y48YGB4rnyZxNOzyA7zBHr+nLnDaJLg0mo/ALekCasg3Z4XbM0ZdTEgnDPeHY8bIne+Qz2GvwyGNwsuyT218KWvIIBMcwGpLiipcolecjMxfBDchNyS1EvxLiOSIecp31q6IJ/C3yrIrMqMm4jhg+AxkdwbIO3aUO4KjqqMjCT3uaazMBhWBJfuxH3CtRfiXf66DhSRZWbmlMnNaILgZxrXJQO/eO3wORZwvwm4JUxuhheCjzVBYAbW1ces45YDSoZrFNOEE835M8FT6oyeEnws8Fz3QnBxFKPHBMem4GU+m6fPGb0leCTwWcM5B36MPgeZI01gudyDdw3hPeXfo8L/rmCUWnuMMdqUL2WqWeRbhf+twfVsO7YagZGNC79fw7OthEVtkiJ4jJzTd3KPwf3CRqhhiTu23AP5sl0/0xiwISQXpNwLIJK87mHF+U8ddzzdmgKlGzlPYjyxGJQouIhNT4k9AqWEFkqfguIvagTWbcq3KW1WE3xS3m8NtA9WS451xofwjKT5kkDoK/b6mDk5FfXr1lWDL4BofZEv2/SRsK/EHGlGdBdu8QNRb8HMCFwt7Yy3DDI/QP7fx5z3VLhdlJEIs4rKNuXXJXdxZPdB7kfCzWqwCO4V1LHgLjInX3tQ1KzCR52Cz+vDj1dydeRuS74rcvs2Pi6fT5H8OaaUQPQPYcWwRSGXyhhscn5dpAnEFMkuEZetbfkTAnlSuH4DxisE+aMGeJAQ3lFl7C4LJE6QWCaCd583ORQ1jYAwjFctal7nOs2ZZvicwvlZx+RHGrcoAwKUVX8uwcc/9TT65INeDOr5shL9LDRB6QTeIy3zwfdh3WOi6axLCEhSjXU7F3h6LqggUtvyJxpynwu8tDkD98fXApOxRj8zoZ9MnGveYVIVZKaGrkBXCY65BCYNN9NkjpKOyQ81Q79JgdxS+Jn3SDTEXRI7SWzaiSTB32oI3nU3BvMfM0urhOVYgwKhuiAfc4tM07wXwm1ZRoQYSl2NUwiu01fEAHVcpixd745FvVz4dzUUc0o8rwoLy8ZSwU6CyFx1RP5II9+1bFPEFs9HWbNLiimDXE+vCm7u1CS47cofzD3aEhVY57mxRo5zlqdt+RFC1JUH2S7bcVXg4liTMakaBZZVxiTICRoivcn1sEUBlk24JmaC6kxUbYmWoqvyfck2xZGGnDFYa9MMzkYQ1ijkCX6qidybrgePiQ0QIQqoi6qRLeqQfIoRsEHaQJLBdHOnLGetSdm/IPcymJuS1PAnbQPH0MOw/39C1vL11DiLOqIsbDI8QcHvGiLnySi2qUXBicaqUSxN5LEB0g7Jt3ENXJLPJ5S1tnaZBoWbpRqrmjRE7qHmpSmNHdQcYrEUadoh+TbBnc9ri7iycI1kzPeNcLDIvbiqXpez9Tmdq6zGREPuzECBoxrPMiI2WtvyNwhJba2wy3JZ6ky5dD1lSvmZS3e4SPA1wcf1VTFHKX+cGwZzdUYcqpvUtvwrD/InDttVlyZeAKlNN5MKbAiurHhKIPlUuJvlTCCiDjSKSCsUmCFWbGLZwCESfK07JB8LvMYWVtw0D00JEHV8Mq2HkqPbE0oHLvvK2g0o8ETg+4cfwTlZDT9JDoWygu4uQQE/ivIvtcnfPkaCqhiupz7jWOAzqL/vjtcdkv9G4MVMt+EaylfuImiPAXEUjRF3pjjaHiPPZ6If9TGGAO4ZY0am6jOCb+DQ+ZCqLkIpOIPrdNfIjnFPY6nyFut7TS/fanrziOBOKMupKw94WaLMtuVnSFt9CPrWWdJE6PeltCX432DEBoh+5Dv8RRhdis8YAv9uyq4/JAwtlEApgBe9Cw9xDD3tdk4Jn0MDfiHwPHcRPxBePCMER3GuIx7kGlv9fkZ4V9lolx2Uv4X7hEj7qJ3LDoAMGbTRMRibu4L2xQ8bgt8AyU+Q+x7nYrvDnH4iuO5LxKsYwPVbkPMvKF9Zky9wXzRfVWizi62r9X5VHf55h+WHhDjGBZ4WRhyTr6z5SlCoLMxLSpBZFsQ9F80uQFbF/6aFWi+Ev51vzzsuX+msyzuQXXjUz8zEBy+zpq9yweXAoxJW4JbYrDS6gYDqGHxPl+TKeiBfxj9/EBIElPYeOA4y8/qRQfknjvSzgRgtq0Pw/M1eQeMdOSb2Bnrhr6Led+1vcp2x7oTFHMnedFW+Ivlty062BUt74oHgSj+vHepnhunn0JJAMtBZgDI/qmGtMujRv8DDpo47zBJ8UtPOuAR/7rKn8t9AJ0tBdmBAmJ/Fu71yxp4I3qh+DhyRqbi5Y1ShVPlSb8X7bRNcfgZFl+WRGYo7uecrWq1r8X5bhmzP5OdlDwsGRm1suSxkg5rYm7ConyGQ3Zl+DgSD8V/kPwrWBMG9YcBtyShBnTLdTiHgttw7qAW7cqh/ZnmPKr/6ignOaKsdyxbsToT5UkPsW00bJjijDXficcX/JsLs6w2BwGtherdckH3w/kNXRPVI0OqJQoHX42/66IMfMj/2huRjxIidgKV/W0JS+bsstDoTeAHcrI8E5zTh/sDkqxL5rZup55/3USlswfcHf4IrQplVDgW9XFlOqnwr6pVPMMEZTuC60EttvdzbLbaZ4PsFVa3nohhO+vW+yn/ZB2fUhpysmQrzBcTSai9EszuZMcEZ1lCFVrp9zGXhm69iLyY4oxFIa178lPe12I/P2DAYDAaDwWAwGAwGg8FgMBgMBoPBYDD2Cf8IMADDRGoQTe+E9AAAAABJRU5ErkJggg==' style='margin-top: -16px;' width='92'/> </a> <ul> <li> <a href='//www.google.com/'> Google </a> </li> <li> <a href='//www.google.com/policies/privacy/'> Privacy </a> </li> <li> <a href='//www.google.com/policies/terms/'> Terms </a> </li> </ul> </div> </div> <script type='text/javascript'> //<![CDATA[ // Social sharing popups. var postEl = document.getElementsByClassName('social-wrapper'); var postCount = postEl.length; for(i=0; i<postCount;i++){ postEl[i].addEventListener("click", function(event){ var postUrl = this.getAttribute("data-href"); window.open( postUrl,'popUpWindow','height=500,width=500,left=10,top=10,resizable=yes,scrollbars=yes,toolbar=yes,menubar=no,location=no,directories=no,status=yes'); });} //]]> </script> <script type='text/javascript'> //<![CDATA[ var BreakpointHandler = function() { this.initted = false; this.isHomePage = false; this.isMobile = false; }; BreakpointHandler.prototype.finalizeSummary = function(summaryHtml, lastNode) { // Use $.trim for IE8 compatibility summaryHtml = $.trim(summaryHtml).replace(/(<br>|\s)+$/,''); if (lastNode.nodeType == 3) { var lastChar = summaryHtml.slice(-1); if (!lastChar.match(/[.”"?]/)) { if (!lastChar.match(/[A-Za-z]/)) { summaryHtml = summaryHtml.slice(0, -1); } summaryHtml += ' ...'; } } else if (lastNode.nodeType == 1 && (lastNode.nodeName == 'I' || lastNode.nodeName == 'A')) { summaryHtml += ' ...'; } return summaryHtml; }; BreakpointHandler.prototype.generateSummaryFromContent = function(content, numWords) { var seenWords = 0; var summaryHtml = ''; for (var i=0; i < content.childNodes.length; i++) { var node = content.childNodes[i]; var nodeText; if (node.nodeType == 1) { if (node.hasAttribute('data-about-pullquote')) { continue; } nodeText = node.textContent; if (nodeText === undefined) { // innerText for IE8 nodeText = node.innerText; } if (node.nodeName == 'DIV' || node.nodeName == 'B') { // Don't end early if we haven't seen enough words. if (seenWords < 10) { continue; } if (i > 0) { summaryHtml = this.finalizeSummary(summaryHtml, content.childNodes[i-1]); } break; } summaryHtml += node.outerHTML; } else if (node.nodeType == 3) { nodeText = node.nodeValue; summaryHtml += nodeText + ' '; } var words = nodeText.match(/\S+\s*/g); if (!words) { continue; } var remain = numWords - seenWords; if (words.length >= remain) { summaryHtml = this.finalizeSummary(summaryHtml, node); break; } seenWords += words.length; } return summaryHtml; }; BreakpointHandler.prototype.detect = function() { var match, pl = /\+/g, search = /([^&=]+)=?([^&]*)/g, decode = function (s) { return decodeURIComponent(s.replace(pl, " ")); }, query = window.location.search.substring(1); var urlParams = {}; while (match = search.exec(query)) urlParams[decode(match[1])] = decode(match[2]); this.isListPage = $('html').hasClass('list-page'); this.isMobile = urlParams['m'] === '1'; this.isHomePage = window.location.pathname == '/'; }; BreakpointHandler.prototype.initContent = function() { var self = this; $('.post').each(function(index) { var body = $(this).children('.post-body')[0]; var content = $(body).children('.post-content')[0]; $(content).addClass('post-original'); var data = $(content).children('script').html(); data = self.rewriteForSSL(data); // If exists, extract specified editor's preview. var match = data.match(/([\s\S]+?)<div data-is-preview.+?>([\s\S]+)<\/div>/m); if (match) { data = match[1]; } // Prevent big images from loading when they aren't needed. // This must be done as a pre-injection step, since image loading can't be // canceled once embedded into the DOM. if (self.isListPage && self.isMobile) { data = data.replace(/<(img|iframe) .+?>/g, ''); } // Insert template to be rendered as nodes. content.innerHTML = data; if (self.isListPage) { var summary = document.createElement('div'); $(summary).addClass('post-content'); $(summary).addClass('post-summary'); body.insertBefore(summary, content); if (match) { // Use provided summary. summary.innerHTML = match[2]; } else { // Generate a summary. // Summary generation relies on DOM, so it must occur after content is // inserted into the page. summary.innerHTML = self.generateSummaryFromContent(content, 30); } // Add read more link to summary. var titleAnchor = $(this).find('.title a')[0]; var link = titleAnchor.cloneNode(true); link.innerHTML = 'Read More'; $(link).addClass('read-more'); summary.appendChild(link); } }); // Firefox does not allow for proper styling of BR. if (navigator.userAgent.indexOf('Firefox') > -1) { $('.post-content br').replaceWith('<span class="space"></span>'); } $('.loading').removeClass('loading'); }; BreakpointHandler.prototype.process = function() { if (!this.initted) { var makeInsecureImageRegex = function(hosts) { var whitelist = hosts.join('|').replace(/\./g,'\\.'); // Normal image tags, plus input images (yes, this is possible!) return new RegExp('(<(img|input)[^>]+?src=("|\'))http:\/\/(' + whitelist +')', 'g'); }; this.sslImageRegex = makeInsecureImageRegex(BreakpointHandler.KNOWN_HTTPS_HOSTS); this.sslImageCurrentDomainRegex = makeInsecureImageRegex([window.location.hostname]); this.detect(); this.initContent(); this.initted = true; } }; BreakpointHandler.KNOWN_HTTPS_HOSTS = [ "www.google.org", "www.google.com", "services.google.com", "blogger.com", "draft.blogger.com", "www.blogger.com", "photos1.blogger.com", "photos2.blogger.com", "photos3.blogger.com", "blogblog.com", "img1.blogblog.com", "img2.blogblog.com", "www.blogblog.com", "www1.blogblog.com", "www2.blogblog.com", "0.bp.blogspot.com", "1.bp.blogspot.com", "2.bp.blogspot.com", "3.bp.blogspot.com", "4.bp.blogspot.com", "lh3.googleusercontent.com", "lh4.googleusercontent.com", "lh5.googleusercontent.com", "lh6.googleusercontent.com", "themes.googleusercontent.com", ]; BreakpointHandler.prototype.rewriteForSSL = function(html) { // Handle HTTP -> HTTPS source replacement of images, movies, and other embedded content. return html.replace(this.sslImageRegex, '$1https://$4') .replace(this.sslImageCurrentDomainRegex, '$1//$4') .replace(/(<(embed|iframe)[^>]+?src=("|'))http:\/\/([^"']*?(youtube|picasaweb\.google)\.com)/g, '$1https://$4') // Slideshow SWF takes a image host, so we need to rewrite that parameter. .replace(/(<embed[^>]+?feed=http(?=[^s]))/g, '$1s'); }; $(document).ready(function() { var handler = new BreakpointHandler(); handler.process(); // Top-level navigation. $(".BlogArchive .tab").click(function(ev) { ev.preventDefault(); $(this).parent().toggleClass('active'); $(this).siblings().slideToggle(300); }); $(".Label .tab").click(function(ev) { ev.preventDefault(); $(this).parent().toggleClass('active'); $(this).siblings().slideToggle(300); }); // Blog archive year expansion. $('.BlogArchive .intervalToggle').click(function(ev) { ev.preventDefault(); if ($(this).parent().hasClass('collapsed')) { $(this).parent().removeClass('collapsed'); $(this).parent().addClass('expanded'); } else { $(this).parent().removeClass('expanded'); $(this).parent().addClass('collapsed'); } }); // Reverse order of months. $('.BlogArchive .intervalToggle + div').each(function(_, items) { var year = $(this); year.children().each(function(_, month) { year.prepend(month); }); }); // Set anchors to open in new tab. $('.post-content img').parent().each(function(_, node) { if (node.nodeName == 'A') { $(this).attr('target', '_blank'); } }); // Process search requests. $('.searchBox input').on("keypress", function(ev) { if (ev.which == 13) { window.location.href = 'https://www.google.com/search?q=site%3A' + window.location.hostname + '%20' + encodeURIComponent ($(this).val()); } }); }); //]]> </script> <script type="text/javascript" src="https://www.blogger.com/static/v1/widgets/984859869-widgets.js"></script> <script type='text/javascript'> window['__wavt'] = 'AOuZoY6zRFZ3mhM6uyZ_WfjCtafZSNQkcA:1732782449521';_WidgetManager._Init('//www.blogger.com/rearrange?blogID\x3d32069983','//webmasters.googleblog.com/2019/01/?hl\x3den','32069983'); _WidgetManager._SetDataContext([{'name': 'blog', 'data': {'blogId': '32069983', 'title': 'Official Google Webmaster Central Blog', 'url': 'https://webmasters.googleblog.com/2019/01/?hl\x3den', 'canonicalUrl': 'https://webmasters.googleblog.com/2019/01/', 'homepageUrl': 'https://webmasters.googleblog.com/?hl\x3den', 'searchUrl': 'https://webmasters.googleblog.com/search', 'canonicalHomepageUrl': 'https://webmasters.googleblog.com/', 'blogspotFaviconUrl': 'https://webmasters.googleblog.com/favicon.ico', 'bloggerUrl': 'https://www.blogger.com', 'hasCustomDomain': true, 'httpsEnabled': true, 'enabledCommentProfileImages': false, 'gPlusViewType': 'FILTERED_POSTMOD', 'adultContent': false, 'analyticsAccountNumber': 'UA-18009-4', 'encoding': 'UTF-8', 'locale': 'en', 'localeUnderscoreDelimited': 'en', 'languageDirection': 'ltr', 'isPrivate': false, 'isMobile': false, 'isMobileRequest': false, 'mobileClass': '', 'isPrivateBlog': false, 'isDynamicViewsAvailable': true, 'feedLinks': '\x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22Official Google Webmaster Central Blog - Atom\x22 href\x3d\x22https://webmasters.googleblog.com/feeds/posts/default\x22 /\x3e\n\x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/rss+xml\x22 title\x3d\x22Official Google Webmaster Central Blog - RSS\x22 href\x3d\x22https://webmasters.googleblog.com/feeds/posts/default?alt\x3drss\x22 /\x3e\n\x3clink rel\x3d\x22service.post\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22Official Google Webmaster Central Blog - Atom\x22 href\x3d\x22https://www.blogger.com/feeds/32069983/posts/default\x22 /\x3e\n', 'meTag': '', 'adsenseHostId': 'ca-host-pub-1556223355139109', 'adsenseHasAds': false, 'adsenseAutoAds': false, 'boqCommentIframeForm': true, 'loginRedirectParam': '', 'view': '', 'dynamicViewsCommentsSrc': '//www.blogblog.com/dynamicviews/4224c15c4e7c9321/js/comments.js', 'dynamicViewsScriptSrc': '//www.blogblog.com/dynamicviews/2fafd358a4bcb2b4', 'plusOneApiSrc': 'https://apis.google.com/js/platform.js', 'disableGComments': true, 'interstitialAccepted': false, 'sharing': {'platforms': [{'name': 'Get link', 'key': 'link', 'shareMessage': 'Get link', 'target': ''}, {'name': 'Facebook', 'key': 'facebook', 'shareMessage': 'Share to Facebook', 'target': 'facebook'}, {'name': 'BlogThis!', 'key': 'blogThis', 'shareMessage': 'BlogThis!', 'target': 'blog'}, {'name': 'X', 'key': 'twitter', 'shareMessage': 'Share to X', 'target': 'twitter'}, {'name': 'Pinterest', 'key': 'pinterest', 'shareMessage': 'Share to Pinterest', 'target': 'pinterest'}, {'name': 'Email', 'key': 'email', 'shareMessage': 'Email', 'target': 'email'}], 'disableGooglePlus': true, 'googlePlusShareButtonWidth': 0, 'googlePlusBootstrap': '\x3cscript type\x3d\x22text/javascript\x22\x3ewindow.___gcfg \x3d {\x27lang\x27: \x27en\x27};\x3c/script\x3e'}, 'hasCustomJumpLinkMessage': false, 'jumpLinkMessage': 'Read more', 'pageType': 'archive', 'pageName': 'January 2019', 'pageTitle': 'Official Google Webmaster Central Blog: January 2019', 'metaDescription': 'Official news on crawling and indexing sites for the Google index'}}, {'name': 'features', 'data': {}}, {'name': 'messages', 'data': {'edit': 'Edit', 'linkCopiedToClipboard': 'Link copied to clipboard!', 'ok': 'Ok', 'postLink': 'Post Link'}}, {'name': 'template', 'data': {'name': 'custom', 'localizedName': 'Custom', 'isResponsive': false, 'isAlternateRendering': false, 'isCustom': true}}, {'name': 'view', 'data': {'classic': {'name': 'classic', 'url': '?view\x3dclassic'}, 'flipcard': {'name': 'flipcard', 'url': '?view\x3dflipcard'}, 'magazine': {'name': 'magazine', 'url': '?view\x3dmagazine'}, 'mosaic': {'name': 'mosaic', 'url': '?view\x3dmosaic'}, 'sidebar': {'name': 'sidebar', 'url': '?view\x3dsidebar'}, 'snapshot': {'name': 'snapshot', 'url': '?view\x3dsnapshot'}, 'timeslide': {'name': 'timeslide', 'url': '?view\x3dtimeslide'}, 'isMobile': false, 'title': 'Official Google Webmaster Central Blog', 'description': 'Official news on crawling and indexing sites for the Google index', 'url': 'https://webmasters.googleblog.com/2019/01/?hl\x3den', 'type': 'feed', 'isSingleItem': false, 'isMultipleItems': true, 'isError': false, 'isPage': false, 'isPost': false, 'isHomepage': false, 'isArchive': true, 'isLabelSearch': false, 'archive': {'year': 2019, 'month': 1, 'rangeMessage': 'Showing posts from January, 2019'}}}]); _WidgetManager._RegisterWidget('_HeaderView', new _WidgetInfo('Header1', 'header', document.getElementById('Header1'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_BlogView', new _WidgetInfo('Blog1', 'main', document.getElementById('Blog1'), {'cmtInteractionsEnabled': false}, 'displayModeFull')); _WidgetManager._RegisterWidget('_HTMLView', new _WidgetInfo('HTML9', 'sidebar-top', document.getElementById('HTML9'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_HTMLView', new _WidgetInfo('HTML10', 'sidebar-top', document.getElementById('HTML10'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_LabelView', new _WidgetInfo('Label1', 'sidebar', document.getElementById('Label1'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_BlogArchiveView', new _WidgetInfo('BlogArchive1', 'sidebar', document.getElementById('BlogArchive1'), {'languageDirection': 'ltr', 'loadingMessage': 'Loading\x26hellip;'}, 'displayModeFull')); _WidgetManager._RegisterWidget('_HTMLView', new _WidgetInfo('HTML6', 'sidebar', document.getElementById('HTML6'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_HTMLView', new _WidgetInfo('HTML5', 'sidebar-bottom', document.getElementById('HTML5'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_HTMLView', new _WidgetInfo('HTML1', 'sidebar-bottom', document.getElementById('HTML1'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_HTMLView', new _WidgetInfo('HTML8', 'sidebar-bottom', document.getElementById('HTML8'), {}, 'displayModeFull')); </script> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10