Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Ember.js: An Antidote To Your Hype Fatigue
Search
Godfrey Chan
May 07, 2015
Programming
860
7
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Ember.js: An Antidote To Your Hype Fatigue
Godfrey Chan
May 07, 2015
More Decks by Godfrey Chan
See All by Godfrey Chan
Virtual EmberConf 2022: Platform State of the Union
chancancode
0
310
Virtual EmberConf 2021: Platform State of the Union
chancancode
0
240
Virtual EmberConf 2020: Platform State of the Union
chancancode
1
390
Thinking in TypeScript
chancancode
0
320
The Lifecycle of a Rails Request
chancancode
3
15k
Dropping Down To The Metal™ (2018)
chancancode
0
170
Using Skylight to Solve Real-World Performance Problems
chancancode
1
460
Prying Open The Black Box (EmberConf 2018)
chancancode
0
440
Bending The Curve: Putting Rust in Ruby with Helix
chancancode
2
2.9k
Other Decks in Programming
See All in Programming
XHTMLが残したもの
yosuke_furukawa
PRO
2
430
PyO3 で既存 Python 評価器を Rust core 化する ー wasm-bindgen でブラウザにも配るための設計
kdash
1
520
思考垂れ流し開発 ~音声入力 × AIエージェント × 開発ハーネスによる試行錯誤~
npostring
0
900
AIと壁打ちしながら進めるコスト管理
fufuhu
2
1.9k
AIエージェント時代のコードレビューを設計する
nogu66
6
2.5k
まだ間に合う!今年の夏こそSchemeのマクロ展開器を完全理解!
omasanori
0
640
Can LLMs Replicate 4 Years of Compose Migration? Exploring the boundaries of automation with 279 XML files from a real product
makun
0
130
PyConJP2026_wat_Python × Signal Processing: How to Draw Pictures with Sound Using Spectrogram Art
wat
0
670
What We Talk About When We Talk About XP
m_seki
2
390
20260828_品質と開発生産性を両立させる、AI時代のE2Eテストの考え方
magicpod
0
160
AIに既存システムを理解させる技術 ~レガシーを見捨てないハーネスエンジニアリング入門~
ochtum
0
210
高専、大学編入、そして未踏へ〜プロダクト開発とキャリアの歩み - Technical College, University Transfer, and On to “Mitou” / My Journey in Product Development and Career
pkmiya
0
140
Featured
See All Featured
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Making the Leap to Tech Lead
cromwellryan
135
10k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
380
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.5k
How to make the Groovebox
asonas
2
2.4k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
320
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.8k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
The Invisible Side of Design
smashingmag
301
52k
Practical Orchestrator
shlominoach
191
12k
Transcript
@chancancode
None
None
None
Animated Gifts
Programmer to Thought Leader™ Professional Thought Leadership Angelina Fabbro, Sara
Chipps, Gabe Scholz, Tom Dale, Horse JS, Allen Pike g g n n o o r r w w ™
Chapter 1 Leading By Example Professional Thought Leadership Thought Leadership
Chapter 1 Leading By Example Professional Thought Leadership Thought Leaders
Ship
None
Chapter 2 Create Controversies Kill Your Darlings Professional Thought Leadership
None
None
Thought Leadership Is Dead
Fatigue
Fatigue Fatigue
Fatigue Fatigue Fatigue
Fatigue Fatigue Fatigue Fatigue
Fatigue Fatigue Fatigue Fatigue Fatigue
Fatigue Fatigue Fatigue Fatigue Fatigue Fatigue
Fatigue Fatigue Fatigue Fatigue Fatigue Fatigue Fatigue
Fatigue Fatigue Fatigue Fatigue Fatigue Fatigue Fatigue Fatigue
Fatigue Fatigue Fatigue Fatigue Fatigue Fatigue Fatigue Fatigue Fatigue
Fatigue Fatigue Fatigue Fatigue Fatigue Fatigue Fatigue Fatigue Fatigue Fatigue
JavaScript Frameworks Fatigue
None
Which of these is not a JavaScript Framework?
None
2015 2014 2013 2012 2011 2010 ? “1.0” Releases R.I.P.
2015 2014 2013 2012 2011 2010 ? Reaching “Critical Mass”
Hype
THE HYPE CYCLE PLATEAU OF PRODUCTIVITY SLOPE OF ENLIGHTENMENT TROUGH
OF DISILLUSIONMENT TECHNOLOGY TRIGGER PEAK OF INFLATED EXPECTATIONS VISIBILITY MATURITY Ember in the Real World by Brandon Hays, Fluent Conf
“HYPE” IS NOT AN INSULT, IT’S AN INEVITABILITY PLATEAU OF
PRODUCTIVITY SLOPE OF ENLIGHTENMENT TROUGH OF DISILLUSIONMENT TECHNOLOGY TRIGGER PEAK OF INFLATED EXPECTATIONS VISIBILITY MATURITY Ember in the Real World by Brandon Hays, Fluent Conf
Hype Fatigue
An Antidote to Your Hype Fatigue
None
None
None
“Isn’t Ember dead?”
Big Bets
1. Ambitious Web Applications 2. Future Standards Foresight 3. Stability
Without Stagnation
1. Ambitious Web Applications
Widgets
MVC
Full-fledged Applications
None
Solving the Hard Problems™
MVC
[ MVC ]s
[ MVC ]s + Router
[ MVC ]s + Router + Data Store
[ [ MVC ]s + Router + Data Store ]
+ Testing
[ [ MVC ]s + Router + Data Store ]
+ Testing + Build Tools
[ [ MVC ]s + Router + Data Store ]
+ Testing + Build Tools + Deployment
[ [ [ MVC ]s + Router + Data Store
] + Testing + Build Tools + Deployment ] + Ecosystem
Solving the Hard Problems™ Real World
Solving the Hard Problems™ Real World Boring
“Ember is dead.”
“Apple has stopped innovating.”
Innovations
Ember Inspector
None
None
None
None
None
Ember Data
Models // app/models/post.js export default DS.Model.extend({ title: DS.attr(“string”), body: DS.attr(“string”),
published: DS.attr(“date”), });
Relationships // app/models/post.js export default DS.Model.extend({ title: DS.attr(“string”), body: DS.attr(“string”),
published: DS.attr(“date”), author: DS.belongsTo(“user”), comments: DS.hasMany(“comment”), });
store.find(“post”); store.find(“post”, {q: “Rails”}); store.find(“post”, 1); store.filter(“post”, function(post) { ...
}); store.createRecord(“post”, { title: “Rails is Omakase”, body: “...” }); Identity Store
Data Sources
JSON API
// app/adapters/application.js export default DS.RestAdapter.extend({ host: “https://...” }); // app/adapters/user.js
export default FirebaseAdapter.extend({ firebase: “https://...” }); Data Sources
None
None
Ember CLI
% ember new test-app version: 0.2.3 installing create .bowerrc create
.editorconfig create .ember-cli create .jshintrc create .travis.yml create Brocfile.js create README.md create app/app.js create app/components/.gitkeep create app/controllers/.gitkeep create app/helpers/.gitkeep create app/index.html ... Installed packages for tooling via npm. Installed browser packages via Bower. Successfully initialized git.
None
% ember serve version: 0.2.3 Livereload server on port 35729
Serving on http://localhost:4200/ Build successful - 3774ms. Slowest Trees | Total ----------------------------------------------+--------------------- Concat: Vendor | 3005ms Slowest Trees (cumulative) | Total (avg) ----------------------------------------------+--------------------- Concat: Vendor (1) | 3005ms Babel (2) | 231ms (115 ms)
Generators
% ember generate resource post version: 0.2.3 installing create app/models/post.js
installing create tests/unit/models/post-test.js installing create app/routes/post.js create app/templates/post.hbs installing create tests/unit/routes/post-test.js
Conventions
Assets Pipeline
Modules
JSHint, Babel, etc
Build Tools
Testing
Unit Testing
Acceptance Testing
Browser Testing
Browser Testing Test Harness™
% ember generate resource post version: 0.2.3 installing create app/models/post.js
installing create tests/unit/models/post-test.js installing create app/routes/post.js create app/templates/post.hbs installing create tests/unit/routes/post-test.js
moduleForModel('post'); test('slug', function(assert) { var post = this.subject({ title: 'Rails
is omakase' }); assert.equal(post.get('slug'), 'rails-is-omakase'); });
moduleForComponent('delete-button'); test('delete confirmation', function(assert) { var component = this.subject({ text:
'Delete post' }); component.$().click(); assert.equal(component.$().text(), 'Are you sure?'); });
module('Acceptance: check out', { ... }); test('Express checkout', function(assert) {
visit('/products/agile-web-development-with-rails'); click('#express-checkout'); fillIn('#login .username', 'godfrey'); fillIn('#login .secret', 'secret'); click('#login .submit'); andThen(function() { var confirmation = find('#notice h3').text(); assert.equal(confirmation, 'Thank you for your order'); }); });
% ember test version: 0.2.3 Built project successfully. ok 1
PhantomJS 1.9 - JSHint - .: app.js should pass jshint ok 2 PhantomJS 1.9 - JSHint - helpers: helpers/resolver.js should pass jshint ... ok 11 PhantomJS 1.9 - route:post: it exists 1..11 # tests 11 # pass 11 # fail 0 # ok
% ember test --server
Ember Addons
Coffee Script ember install ember-cli-coffeescript
Sass ember install ember-cli-sass
Mocha ember install ember-cli-mocha
Code Coverage ember install ember-cli-blanket
Sauce Labs ember install ember-cli-sauce
Firebase ember install emberfire
Authentication ember install ember-cli-simple-auth
Animations ember install liquid-fire
Deployment ember install ember-cli-deploy
Canadian Stylesheets ember install ember-cli-canadian-stylesheets
None
~ 1000 addons (and counting)
Big Bets
1. Ambitious Web Applications 2. Future Standards Foresight 3. Stability
Without Stagnation
2. Future Standards Foresight
Programmer to Thought Leader™ JavaScript Thought Leadership Yehuda Katz g
g n n o o r r w w ™
Promises
Routes // app/routes/post.js export default Ember.Route.extend({ model: function(params) { return
$.ajax(“/posts/” + params.post_id); } });
Ember Data store.find(“post”, 1).then(function(post) { ... });
Synergy™ // app/routes/post.js export default Ember.Route.extend({ model: function(params) { return
this.store.find(“post”, params.post_id); } });
Synergy™ // app/routes/post.js export default Ember.Route.extend({ });
Testing module('Acceptance: check out', { ... }); test('Express checkout', function(assert)
{ visit('/products/agile-web-development-with-rails') .then(function() { click('#express-checkout'); }) .then(function() { fillIn('#login .username', 'godfrey'); fillIn('#login .secret', 'secret'); }) .then(function() { click('#login .submit'); }) .then(function() { var confirmation = find('#notice h3').text(); assert.equal(confirmation, 'Thank you for your order'); }); });
Synergy™ module('Acceptance: check out', { ... }); test('Express checkout', function(assert)
{ visit('/products/agile-web-development-with-rails'); click('#express-checkout'); fillIn('#login .username', 'godfrey'); fillIn('#login .secret', 'secret'); click('#login .submit'); andThen(function() { var confirmation = find('#notice h3').text(); assert.equal(confirmation, 'Thank you for your order'); }); });
None
Web Components
Custom Elements
A directive that is restricted to element names with an
isolated scope that uses transclusion.
Ember Components
<my-button ... > ... </my-button>
{{#my-button ...}} ... {{/my-button}}
...for now.
ES 6+
ES6 Modules // app/models/post.js import DS from “ember-data”; export default
DS.Model.extend({ title: DS.attr(“string”), body: DS.attr(“string”), published: DS.attr(“date”), }); // test/unit/models/post-test.js import Post from 'test-app/models/post'; // ...
ES6 Syntax // app/routes/post.js export default Ember.Route.extend({ model(params) { return
$.ajax(`/posts/${ params.post_id) }`); } });
ES6 Classes?
None
The Future Is Now™
ember install ember-cli-computed-decorators
// app/models/user.js import DS from 'ember-data'; import computed from 'ember-computed-decorators';
export default DS.Model.extend({ firstName: DS.attr(“string”), lastName: DS.attr(“string”), @computed(“firstName”, “lastName”) fullName(firstName, lastName) { return `${ firstName } ${ lastName }`; } });
// app/models/user.js import DS from 'ember-data'; import computed from 'ember-computed-decorators';
export default DS.Model.extend({ firstName: DS.attr(“string”), lastName: DS.attr(“string”), @computed(“firstName”, “lastName”) fullName(firstName, lastName) { return `${ firstName } ${ lastName }`; } });
Synergy™
Big Bets
1. Ambitious Web Applications 2. Future Standards Foresight 3. Stability
Without Stagnation
3. Stability Without Stagnation
None
Release Channels
Release Beta Canary
May 1.11 1.12 Beta 3 Apr Mar Feb Jan Dec
Nov Oct Sep Aug 1.10 1.12 Beta 2 1.12 Beta 1 1.11 Beta 5 1.11 Beta 4 1.11 Beta 3 Canary Beta Release 1.11 Beta 2 1.11 Beta 1 1.10 Beta 4 1.10 Beta 3 1.10 Beta 2 1.10 Beta 1 1.9 1.9 Beta 4 1.9 Beta 3 1.9 Beta 1 1.8 1.8 Beta 5 1.8 Beta 4 1.8 Beta 3 1.8 Beta 2 1.8 Beta 1 1.7 1.7 Beta 5 1.7 Beta 4 Bound Attributes HTML Bars Glimmer Block Params Injected Properties New CP Syntax {{component}} Streams Handlebars 2.0 Metamorph 2015
May 1.11 1.12 Beta 3 Apr Mar Feb Jan Dec
Nov Oct Sep Aug 1.10 1.12 Beta 2 1.12 Beta 1 1.11 Beta 5 1.11 Beta 4 1.11 Beta 3 Canary Beta Release 1.11 Beta 2 1.11 Beta 1 1.10 Beta 4 1.10 Beta 3 1.10 Beta 2 1.10 Beta 1 1.9 1.9 Beta 4 1.9 Beta 3 1.9 Beta 1 1.8 1.8 Beta 5 1.8 Beta 4 1.8 Beta 3 1.8 Beta 2 1.8 Beta 1 1.7 1.7 Beta 5 1.7 Beta 4 Bound Attributes HTML Bars Glimmer Block Params Injected Properties New CP Syntax {{component}} Streams Handlebars 2.0 Metamorph 2015
Semantic Versioning
Deprecations
None
Synergy™
RFCs
RFCs
Does it really work?
None
Notable Features Shipped During 1.x 1.2 Router loading/error substates 1.3
Router auto location 1.6 ES6-ify Ember internals 1.7 Query params, nestable routes 1.8 Remove metamorph <script> tags 1.9 Handlebars 2.0, Streams 1.10 HTMLBars, {{else if}}, block params 1.11 Bound attributes
HTMLBars Ember 1.10
Before
// app/templates/post.hbs <h1>{{ post.title }}</h1> <div {{bind-attr class=":post post.isFeatured:featured"}}> {{markdownToHTML
post.body}} </div>
After
// app/templates/post.hbs <h1>{{ post.title }}</h1> <div {{bind-attr class=":post post.isFeatured:featured"}}> {{markdownToHTML
post.body}} </div>
Bound Attributes Ember 1.11
Before
// app/templates/post.hbs <h1>{{ post.title }}</h1> <div {{bind-attr class=":post post.isFeatured:featured"}}> {{markdownToHTML
post.body}} </div>
After
// app/templates/post.hbs <h1>{{ post.title }}</h1> <div {{bind-attr class=":post post.isFeatured:featured"}}> {{markdownToHTML
post.body}} </div>
// app/templates/post.hbs <h1>{{ post.title }}</h1> <div {{bind-attr class=":post post.isFeatured:featured"}}> {{markdownToHTML
post.body}} </div>
Improved
// app/templates/post.hbs <h1>{{ post.title }}</h1> <div class="post {{if post.isFeatured 'featured'}}">
{{markdownToHTML post.body}} </div>
None
Reactive Programming
Notable Features Shipped During 1.x 1.2 Router loading/error substates 1.3
Router auto location 1.6 ES6-ify Ember internals 1.7 Query params, nestable routes 1.8 Remove metamorph <script> tags 1.9 Handlebars 2.0, Streams 1.10 HTMLBars, {{else if}}, block params 1.11 Bound attributes
None
None
None
None
None
Notable Features Shipped During 1.x 1.2 Router loading/error substates 1.3
Router auto location 1.6 ES6-ify Ember internals 1.7 Query params, nestable routes 1.8 Remove metamorph <script> tags 1.9 Handlebars 2.0, Streams 1.10 HTMLBars, {{else if}}, block params 1.11 Bound attributes 1.12 ??? 1.13? Glimmer
Fast Boot™
One-way Binding By Default
Notable Features Shipped During 1.x 1.2 Router loading/error substates 1.3
Router auto location 1.6 ES6-ify Ember internals 1.7 Query params, nestable routes 1.8 Remove metamorph <script> tags 1.9 Handlebars 2.0, Streams 1.10 HTMLBars, {{else if}}, block params 1.11 Bound attributes 1.12 ??? 1.13? Glimmer, One-way binding
Components Everywhere
Notable Features Shipped During 1.x 1.2 Router loading/error substates 1.3
Router auto location 1.6 ES6-ify Ember internals 1.7 Query params, nestable routes 1.8 Remove metamorph <script> tags 1.9 Handlebars 2.0, Streams 1.10 HTMLBars, {{else if}}, block params 1.11 Bound attributes 1.12 ??? 1.13? Glimmer, One-way binding, Routable components, <... />, ...
Ember 2.0
None
Notable Features Shipped During 1.x 1.2 Router loading/error substates 1.3
Router auto location 1.6 ES6-ify Ember internals 1.7 Query params, nestable routes 1.8 Remove metamorph <script> tags 1.9 Handlebars 2.0, Streams 1.10 HTMLBars, {{else if}}, block params 1.11 Bound attributes 1.12 ??? 1.13? Glimmer, One-way binding, Routable components, <... />, ...
Notable Features Shipped With 2.0 < This slide is intentionally
left blank >
Big Bets
1. Ambitious Web Applications 2. Future Standards Foresight 3. Stability
Without Stagnation
None
THE HYPE CYCLE PLATEAU OF PRODUCTIVITY SLOPE OF ENLIGHTENMENT TROUGH
OF DISILLUSIONMENT TECHNOLOGY TRIGGER PEAK OF INFLATED EXPECTATIONS VISIBILITY MATURITY Ember in the Real World by Brandon Hays, Fluent Conf
None
None
An Antidote to Your Hype Fatigue
“Isn’t Ember dead?”
@chancancode