SlideShare a Scribd company logo
Building a Like-able
(and Searchable)
Ember App
Ember Denver Meetup Sept 30, 2015
Ron White
! ronco
" @ronco1337
I’m No SEO Expert
#Sh*tMySEOExpertSays
“Defer loading all JavaScript until
after the page has loaded.”
I’m No SEO Expert
Techniques for Making Ember
Searchable
I’m No SEO Expert
Lots of Great Ember
Apps
Denver emberjs-sept-2015
Delivery Company
Blog
Denver emberjs-sept-2015
How do you drive
traffic to these sites?
Time to Make a
Metaphorical Deal
With The Devil
Time to Make a Deal
With The Devil
Denver emberjs-sept-2015
Denver emberjs-sept-2015
Denver emberjs-sept-2015
Denver emberjs-sept-2015
Denver emberjs-sept-2015
Denver emberjs-sept-2015
Denver emberjs-sept-2015
Demo
http://peblog-3000.herokuapp.com/?
index_key=dc3041e
Bots have their own
language
• 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
• Facebook Open Graph
• Dedicated Meta Tag Markup in Head
• Requires Canonicalization
• Shared Open Spec
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">
• Twitter Cards
• Dedicated Meta Tag Markup in Head
• Will Read Open Graph Also
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">
schema.org
• Used by Pinterest & Google Structured Data
Let’s Mark-up Our Blog
./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" />
Demo
http://peblog-3000.herokuapp.com/?
index_key=e4df1d5
Not Very Practical
$ ember install ember-cli-meta-tags
./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
./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 ];
./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 }
./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 },
./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 }
./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}`;
./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 }
./app/routes/author/post.js
15 {
16 tagId: 'og:url',
17 type: 'meta',
18 attrs: {
19 property: 'og:url',
20 content: cannonicalUrl,
21 }
22 },
Demo
http://peblog-3000.herokuapp.com/?
index_key=ddcec57
Bots don’t speak
Javascript
Denver emberjs-sept-2015
$ npm install prerender-node
<server>/index.js
1 app.use(require(‘prerender-node')
2 .set('prerenderToken', process.env.PRERENDER_TOKEN));
./app/index.html
1 <meta name="fragment" content="!">
Ajax Crawling
http://www.example.org/#mypage
http://www.example.org/?_escaped_fragment_=mypage
http://www.example.org/mypage
http://www.example.org/mypage?_escaped_fragment_=
Demo
http://peblog-3000.herokuapp.com/?
index_key=da65289
$ ember install ember-cli-fastboot
ember-cli-fastboot
• Ember Core Team Provided Pre-rendering
• Deferred Injection of Scripts
• Available as Node Middleware
• Extremely Alpha
• Bugs & Incomplete
Demo
• 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/

More Related Content

KEY
Mojolicious - A new hope
PDF
Bootstrat REST APIs with Laravel 5
PDF
Extending the WordPress REST API - Josh Pollock
ZIP
Mojolicious
PDF
Getting Started-with-Laravel
PPTX
Mojolicious - Perl Framework for the Real-Time Web (Lightning Talk)
PDF
Laravel 101
PPTX
Webinar: AngularJS and the WordPress REST API
Mojolicious - A new hope
Bootstrat REST APIs with Laravel 5
Extending the WordPress REST API - Josh Pollock
Mojolicious
Getting Started-with-Laravel
Mojolicious - Perl Framework for the Real-Time Web (Lightning Talk)
Laravel 101
Webinar: AngularJS and the WordPress REST API

What's hot (20)

PDF
Single Page Web Apps As WordPress Admin Interfaces Using AngularJS & The Word...
ODP
Mojolicious on Steroids
PDF
Introduction to AngularJS For WordPress Developers
PDF
Flask - Backend com Python - Semcomp 18
PDF
Keeping it small - Getting to know the Slim PHP micro framework
ODP
Django for Beginners
PDF
Using the new WordPress REST API
PDF
Mojolicious, real-time web framework
PDF
Bullet: The Functional PHP Micro-Framework
PPTX
Using WordPress as your application stack
PDF
Keeping the frontend under control with Symfony and Webpack
PDF
Connecting Content Silos: One CMS, Many Sites With The WordPress REST API
PDF
Embracing Capybara
PPTX
21.search in laravel
PDF
Best Practices in Plugin Development (WordCamp Seattle)
PDF
Caldera Learn - LoopConf WP API + Angular FTW Workshop
PDF
Laravel 5 In Depth
PPT
Building Single Page Application (SPA) with Symfony2 and AngularJS
PDF
Functional testing with capybara
PPTX
What mom never told you about bundle configurations - Symfony Live Paris 2012
 
Single Page Web Apps As WordPress Admin Interfaces Using AngularJS & The Word...
Mojolicious on Steroids
Introduction to AngularJS For WordPress Developers
Flask - Backend com Python - Semcomp 18
Keeping it small - Getting to know the Slim PHP micro framework
Django for Beginners
Using the new WordPress REST API
Mojolicious, real-time web framework
Bullet: The Functional PHP Micro-Framework
Using WordPress as your application stack
Keeping the frontend under control with Symfony and Webpack
Connecting Content Silos: One CMS, Many Sites With The WordPress REST API
Embracing Capybara
21.search in laravel
Best Practices in Plugin Development (WordCamp Seattle)
Caldera Learn - LoopConf WP API + Angular FTW Workshop
Laravel 5 In Depth
Building Single Page Application (SPA) with Symfony2 and AngularJS
Functional testing with capybara
What mom never told you about bundle configurations - Symfony Live Paris 2012
 
Ad

Viewers also liked (14)

PDF
Iz mo - novi obrazac - klanjec
DOCX
Church 101
PDF
How will the future of construction be?
PDF
November 2016 - offers by LR
PDF
Coursera cloudapplications 2015
PDF
Catalogue
PPTX
ECA presentation Roundtable on Independence of Supreme Audit Institutions Sar...
PDF
anuga 2015 USA Pavilion Directory - October 10 - 14, 2015
PPT
Косметика Мирра эффективна или нет? Презентация
DOC
WK 6 - Consulting Project, Part 3 - Final Nine West SAP Project (3)
PDF
Successful Negotiation Essential Strategies and Skills by University of Michi...
PPTX
Taxation Summary
PPTX
Tugas 6 individu rekayasa web 0316
PPT
Что хотят женщины? Или женщина главный покупатель!
Iz mo - novi obrazac - klanjec
Church 101
How will the future of construction be?
November 2016 - offers by LR
Coursera cloudapplications 2015
Catalogue
ECA presentation Roundtable on Independence of Supreme Audit Institutions Sar...
anuga 2015 USA Pavilion Directory - October 10 - 14, 2015
Косметика Мирра эффективна или нет? Презентация
WK 6 - Consulting Project, Part 3 - Final Nine West SAP Project (3)
Successful Negotiation Essential Strategies and Skills by University of Michi...
Taxation Summary
Tugas 6 individu rekayasa web 0316
Что хотят женщины? Или женщина главный покупатель!
Ad

Similar to Denver emberjs-sept-2015 (15)

PPTX
Getting into ember.js
PPTX
EmberJS BucharestJS
PDF
Ember.js Self Defining Apps
PDF
Understanding the Nesting Structure of the Ember.js View Layer
PDF
Workshop 17: EmberJS parte II
PDF
What is open graph meta tag – a detailed overview
PPTX
Introduction to Ember.js
PDF
The Art and Science of Shipping Ember Apps
PDF
Building a Single Page Application using Ember.js ... for fun and profit
PDF
Riding the Edge with Ember.js
PDF
Intro to emberjs
PPTX
{{components deepDive=true}}
PDF
Oredev 2013: Building Web Apps with Ember.js
PDF
Ember.js Meetup Brussels 31/10/2013
PDF
Modern, Scalable, Ambitious apps with Ember.js
Getting into ember.js
EmberJS BucharestJS
Ember.js Self Defining Apps
Understanding the Nesting Structure of the Ember.js View Layer
Workshop 17: EmberJS parte II
What is open graph meta tag – a detailed overview
Introduction to Ember.js
The Art and Science of Shipping Ember Apps
Building a Single Page Application using Ember.js ... for fun and profit
Riding the Edge with Ember.js
Intro to emberjs
{{components deepDive=true}}
Oredev 2013: Building Web Apps with Ember.js
Ember.js Meetup Brussels 31/10/2013
Modern, Scalable, Ambitious apps with Ember.js

Recently uploaded (20)

PDF
Machine learning based COVID-19 study performance prediction
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PPTX
MYSQL Presentation for SQL database connectivity
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
DOCX
The AUB Centre for AI in Media Proposal.docx
PDF
CIFDAQ's Market Insight: SEC Turns Pro Crypto
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PPT
Teaching material agriculture food technology
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PDF
Review of recent advances in non-invasive hemoglobin estimation
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
Encapsulation theory and applications.pdf
PDF
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
Machine learning based COVID-19 study performance prediction
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
MYSQL Presentation for SQL database connectivity
20250228 LYD VKU AI Blended-Learning.pptx
The Rise and Fall of 3GPP – Time for a Sabbatical?
The AUB Centre for AI in Media Proposal.docx
CIFDAQ's Market Insight: SEC Turns Pro Crypto
Chapter 3 Spatial Domain Image Processing.pdf
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
Per capita expenditure prediction using model stacking based on satellite ima...
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
Teaching material agriculture food technology
Dropbox Q2 2025 Financial Results & Investor Presentation
Review of recent advances in non-invasive hemoglobin estimation
Building Integrated photovoltaic BIPV_UPV.pdf
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Encapsulation theory and applications.pdf
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
Reach Out and Touch Someone: Haptics and Empathic Computing

Denver emberjs-sept-2015