App-like websites can improve page speed and user engagement, but they also rely heavily on JavaScript and JS frameworks that can make many ‘SEO basics’ more technically complex. Emily will walk you through often-missed tactics to make web-apps indexable, optimised, and performant on mobile devices.
4. #SearchLove @goutaste
Websites Have Great Reach
11.4
4.0
Monthly Unique Visitors
Top 1k web properties vs. top 1k apps
Data: comScore Mobile Metrix Age 18+ June 2016
5. #SearchLove @goutaste
Native Apps Have Great Engagement
9.3
188.6
Average Minutes Per User
Top 1k web properties vs. top 1k apps
Data: comScore Mobile Metrix Age 18+ June 2016
6. #SearchLove @goutaste
Can We Have The Best of Both?
The REACH of
a website
The ENGAGEMENT
of an app
Image: http://bit.ly/platypus-keytar
7. #SearchLove @goutaste
What is a Web App?
Traditional Multipage Website Single Page App Lifecycle
Images: http://bit.ly/2rouUqH
9. #SearchLove @goutaste
What is a Single Page Web App?
bit.ly/app-shell-img
Single page
persists with
branding
elements
Content
changes
without full
page reload
10. #SearchLove @goutaste
What is a Progressive Web App?
Responsive Secure Fast
Downloadable Works Offline Push Notifications
11. #SearchLove @goutaste
Why are PWAs popular?
Mobile sales increased by 18% YoY
43% increase in sessions/ user
100% increase in session duration 80% improvement in load time
30% higher Conversion Rate than
native app in Tier 3 cities
20% of PWA bookings are from
users who’d uninstalled native app
Homepage loads completely in .8
seconds
Customer acquisition cost is 10X less Shoppers spend 20% more time
than on previous mobile site
40% lower bounce rate than on
previous mobile site
https://www.pwastats.com/
23. #SearchLove @goutaste
Web Apps Don’t Have to Change URLs to
Change Content on the Page
Even on the finance tab, the URL still stays the
same
Crawling & Indexing
24. #SearchLove @goutaste
But a Web Page Needs a URL To Get Indexed
Crawling & Indexing
No /finance URL
existed, so no
/finance page got
indexed!
25. #SearchLove @goutaste
Old Linking Habits of JS-Heavy Web Applications
By default:
https://example.com/#/foo
For deprecated AJAX crawling scheme:
https://example.com/#!foo
(And ?_escaped_fragment=foo)
Crawling & Indexing
27. #SearchLove @goutaste
Long Live the History API
Change URLs in the
address bar without
reloading the whole
page
Allow for effective use
of the “back” button
https://css-tricks.com/using-the-html5-history-api/
Crawling & Indexing
31. #SearchLove @goutaste
Welcome to the JavaScript Web
View Source Inspect Element
Original HTML The DOM as it was interpreted by
the browser.
Crawling & Indexing
36. #SearchLove @goutaste
But Uh… Good LuckWith That
Googlebot may only be willing to wait 4-5 sec for your JS to render…
https://maxxeight.com/tests/js-timer/@maxxeight
Crawling & Indexing
37. #SearchLove @goutaste
Crawling & Indexing
AndWhat About Other Search Engines?
@bart_goralewicz https://moz.com/blog/search-engines-ready-for-javascript-
crawling
44. #SearchLove @goutaste
Server Side Rendering Your Content
https://www.youtube.com/watch?v=0wvZ7gakqV4
If you search for any competitive keyword terms, it’s always
going to be server rendered sites. And the reason is because
although Google does index client-side rendered HTML, it’s not
perfect yet and other search engines don’t do it as well.
So if you care about SEO, you still need to
have server-rendered content.
“
“
-- Jeff Whelpley
Crawling & Indexing
50. #SearchLove @goutaste
Use Headless Browsers to render &
serialize initial state of the page. Serve this
to users without JS & to search engines.
http://bit.ly/headless-chrome
Option #1b?
Crawling & Indexing
51. #SearchLove @goutaste
Crawling & Indexing
github.com/GoogleChrome/rendertron
Or Leverage Existing Solutions
That Do This For You
Prerender.io
52. #SearchLove @goutaste
Option #2: Focus Only on Getting Google
to RenderYour Client-side JS Effectively
“ “
Crawling & Indexing
https://www.chromestatus.com/features#milestone%3C%3D41
https://commondatastorage.googleapis.com/chromium-browser-snapshots/index.html?prefix=Win/310958/
57. #SearchLove @goutaste
Remember this?
Mobile sales increased by 18% YoY
43% increase in sessions/ user
100% increase in session duration 80% improvement in load time
30% higher Conversion Rate than
native app in Tier 3 cities
20% of PWA bookings are from
users who’d uninstalled native app
Homepage loads completely in .8
seconds
Customer acquisition cost is 10X less Shoppers spend 20% more time
than on previous mobile site
40% lower bounce rate than on
previous mobile site
https://www.pwastats.com/
EngagementCrawling & Indexing
58. #SearchLove @goutaste
The App-Like Web: Progressive Web Apps
EngagementCrawling & Indexing
Launch from homescreen/
Fullscreen mode
Send push notifications“Install” web app:
Add to Homescreen web banner
62. #SearchLove @goutaste
PWAs = Death to the Dino
(Someone else made this illustration, and I photographed it. Now I cannot remember who. SORRY.)
EngagementCrawling & Indexing
64. #SearchLove @goutaste
1. App Manifest
http://bit.ly/webapp-manifest
Chrome Dev Tools ViewJSON file you link to in your
<head>
EngagementCrawling & Indexing
65. #SearchLove @goutaste
2. Service Worker
Web App Network
Cache
Service Worker
Get /hero.png
I borrowed this analogy from @jeffposnick
EngagementCrawling & Indexing
66. #SearchLove @goutaste
2. Service Worker
Web App Network
Cache
Service Worker
Get /hero.png
I borrowed this analogy from @jeffposnick
EngagementCrawling & Indexing
67. #SearchLove @goutaste
2. Service Worker
Web App Network
Cache
Service Worker
Get /hero.png
I borrowed this analogy from @jeffposnick
EngagementCrawling & Indexing
68. #SearchLove @goutaste
2. Service Worker
Web App Network
Cache
Service Worker
Get /hero.png
I borrowed this analogy from @jeffposnick
EngagementCrawling & Indexing
77. #SearchLove @goutaste@addyosmani
“The bloat of your baseline defines how
much headroom you have for app code”
How much is taken up by your framework?
http://bit.ly/pwas-the-new-normal
EngagementCrawling & Indexing
81. #SearchLove @goutaste
Set UpYour Service Worker to Cache
Essential Assets on User Interaction
document.querySelector('.cache-article').addEventListener('click', function(event) {
event.preventDefault();
var id = this.dataset.articleId;
caches.open('mysite-article-' + id).then(function(cache) {
fetch('/get-article-urls?id=' + id).then(function(response) {
// /get-article-urls returns a JSON-encoded array of
// resource URLs that a given article depends on
return response.json();
}).then(function(urls) {
cache.addAll(urls);
});
});
});
(ex. “save for offline” button)
http://bit.ly/sw-caching
EngagementCrawling & Indexing
87. #SearchLove @goutaste
One of the
Issues With
Server-Side
Rendering is
The Trade-
Off With
Time to
Interactive
Simulated Slow Networkhttps://youtu.be/6Ljq-Jn-EgU
88. #SearchLove @goutaste
One of the
Issues With
Server-Side
Rendering is
The Trade-
Off With
Time to
Interactive
Simulated Slow Networkhttps://youtu.be/6Ljq-Jn-EgU
89. #SearchLove @goutaste
TTI has a
high
correlation
with
conversion
rates
bit.ly/google-measure-performance
EngagementCrawling & Indexing
90. #SearchLove @goutasteSee Also: http://bit.ly/code-splitting-webpack
READ THIS TO START: https://survivejs.com/webpack/building/code-splitting/
EngagementCrawling & Indexing
Break up existing JS
into smaller chunks
(“Code Splitting”)
Make it Useable Faster:
Minimize Time Between FMP & TTI
91. #SearchLove @goutaste
Break up existing JS
into smaller chunks
(“Code Splitting”)
Follow the PRPL
(‘purple’) Pattern*
http://bit.ly/push-render-precache-lazyload
*”push” references H/2 push and requires http2
EngagementCrawling & Indexing
Make it Useable Faster:
Minimize Time Between FMP & TTI
92. #SearchLove @goutaste
Link Rel=Preload
• Pre-load can specify the download “as” =
• "script", JavaScript file
• "style", Stylesheet
• "image", image file
• “font”, font file
• ”video", video file
• "document” html document for embedding
• And more…
bit.ly/what-is-rel-preload
HTTP/2 + Preload = Moves the ‘start download’ time of a critical asset closer to initial
request
EngagementCrawling & Indexing
99. #SearchLove @goutaste
WebPageTest Has More Useful Feedback
EngagementCrawling & Indexing Measurement
PRO TIP: Try webpagetest.org/easy for throttled, low-end device
100. #SearchLove @goutaste
Performance Tab in
Chrome Dev Tools
EngagementCrawling & Indexing Measurement
(Formerly Called ‘Timeline’)
More Simulated
‘Lab’Testing
101. #SearchLove @goutaste
Reality:
Load metrics aren’t a single number
& real user metrics paint a fuller
picture
https://youtu.be/6Ljq-Jn-EgU
EngagementCrawling & Indexing Measurement
102. #SearchLove @goutasteLearn more about using PerformanceObserver:
https://developers.google.com/web/updates/2017/06/user-centric-performance-metrics
EngagementCrawling & Indexing Measurement
But beware of survivorship b
Track Real Users’ Load Times with Browser APIs (like
PerformanceObserver)
108. #SearchLove @goutaste
Thank You!
var me = {
name: “Emily Grossman”,
title: “Director of App Strategy”,
work: “MobileMoxie”,
twitter: “@goutaste”,
house: “slytherin”
};
var cat = {
name: “Daenerys Furborn of the House
Grossman, First of Her Name, the Unfed,
Queen of the Bengals, Catleesi of the
Great Scratching post, Breaker of Treats
and Mother of Cuddles”
};
109. #SearchLove @goutaste
Super-Smart, Helpful People
@ipullrank
@samccone@slightlylate
Technical SEO
PerformancePWAs & Perf
@basgr
Performance & SEO
@addyosmani
PWAs & Chrome
@theLarkInn
Webpack
@bart_goralewicz
JS SEO
@maxxeight
Technical & JS SEO
@jonoalderson
Robots & rants
@alexisksanders
Technical & JS SEO
@eywu
Technical & JS SEO
@suzzicks
Mobile