isomorphic javascript: #devbeat master class

55
Master Class: Isomorphic JavaScript Spike Brehm @spikebrehm

Upload: spike-brehm

Post on 11-May-2015

12.658 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: Isomorphic JavaScript: #DevBeat Master Class

Master Class:Isomorphic JavaScript

Spike Brehm@spikebrehm

Page 2: Isomorphic JavaScript: #DevBeat Master Class
Page 3: Isomorphic JavaScript: #DevBeat Master Class

New iOS, Android apps launched today

</marketing>

Page 4: Isomorphic JavaScript: #DevBeat Master Class

Agenda

Page 5: Isomorphic JavaScript: #DevBeat Master Class

...TF is Isomorphic JavaScript?Wat

...is it relevant to web developers?Wy

...can I build isomorphic apps?How

Page 6: Isomorphic JavaScript: #DevBeat Master Class

WTF is Isomorphic JavaScript?

Page 7: Isomorphic JavaScript: #DevBeat Master Class

JavaScript code that can run on both the client and server.

Page 8: Isomorphic JavaScript: #DevBeat Master Class

A brief note on “isomorphic”.

Page 9: Isomorphic JavaScript: #DevBeat Master Class

“monomorphic”“heteromorphic”“homomorphic”“multi-platform”

You’re using it wrong!

Page 10: Isomorphic JavaScript: #DevBeat Master Class

Example, plz.

Page 11: Isomorphic JavaScript: #DevBeat Master Class

Example: Underscore.js

var posts = [{ id: 1, title: 'JavaScript is cool'}, { id: 2, title: 'The Web is the platform'}]; _.pluck(posts, 'title');// ['JavaScript is cool', 'The Web is the platform']

Page 12: Isomorphic JavaScript: #DevBeat Master Class

Ye olde days:fat-serer, thin-client.

Page 13: Isomorphic JavaScript: #DevBeat Master Class

ClientJavaScript

SererRubyPythonJavaPHP

Persistence

View layer

Application logic

Routing

DOM manipulation

Form validation

Animations

Page 14: Isomorphic JavaScript: #DevBeat Master Class

Circa 2011:thin-serer, fat-client.

Page 15: Isomorphic JavaScript: #DevBeat Master Class

Routing

View layer

SererRubyPythonJavaPHP

Persistence

ClientJavaScript

Application logic

DOM manipulation

Form validation

Animations

Page 16: Isomorphic JavaScript: #DevBeat Master Class

Teh footure:shared, fat-serer, fat-client.

Page 17: Isomorphic JavaScript: #DevBeat Master Class

SererRubyPythonJavaPHP

Persistence

ClientJavaScript

Routing

View layer

Application logic

DOM manipulation

Form validation

SharedJavaScript

Animations

Page 18: Isomorphic JavaScript: #DevBeat Master Class

Isomorphic JavaScript can be

orshimmed per environment .

environment-agnostic

Page 19: Isomorphic JavaScript: #DevBeat Master Class

Does not depend on browser-specific properties (window) or server-specific properties (process.env, req.cookies).

Environment-agnostic

Page 20: Isomorphic JavaScript: #DevBeat Master Class

Example: Handlebars.js

var template = '<ul>' \ '{{#each posts}}' \ ' <li>{{title}}</li>' \ '{{/each}}' \ '</ul>'; var templateFn = Handlebars.compile(template) , html = templateFn({posts: posts}); // <ul>// <li>JavaScript is cool</li>// <li>The Web is the platform</li>// </ul>

Page 21: Isomorphic JavaScript: #DevBeat Master Class

Provides shims for accessing environment-specific properties so module can expose a single API.

window.location.pathnamevs.req.path

Shimmed per environment

Page 22: Isomorphic JavaScript: #DevBeat Master Class

Example: Superagent

superagent .post('/api/posts.json') .send({ title: 'Moar JavaScript', body: '...' }) .set('X-Api-KEY', '123456abcdef') .end(function(response) { if (response.status === 200) { console.log("Success!"); } else { console.error("Error", response.body.error); } });

Page 23: Isomorphic JavaScript: #DevBeat Master Class

Isomorphic use cases.

Page 24: Isomorphic JavaScript: #DevBeat Master Class

• Templating• Routing• I18n• Date & currency formatting• Model validation• API interaction• ...?

Isomorphic use cases.

Page 25: Isomorphic JavaScript: #DevBeat Master Class

Most of your favorite libraries can be used isomorphically.

Page 26: Isomorphic JavaScript: #DevBeat Master Class

• Underscore.js• Backbone.js• Handlebars.js• jQuery• Moment• React.js• Polyglot.js (I18n)

Page 27: Isomorphic JavaScript: #DevBeat Master Class

Isomorphic JavaScript is a spectrum.

Page 28: Isomorphic JavaScript: #DevBeat Master Class

Entire view layer and app

logic shared

Small bits of view layer or logic shared

Page 29: Isomorphic JavaScript: #DevBeat Master Class

Many abstractions

Few abstractions

Page 30: Isomorphic JavaScript: #DevBeat Master Class

ComplexSimple

Page 31: Isomorphic JavaScript: #DevBeat Master Class

View layer shared

Entire app runtime synced between client

& server

Page 32: Isomorphic JavaScript: #DevBeat Master Class

Wy go to the trouble?

Page 33: Isomorphic JavaScript: #DevBeat Master Class

Initial pageload speed.Performance

Crawlable single-page apps.SEO

Reduce code duplication.Maintainability

Page 34: Isomorphic JavaScript: #DevBeat Master Class

Building and bundling.

Page 35: Isomorphic JavaScript: #DevBeat Master Class

Package up CommonJS modules for the browser.

Browserif

Use ‘require()’ in the browser, the same way you would on the server.

Page 36: Isomorphic JavaScript: #DevBeat Master Class

// app/template_renderer.js var handlebars = require('handlebars'); module.exports = function(templatePath, data) { var templateFn = require('./views/' + templatePath) , html = templateFn(data); return html;};

Bundles a module and all its dependencies.

Browserif

Page 37: Isomorphic JavaScript: #DevBeat Master Class

Task runner for automating build and development workflow.

Grunt

Page 38: Isomorphic JavaScript: #DevBeat Master Class

•Compile Handlebars templates•Run Browserify to package up your shared app files

•Recompile files and restart Node server on every change

Grunt

Page 39: Isomorphic JavaScript: #DevBeat Master Class

Any questions thus far?

Page 40: Isomorphic JavaScript: #DevBeat Master Class

Hack time.

Page 41: Isomorphic JavaScript: #DevBeat Master Class

Combines a few modules together for MVP of isomorphic app.

Sample Node.js app

Express.js blog platformBasic web server with RESTful API.

Page 42: Isomorphic JavaScript: #DevBeat Master Class

Templating.Handlebars.js

DirectorRouting HTTP and HTML5.

HTTP requests to API.Superagent

Page 43: Isomorphic JavaScript: #DevBeat Master Class

Tour of the app.

Page 44: Isomorphic JavaScript: #DevBeat Master Class

Setting up locally.

Page 45: Isomorphic JavaScript: #DevBeat Master Class

git clone [email protected]:spikebrehm/isomorphic-tutorial.git

Clone the sample app

github.com/spikebrehm/isomorphic-tutorial

Page 46: Isomorphic JavaScript: #DevBeat Master Class

Ensure Node >= 0.8.x$ node --versionv0.10.21

github.com/spikebrehm/isomorphic-tutorial

Have to install?$ brew install nodeorhttp://nodejs.org

Page 47: Isomorphic JavaScript: #DevBeat Master Class

$ npm install grunt-cli -g

Install `grunt-cli`

github.com/spikebrehm/isomorphic-tutorial

Page 48: Isomorphic JavaScript: #DevBeat Master Class

$ cd isomorphic-tutorial$ npm install

Run `npm install`

github.com/spikebrehm/isomorphic-tutorial

Page 49: Isomorphic JavaScript: #DevBeat Master Class

$ grunt server

Run the serer!

github.com/spikebrehm/isomorphic-tutorial

View `localhost:3030` in browser

Page 50: Isomorphic JavaScript: #DevBeat Master Class

Let’s add a feature.

Page 51: Isomorphic JavaScript: #DevBeat Master Class

Date formattingBefore:After:

Momentmoment('2013-11-04T17:23:01.329Z').format('LLLL');// "Monday, November 4 2013 9:23 AM"

Page 52: Isomorphic JavaScript: #DevBeat Master Class

Add Moment using NPM$ npm install moment --save

Page 53: Isomorphic JavaScript: #DevBeat Master Class

Create `formatDate` Handlebars helperPosted at {{created_at}}

Posted at {{formatDate created_at}}

function formatDate(dateStr) { return moment(dateStr).format('LLLL');}

Page 54: Isomorphic JavaScript: #DevBeat Master Class

Questions?

Page 55: Isomorphic JavaScript: #DevBeat Master Class

@AirbnbNerds@spikebrehm

Thanks!