Top Banner
Building a Like-able (and Searchable) Ember App Ember Denver Meetup Sept 30, 2015
56

Denver emberjs-sept-2015

Jan 12, 2017

Download

Technology

Ron White
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Denver emberjs-sept-2015

Building a Like-able (and Searchable)

Ember AppEmber Denver Meetup Sept 30, 2015

Page 2: Denver emberjs-sept-2015

Ron White! ronco " @ronco1337

Page 3: Denver emberjs-sept-2015

I’m No SEO Expert

Page 4: Denver emberjs-sept-2015

#Sh*tMySEOExpertSays

“Defer loading all JavaScript until after the page has loaded.”

I’m No SEO Expert

Page 5: Denver emberjs-sept-2015

Techniques for Making Ember Searchable

I’m No SEO Expert

Page 6: Denver emberjs-sept-2015

Lots of Great Ember Apps

Page 7: Denver emberjs-sept-2015
Page 8: Denver emberjs-sept-2015

Delivery Company Blog

Page 9: Denver emberjs-sept-2015
Page 10: Denver emberjs-sept-2015

How do you drive traffic to these sites?

Page 11: Denver emberjs-sept-2015

Time to Make a Metaphorical Deal

With The Devil

Page 12: Denver emberjs-sept-2015

Time to Make a Deal With The Devil

Page 13: Denver emberjs-sept-2015
Page 14: Denver emberjs-sept-2015
Page 15: Denver emberjs-sept-2015
Page 16: Denver emberjs-sept-2015
Page 17: Denver emberjs-sept-2015
Page 18: Denver emberjs-sept-2015
Page 19: Denver emberjs-sept-2015
Page 20: Denver emberjs-sept-2015

Demo

http://peblog-3000.herokuapp.com/?index_key=dc3041e

Page 21: Denver emberjs-sept-2015

Bots have their own language

Page 22: Denver emberjs-sept-2015

• Content is King

• Data is pulled directly from your markup

• Structure should be logical and useful to users

• Avoid Repeated Content (Canonicalization)

• Links to/from Your Site Drive Importance

• Easy to Implement, Lifetime to Master

Source: https://support.google.com/webmasters/answer/40349?hl=en

Page 23: Denver emberjs-sept-2015

• Facebook Open Graph

• Dedicated Meta Tag Markup in Head

• Requires Canonicalization

• Shared Open Spec

Page 24: Denver emberjs-sept-2015

1 <meta property="og:url" 2 content="http://www.nytimes.com/.../mars-life-liquid-water.html"> 3 <meta property="og:type" content="article"> 4 <meta property="og:title" 5 content="NASA Confirms Signs of Water Flowing on Mars, Possible 6 Niches for Life">

Page 25: Denver emberjs-sept-2015

• Twitter Cards

• Dedicated Meta Tag Markup in Head

• Will Read Open Graph Also

Page 26: Denver emberjs-sept-2015

1 <meta name="twitter:card" value="summary"> 2 <meta name="twitter:site" value="@nytimes"> 3 <meta property="twitter:url" 4 content=“http://.../mars-life-liquid-water.html”> 5 <meta property=“twitter:title" 6 content="NASA Confirms Signs of Water Flowing on Mars, 7 Possible Niches for Life">

Page 27: Denver emberjs-sept-2015

schema.org

• Used by Pinterest & Google Structured Data

Page 28: Denver emberjs-sept-2015

Let’s Mark-up Our Blog

Page 29: Denver emberjs-sept-2015

./app/index.html 1 <meta property="og:title" 2 content="The Latest Happenings At New New York's Greatest 3 Delivery Service"> 4 <meta property="og:site_name" content="Planet Express Blog"/> 5 <meta property="og:description" 6 content="The Employees of Planet Express, New New York's 7 Greatest Delivery Service, have a lot to say. Hear 8 all their latest musings on the Planet Express Blog." 9 /> 10 <meta property="og:type" content="website" /> 11 <meta property="og:image" content="/images/pe-logo.png" />

Page 30: Denver emberjs-sept-2015

Demo

http://peblog-3000.herokuapp.com/?index_key=e4df1d5

Page 31: Denver emberjs-sept-2015

Not Very Practical

Page 32: Denver emberjs-sept-2015

$ ember install ember-cli-meta-tags

Page 33: Denver emberjs-sept-2015

./app/routes/application.js 1 import Ember from 'ember'; 2 3 export default Ember.Route.extend({ 4 model() { 5 return this.get('store').findAll('author'); 6 }, 7 8 headTags() { 9 return [ 10 { 11 tagId: 'og:title', 12 type: 'meta', 13 attrs: { 14 property: 'og:title', 15 content: "The Latest Happenings At New New York's Greatest 16 Delivery Service" 17 } 18 }, 19 { 20 tagId: 'og:site_name', 21 type: 'meta', 22 attrs: { 23 property: 'og:site_name', 24 content: "Planet Express Blog", 25 } 26 }, 27 // ... 28 ]; 29 } 30 }); 31

Page 34: Denver emberjs-sept-2015

./app/routes/application.js

8 headTags() { 9 return [ 10 { 11 tagId: 'og:title', 12 type: 'meta', 13 attrs: { 14 property: 'og:title', 15 content: "The Latest Happenings At New New York's Greatest 16 Delivery Service" 17 } 18 }, 27 // ... 28 ];

Page 35: Denver emberjs-sept-2015

./app/routes/author.js 1 headTags() { 2 let model = this.modelFor(this.routeName); 3 return [ 4 { 5 tagId: 'og:title', 6 type: 'meta', 7 attrs: { 8 property: 'og:title', 9 content: model.get('name') 10 } 11 }, 12 // ... 13 ]; 14 }

Page 36: Denver emberjs-sept-2015

./app/routes/post.js

1 headTags() { 2 let model = this.modelFor(this.routeName); 3 return [ 4 { 5 tagId: 'og:title', 6 type: 'meta', 7 attrs: { 8 property: 'og:title', 9 content: model.get('title') 10 } 11 },

Page 37: Denver emberjs-sept-2015

./app/routes/author/post.js 1 headTags() { 2 let model = this.modelFor(this.routeName); 3 let queryParams = { 4 index_key: this.controllerFor('application').get('indexKey') 5 }; 6 let router = this.get('router'); 7 let path = this.get('router').generate.apply(router, [ 8 'post', model, { 9 queryParams: queryParams 10 } 11 ]); 12 let cannonicalUrl = `${window.location.origin}${path}`; 13 return [ 14 // ... 15 { 16 tagId: 'og:url', 17 type: 'meta', 18 attrs: { 19 property: 'og:url', 20 content: cannonicalUrl, 21 } 22 }, 23 ]; 24 }

Page 38: Denver emberjs-sept-2015

./app/routes/author/post.js

2 let model = this.modelFor(this.routeName); 3 let queryParams = { 4 index_key: this.controllerFor('application').get('indexKey') 5 }; 6 let router = this.get('router'); 7 let path = this.get('router').generate.apply(router, [ 8 'post', model, { 9 queryParams: queryParams 10 } 11 ]); 12 let cannonicalUrl = `${window.location.origin}${path}`;

Page 39: Denver emberjs-sept-2015

./app/routes/author/post.js 1 headTags() { 2 let model = this.modelFor(this.routeName); 3 let queryParams = { 4 index_key: this.controllerFor('application').get('indexKey') 5 }; 6 let router = this.get('router'); 7 let path = this.get('router').generate.apply(router, [ 8 'post', model, { 9 queryParams: queryParams 10 } 11 ]); 12 let cannonicalUrl = `${window.location.origin}${path}`; 13 return [ 14 // ... 15 { 16 tagId: 'og:url', 17 type: 'meta', 18 attrs: { 19 property: 'og:url', 20 content: cannonicalUrl, 21 } 22 }, 23 ]; 24 }

Page 40: Denver emberjs-sept-2015

./app/routes/author/post.js

15 { 16 tagId: 'og:url', 17 type: 'meta', 18 attrs: { 19 property: 'og:url', 20 content: cannonicalUrl, 21 } 22 },

Page 41: Denver emberjs-sept-2015

Demo

http://peblog-3000.herokuapp.com/?index_key=ddcec57

Page 42: Denver emberjs-sept-2015

Bots don’t speak Javascript

Page 43: Denver emberjs-sept-2015
Page 44: Denver emberjs-sept-2015

$ npm install prerender-node

Page 45: Denver emberjs-sept-2015

<server>/index.js

1 app.use(require(‘prerender-node') 2 .set('prerenderToken', process.env.PRERENDER_TOKEN));

Page 46: Denver emberjs-sept-2015

./app/index.html

1 <meta name="fragment" content="!">

Page 47: Denver emberjs-sept-2015

Ajax Crawling

Page 48: Denver emberjs-sept-2015

http://www.example.org/#mypage

Page 49: Denver emberjs-sept-2015

http://www.example.org/?_escaped_fragment_=mypage

Page 50: Denver emberjs-sept-2015

http://www.example.org/mypage

Page 51: Denver emberjs-sept-2015

http://www.example.org/mypage?_escaped_fragment_=

Page 52: Denver emberjs-sept-2015

Demo

http://peblog-3000.herokuapp.com/?index_key=da65289

Page 53: Denver emberjs-sept-2015

$ ember install ember-cli-fastboot

Page 54: Denver emberjs-sept-2015

ember-cli-fastboot

• Ember Core Team Provided Pre-rendering

• Deferred Injection of Scripts

• Available as Node Middleware

• Extremely Alpha

• Bugs & Incomplete

Page 55: Denver emberjs-sept-2015

Demo

Page 56: Denver emberjs-sept-2015

• https://support.google.com/webmasters/answer/40349?hl=en

• http://static.googleusercontent.com/media/www.google.com/en//webmasters/docs/search-engine-optimization-starter-guide.pdf

• https://developers.google.com/webmasters/ajax-crawling/docs/getting-started?hl=en

• https://dev.twitter.com/cards/overview

• http://ogp.me/

• https://developers.facebook.com/tools/debug/