Server Side JavaScript - You ain't seen nothing yet

91
Server Side JavaScript You ain’t seen nothing yet Tom Hughes-Croucher @sh1mmer

Transcript of Server Side JavaScript - You ain't seen nothing yet

Page 1: Server Side JavaScript - You ain't seen nothing yet

Server Side JavaScriptYou ain’t seen nothing yet

Tom Hughes-Croucher @sh1mmer

Page 2: Server Side JavaScript - You ain't seen nothing yet

Server Side Javascript IS SO AWESOMEMY ENTIRE PRESENTATION IS IN

COMIC SANS AND YOU WILL STILL LOVE ME AT THE END

Page 3: Server Side JavaScript - You ain't seen nothing yet

Why SSJS?

Page 4: Server Side JavaScript - You ain't seen nothing yet

JavaScript programmers

3 > 2 > 1

Page 5: Server Side JavaScript - You ain't seen nothing yet

Massive Code base of YUI and other JS librariesI heard some people use this thing called jQuery,

but I’m not convinced it’ll catch on

Page 6: Server Side JavaScript - You ain't seen nothing yet

Laziness or “I’m sick of writing stuff twice”I could have said efficiency, but I think we all secretly long to sit around in our y-fronts. Except Higgins, who already does.

Page 7: Server Side JavaScript - You ain't seen nothing yet

Progressive Enhancement is free*Remember WWCD (What Would Crockford Do)

*close enough

Page 8: Server Side JavaScript - You ain't seen nothing yet

TL;DR:SSJS is Awesome

Like a Unicorn riding a Narwhal

Page 9: Server Side JavaScript - You ain't seen nothing yet
Page 10: Server Side JavaScript - You ain't seen nothing yet

Why now?

Page 11: Server Side JavaScript - You ain't seen nothing yet

1. Professionalism

Page 12: Server Side JavaScript - You ain't seen nothing yet
Page 13: Server Side JavaScript - You ain't seen nothing yet

“Yahoo!'s corporate motto is: Don't be

eval().“

Page 14: Server Side JavaScript - You ain't seen nothing yet

“Doug Crockford's JavaScript is so strict, that uncaught

exceptions would trigger global thermonuclear war“

Page 15: Server Side JavaScript - You ain't seen nothing yet

2. JavaScript Runtimes

Page 16: Server Side JavaScript - You ain't seen nothing yet

Runtimes

• V8 (Google), C++

• Spider Monkey (Mozilla), C++

• Rhino (Mozilla), Java

Page 17: Server Side JavaScript - You ain't seen nothing yet

JavaScript Performance

V8

Spider Monkey

Page 18: Server Side JavaScript - You ain't seen nothing yet

An Overview of SSJS

Page 19: Server Side JavaScript - You ain't seen nothing yet

!

Page 20: Server Side JavaScript - You ain't seen nothing yet

Runtime != Browser

Page 21: Server Side JavaScript - You ain't seen nothing yet

No DOM for you!

Page 22: Server Side JavaScript - You ain't seen nothing yet

JavaScript on Server• Rhino

• JavaScript 1.7

• SpiderMonkey

• JavaScript 1.8

• V8

• ECMAScript 3

Page 23: Server Side JavaScript - You ain't seen nothing yet

Huh?

Page 24: Server Side JavaScript - You ain't seen nothing yet

JavaScript is

• Proprietary to Netscape (now Mozilla)

• “Ahead” of ECMAScript

• Only really deployed in Mozilla projects

• Only useful on the server

Page 25: Server Side JavaScript - You ain't seen nothing yet

ECMAScript is• A standard

• Implemented in all browsers

• ECMAScript-262 3rd ed. ~ JavaScript 1.5

• ECMAScript-262 5th ed. has no JavaScript equivalent

Page 26: Server Side JavaScript - You ain't seen nothing yet

JavaScript 1.6+

• E4X (EcmaScript For XML)

• Let scope blocks

• Generators

• Generator expressions

Page 27: Server Side JavaScript - You ain't seen nothing yet
Page 28: Server Side JavaScript - You ain't seen nothing yet

Frameworks

Page 29: Server Side JavaScript - You ain't seen nothing yet

CommonJS

Page 30: Server Side JavaScript - You ain't seen nothing yet

CommonJS• Set of standards for SSJS

• Modules

• File System

• etc

• Cross-implementation API

• Still implementation specific code

Page 31: Server Side JavaScript - You ain't seen nothing yet
Page 32: Server Side JavaScript - You ain't seen nothing yet

Application Frameworks

Page 33: Server Side JavaScript - You ain't seen nothing yet

Narwhal

Page 34: Server Side JavaScript - You ain't seen nothing yet

Most Complete Implementation of

CommonJS

Page 35: Server Side JavaScript - You ain't seen nothing yet

Works on lots of run-times

Page 36: Server Side JavaScript - You ain't seen nothing yet

JACK/JSGI

Page 37: Server Side JavaScript - You ain't seen nothing yet

JSGI Middleware

function(env) {

return { status : 200, headers : {"Content-Type":"text/plain"}, body : ["Hello world!"] };}

Page 38: Server Side JavaScript - You ain't seen nothing yet

JSGI Middleware

function Head(app) { return function(env) { var result = app(env); if (env["REQUEST_METHOD"] === "HEAD") result.body = []; return result; }}

Page 39: Server Side JavaScript - You ain't seen nothing yet

Fab

Page 40: Server Side JavaScript - You ain't seen nothing yet

Fab

Page 41: Server Side JavaScript - You ain't seen nothing yet

Fab

Page 42: Server Side JavaScript - You ain't seen nothing yet

Fab

Page 43: Server Side JavaScript - You ain't seen nothing yet

Fab• with ( fab = require( "../" ) ) module.exports = fab  ( contentLength )  ( stringify )   ( /\/date/ )    ( tmpl )      ( "The date is <%= this.toDateString() %>." )    ()  ( /\/time/ )    ( tmpl )      ( "The time is <%= this.toTimeString() %>." )    ()  ( new Date );

Page 44: Server Side JavaScript - You ain't seen nothing yet
Page 45: Server Side JavaScript - You ain't seen nothing yet
Page 46: Server Side JavaScript - You ain't seen nothing yet
Page 47: Server Side JavaScript - You ain't seen nothing yet

Node.js• Server-side JavaScript process

• Uses V8

• Non-blocking

• Event Driven

• CommonJS module format

Page 48: Server Side JavaScript - You ain't seen nothing yet

Node.js• Server-side JavaScript process

• Uses V8

• Non-blocking

• Event Driven

• CommonJS module format

AWESOME!

Page 49: Server Side JavaScript - You ain't seen nothing yet

At JSCONF.US 2010Node was ☜⎻⎻⎻⎻⎻☞ this fast

Page 50: Server Side JavaScript - You ain't seen nothing yet
Page 51: Server Side JavaScript - You ain't seen nothing yet

ButRyan doesn’t roll like that. Ryan rolls like this

Page 52: Server Side JavaScript - You ain't seen nothing yet
Page 53: Server Side JavaScript - You ain't seen nothing yet

Community, much?

Page 54: Server Side JavaScript - You ain't seen nothing yet
Page 55: Server Side JavaScript - You ain't seen nothing yet
Page 56: Server Side JavaScript - You ain't seen nothing yet
Page 57: Server Side JavaScript - You ain't seen nothing yet
Page 58: Server Side JavaScript - You ain't seen nothing yet
Page 59: Server Side JavaScript - You ain't seen nothing yet
Page 60: Server Side JavaScript - You ain't seen nothing yet
Page 61: Server Side JavaScript - You ain't seen nothing yet
Page 62: Server Side JavaScript - You ain't seen nothing yet
Page 63: Server Side JavaScript - You ain't seen nothing yet
Page 64: Server Side JavaScript - You ain't seen nothing yet

Node.js + YUI3 =Awesome

like a Narwhal riding a Unicorn

Page 65: Server Side JavaScript - You ain't seen nothing yet
Page 66: Server Side JavaScript - You ain't seen nothing yet

YUI 3• Modular

• Sandboxed

• Intrinsic component loading

• Core team + community (50+ extensions)

• Not just about manipulating the DOM

Page 67: Server Side JavaScript - You ain't seen nothing yet

YUI 3• Script Loading

• Remote i/o

• Events and Attributes

• Data Manipulation

• Language Utilities

• Templating

Page 68: Server Side JavaScript - You ain't seen nothing yet

Making it work - 1

if (typeof exports == 'object') { exports.YUI = YUI; }

YUI exports itself per the CommonJS spec

Page 69: Server Side JavaScript - You ain't seen nothing yet

Making it work - 2

YUI({ logFn: function(str, t, m) { if (str instanceof Object || str instanceof Array) { if (str.toString) { str = str.toString(); } else { str = sys.inspect(str); } } // output log messages to stderr sys.error('[' + t.toUpperCase() + ']: ' + m + str); }});

Page 70: Server Side JavaScript - You ain't seen nothing yet

Fin.

Page 71: Server Side JavaScript - You ain't seen nothing yet

‘ello World Node Style

#!/usr/bin/env nodevar YUI = require("../lib/node-yui3").YUI, Y = YUI();

Y.log('ello World');

Page 72: Server Side JavaScript - You ain't seen nothing yet

‘ello World YUI Style

#!/usr/bin/env noderequire("../lib/node-yui3").YUI().log('ello World');

Page 73: Server Side JavaScript - You ain't seen nothing yet

[~/examples (master)⚡] ➔ ./hello.js [INFO]: ello World

‘ello World YUI Style

Page 74: Server Side JavaScript - You ain't seen nothing yet

Enabling YUI’s LoaderYUI.add(‘get’, function(Y) { // reads from file system or creates a httpClient // for remote data. Y.Get.script = function(s, cb) { var urls = Y.Array(s), url, i, l = urls.length; for (i=0; i<l; i++) { // doesn't need to be blocking, so don't block. YUI.include(url, function(err) { if (err) { Y.log(err, 'error', 'get'); } pass(cb); }); // replaced with process.compile so YUI doesn’t // need to be global // require.async(url, function (err, mod) { } };});

Page 75: Server Side JavaScript - You ain't seen nothing yet

Enabling YUI’s Loader#!/usr/bin/env nodevar YUI = require('../lib/node-yui3').YUI;

YUI({ filter: 'debug'}).use('event-custom', function(Y) { Y.on('pwnd', function() { Y.log('Never gonna give you up, never gonna let you down...'); });

Y.fire('pwnd');});

Page 76: Server Side JavaScript - You ain't seen nothing yet

Enabling YUI’s Loader[~/examples (master)⚡] ➔ ./loader.js [INFO]: (yui) Module requirements: event-custom[INFO]: (yui) Modules missing: event-custom, 1[INFO]: (yui) Fetching loader: yui_3_1_0_1_12711895820541, ./yui3/build/loader/loader-debug.js[INFO]: (get) URL: /lib/yui3/build/loader/loader-debug.js[INFO]: (yui) Module requirements: yui-base,yui-log,dump,oop,yui-later,event-custom[INFO]: (yui) Modules missing: dump,oop,event-custom, 3[INFO]: (yui) Using Loader[INFO]: (loader) attempting to load dump, ./yui3/build/[INFO]: (get) URL: /lib/yui3/build/dump/dump-debug.js[INFO]: (loader) attempting to load oop, ./yui3/build/[INFO]: (get) URL: /lib/yui3/build/oop/oop-debug.js[INFO]: (loader) attempting to load event-custom, ./yui3/build/[INFO]: (get) URL: /lib/yui3/build/event-custom/event-custom-debug.js[INFO]: (loader) loader finishing: success, yui_3_1_0_1_12711895820541, yui-base,yui-log,dump,oop,yui-later,event-custom[INFO]: (event) yui_3_1_0_1_12711895820544: pwnd->sub: yui_3_1_0_1_12711895820545[INFO]: Never gonna give you up, never gonna let you down...

Page 77: Server Side JavaScript - You ain't seen nothing yet

Accessing Remote Data

#!/usr/bin/env node

var sys = require('sys'), YUI = require('../lib/node-yui3').YUI;

YUI().use('json', 'gallery-yql', function(Y) { var q = 'select * from github.user.info where (id = "apm")', o = new Y.yql(q); o.on('query', function(r) { //sys.inspects serializes objects to text sys.puts(sys.inspect(r)); });});

Using the YQL module from YUI Gallery

Page 78: Server Side JavaScript - You ain't seen nothing yet

Accessing Remote Data[~/src/nodejs-yui3/examples (master)⚡] ➔ ./yql.js [INFO]: (get) URL: http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20github.user.info%20where%20(id%20%3D%20%22apm%22)&format=json&callback=YUI.yql.yui_3_1_0_1_12711910026086&env=http%3A%2F%2Fdatatables.org%2Falltables.env&

{ count: '1', created: '2010-04-13T08:36:47Z', lang: 'en-US', results: { user: { 'gravatar-id': 'fd657f26f290d8869901f0eaf3441b97' , name: 'Adam Moore' , login: 'apm' // -snip- } }}

Page 79: Server Side JavaScript - You ain't seen nothing yet

DOMIt’s BOM.

Page 80: Server Side JavaScript - You ain't seen nothing yet

What about the DOM?• YUI isn’t all about the DOM

• But YUI has many DOM-centric modules.

• Being able to use these components on the server opens up some interesting opportunities.

Page 81: Server Side JavaScript - You ain't seen nothing yet

Rendering HTML - nodejs-dom

• Dav pulled together two open source projects to do it:

• jsdom - DOM level 1 support, written in JavaScript

• node-htmlparser - HTML parser written in JavaScript. Needed for innerHTML

• These are not nodeJS specific implementations

Page 82: Server Side JavaScript - You ain't seen nothing yet

Rendering HTML - nodejs-dom

• DOM element creation and manipulation

• Selector API

• YUI’s Node API

Page 83: Server Side JavaScript - You ain't seen nothing yet

Rendering HTML - nodejs-dom

#!/usr/bin/env nodevar sys = require('sys'), http = require('http'), url = require('url');var YUI = require("../lib/node-yui3").YUI;YUI().use('nodejs-dom', 'node', function(Y) { var document = Y.Browser.document, navigator = Y.Browser.navigator, window = Y.Browser.window; http.createServer(function (req, res) { var urlInfo = url.parse(req.url, true); YUI().use('nodejs-dom', 'node', function(Page) { document = Page.Browser.document; navigator = Page.Browser.navigator; window = Page.Browser.window; document.title = 'Calendar Test'; Page.one('body').addClass('yui-skin-sam'); var ln = document.createElement('link'); // ...

Page 84: Server Side JavaScript - You ain't seen nothing yet

Rendering HTML

http://yuiloader.davglass.com/calendar/

Page 85: Server Side JavaScript - You ain't seen nothing yet

Progressive Enhancement

• YUI 2 calendar control is loaded via the YUI 2 in 3 project

• The calendar control is fully rendered on the server.

• No script.

• Page and nav clicks are round trips.

• If script is enabled, we could enhance the links to pull only the data for each page and render on the client.

Page 86: Server Side JavaScript - You ain't seen nothing yet

Multiple Response Types

http://yuiloader.davglass.com/template/

Page 87: Server Side JavaScript - You ain't seen nothing yet

Multiple Response Types• First response will render the entire page.

• A client without script can request the fully rendered page.

• A script enabled client can request just the new content.

• A script enabled client with the source that is running on the server can request just the JSON data structure that creates the content.

• It’s the same code.

Page 88: Server Side JavaScript - You ain't seen nothing yet

Other Uses

• Fast utility layer testing with YUI Test.

• Smoke tests for DOM-centric code.

• Could emulate some browser quirks.

• Validation Code

Page 90: Server Side JavaScript - You ain't seen nothing yet

Summary• SSJS is awesome because

• We are JavaScript programmers

• Reuse (libraries/code)

• Progressive Enhancement

• Node.js + YUI3 rocks

• YUI 3’s was easy to get running on Node.js

• Server side DOM allows for a single code base

Page 91: Server Side JavaScript - You ain't seen nothing yet

Today presentation wasBrought to you by

the letters:J and S

And the fonts:Comic Sansmonofur

Tom Hughes-Croucher@sh1mmer

[email protected]

Slides, etc --> http://speakerrate.com/sh1mmer

Pls rate me. kthxbai.