pocket knife js

80
KILL ALL HUMANS! I. Robot Forensic Anthropologist Pocket Knife JS November 10, 2011 Friday, November 11, 11

Upload: diogo-antunes

Post on 10-May-2015

2.133 views

Category:

Technology


0 download

DESCRIPTION

Overview of some js micro frameworks.#codebits2011

TRANSCRIPT

Page 1: Pocket Knife JS

KILL ALL HUMANS!

I. RobotForensic Anthropologist

Pocket Knife JS

November 10, 2011

Friday, November 11, 11

Page 2: Pocket Knife JS

Who am I

Friday, November 11, 11

Page 3: Pocket Knife JS

Who am I

• Diogo Antunes

Friday, November 11, 11

Page 4: Pocket Knife JS

Who am I

• Diogo Antunes

• JavaScript developer @ SAPO

Friday, November 11, 11

Page 5: Pocket Knife JS

Who am I

• Diogo Antunes

• JavaScript developer @ SAPO

• @dicode

Friday, November 11, 11

Page 6: Pocket Knife JS

Who am I

• Diogo Antunes

• JavaScript developer @ SAPO

• @dicode

• http://js.sapo.pt

Friday, November 11, 11

Page 7: Pocket Knife JS

JS World

• Wonderful things are happening

• Lot’s of new code, snippets

• Great community

• Always looking forward

Friday, November 11, 11

Page 8: Pocket Knife JS

Why?

• JS is cool

• Lot to learn

• Lot to innovate

Friday, November 11, 11

Page 9: Pocket Knife JS

Pocket Knife

• There are code out there that can help

• You can use it, fork it, re-write it

• but you’ll definitely learn a lot digging in

Friday, November 11, 11

Page 10: Pocket Knife JS

Going deep

Friday, November 11, 11

Page 11: Pocket Knife JS

Templating

Friday, November 11, 11

Page 12: Pocket Knife JS

Mustache

• Logic-less templates with JavaScript

• you can render templates in your browser, or rendering server-side stuff with node.js, use it for rendering stuff in CouchDB’s views

• Plugins for jQuery, Dojo, Yui, CommonJS, qooxdoo

Friday, November 11, 11

Page 13: Pocket Knife JS

Mustachevar view = { "name": "Bill", "address": { "street": "801 Streetly street", "city": "Boston", "state": "MA", "zip" "02101" }}

var template = '<h1>Contact: {{name}}</h1>{{#address}} <p>{{street}}</p> <p>{{city}}, {{state}} {{zip}}</p>{{/address}}';

var html = Mustache.to_html(template, view);

<h1>Contact: Bill</h1><p>801 Streetly street</p><p>Boston, MA 02101</p>

Friday, November 11, 11

Page 14: Pocket Knife JS

Loaders

Friday, November 11, 11

Page 15: Pocket Knife JS

Lab.js

• Loading And Blocking JavaScript

• Load JS from anywhere at anytime

• You can even load LABjs dynamically

Friday, November 11, 11

Page 16: Pocket Knife JS

Lab.js

<script src="framework.js"></script><script src="plugin.framework.js"></script><script src="myplugin.framework.js"></script><script src="init.js"></script>

<script> $LAB .script("framework.js").wait() .script("plugin.framework.js") .script("myplugin.framework.js").wait() .script("init.js").wait();</script>

Friday, November 11, 11

Page 17: Pocket Knife JS

require.js

• plugins for jquery, dojo or node.js

• RequireJS is a JavaScript file and module loader.

• It is optimized for in-browser use, but it can be used in other JavaScript environments

Friday, November 11, 11

Page 18: Pocket Knife JS

require.js

<!DOCTYPE html><html> <head> <title>My Sample Project</title> <!-- data-main attribute tells require.js to load scripts/main.js after require.js loads. --> <script data-main="scripts/main" src="scripts/require.js"></script> </head> <body> <h1>My Sample Project</h1> </body></html>

project-directory/ project.html scripts/ main.js require.js helper/ util.js

Friday, November 11, 11

Page 19: Pocket Knife JS

require.js

<!DOCTYPE html><html> <head> <title>My Sample Project</title> <!-- data-main attribute tells require.js to load scripts/main.js after require.js loads. --> <script data-main="scripts/main" src="scripts/require.js"></script> </head> <body> <h1>My Sample Project</h1> </body></html>

require(["helper/util"], function() { //This function is called when scripts/helper/util.js is loaded.});

Friday, November 11, 11

Page 20: Pocket Knife JS

webkit-based

Friday, November 11, 11

Page 21: Pocket Knife JS

zepto.js

• minimalist JavaScript framework for mobile WebKit browsers, with a jQuery-compatible syntax.

• ~5kb

• has almost everything

Friday, November 11, 11

Page 22: Pocket Knife JS

zepto.js

$(document).ready(function(){ ... });

$.isFunction(function), $.isObject(object), $.isArray(array);

$('some selector').bind('click', function(event){ ... });

Friday, November 11, 11

Page 23: Pocket Knife JS

animation

Friday, November 11, 11

Page 24: Pocket Knife JS

émile

• Stand-alone CSS animation JavaScript mini-framework

• Doesn't need a JavaScript framework

• Full set of CSS properties for animation (length-based and colors)

• Easing and callbacks

• Less than 50 lines of code

Friday, November 11, 11

Page 25: Pocket Knife JS

émile

• one method

emile(element, style, options, after)

Friday, November 11, 11

Page 26: Pocket Knife JS

shifty

• A teeny tiny tweening engine in JavaScript

• low-level library meant to be encapsulated by higher-level tools

Friday, November 11, 11

Page 27: Pocket Knife JS

shifty - do’s

• Tweening of Numbers.

• Extensibility hooks for the tweening.

Friday, November 11, 11

Page 28: Pocket Knife JS

shifty - dont’s

• Keyframing.

• Drawing.

• Much else.

Friday, November 11, 11

Page 29: Pocket Knife JS

shiftyvar myTweenable = new Tweenable();

myTweenable.tween( from, to );

myTweenable.tween( from, to, duration, callback, easing );

myTweenable.tween({ from: { }, // Object. Contains the properties to tween. Must all be `Number`s. Note: This object's properties are modified by the tween. to: { }, // Object. The "destination" `Number`s that the properties in `from` will tween to. duration: 1000, // Number. How long the tween lasts for, in milliseconds. easing: 'linear', // String. Easing equation to use. You can specify any easing method that was attached to `Tweenable.prototype.formula`. start: function () {}, // Function. Runs as soon as the tween begins. Handy when used with the `queue` extension. step: function () {}, // Function. Runs each "frame" that the tween is updated. callback: function () {} // Function. Runs when the tween completes.});

Friday, November 11, 11

Page 30: Pocket Knife JS

swipe.js

• lightweight mobile slider with 1-to-1 touch movement

<div id='slider'> <ul> <li style='display:block'></li> <li style='display:none'></li> <li style='display:none'></li> <li style='display:none'></li> <li style='display:none'></li> </ul></div>

Friday, November 11, 11

Page 31: Pocket Knife JS

swipe.js

window.mySwipe = new Swipe(document.getElementById('slider'), { startSlide: 2, speed: 400, auto: 3000, callback: function(event, index, elem) { // do something cool }});

Friday, November 11, 11

Page 32: Pocket Knife JS

selectors

Friday, November 11, 11

Page 33: Pocket Knife JS

Jaguar

• standalone CSS selector engine developed for the Shrike JavaScript library

• 0 Regexes

• 0 Try-catch blocks

• No browser sniffing

• Only 3kb (minified and gzipped)

Friday, November 11, 11

Page 34: Pocket Knife JS

Jaguar

Jaguar.search(String selector[, DOMElement|DOMDocument context])// Or simply:Jaguar(String selector[, DOMElement|DOMDocument context])

Jaguar.match(Jaguar('#id')[0], '#id') // trueJaguar.match(Jaguar('#cake')[0], '.edible') // hopefully true

Friday, November 11, 11

Page 35: Pocket Knife JS

enhancement

Friday, November 11, 11

Page 36: Pocket Knife JS

underscore

• functional programming

• utility-belt library

• think Prototype.js

• without extending built-in

• so fits great with jQuery or Zepto

Friday, November 11, 11

Page 37: Pocket Knife JS

underscore

var lyrics = [ {line : 1, words : "I'm a lumberjack and I'm okay"}, {line : 2, words : "I sleep all night and I work all day"}, {line : 3, words : "He's a lumberjack and he's okay"}, {line : 4, words : "He sleeps all night and he works all day"}];

_(lyrics).chain() .map(function(line) { return line.words.split(' '); }) .flatten() .reduce(function(counts, word) { counts[word] = (counts[word] || 0) + 1; return counts;}, {}).value();

=> {lumberjack : 2, all : 4, night : 2 ... }

Friday, November 11, 11

Page 38: Pocket Knife JS

MVC

Friday, November 11, 11

Page 39: Pocket Knife JS

Backbone.js

• supplies structure to JavaScript-heavy applications

• Backbone's only hard dependency is Underscore.js. For RESTful persistence, history support via Backbone.Router and DOM manipulation with Backbone.View, include json2.js, and either jQuery ( > 1.4.2) or Zepto.

Friday, November 11, 11

Page 40: Pocket Knife JS

Backbone.jsvar Sidebar = Backbone.Model.extend({ promptColor: function() { var cssColor = prompt("Please enter a CSS color:"); this.set({color: cssColor}); }});

window.sidebar = new Sidebar;

var ItemView = Backbone.View.extend({ tagName: 'li'});

var item = new ItemView();

Friday, November 11, 11

Page 41: Pocket Knife JS

OOP

Friday, November 11, 11

Page 42: Pocket Knife JS

my-class

• 100% no wrappers, same perfs as hand-written pure JS classes

• not only a class implementation, it's mostly a class design

Friday, November 11, 11

Page 43: Pocket Knife JS

my-class

(function() {

var Person = my.Class({ constructor: function(name) { this.name = name; }, sayHello: function() { console.log('Hello from ' + this.name + '!'); } })

var Dreamer = my.Class(Person, { constructor: function(name, dream) { Dreamer.Super.call(this, name); this.dream = dream; }, sayDream: function() { console.log('I dream of ' + this.dream + '!'); } });

var sylvester = new Dreamer('Sylvester', 'eating Tweety'); sylvester.sayHello(); sylvester.sayDream();

alert('See this page source & open your JS console');

})();

Friday, November 11, 11

Page 44: Pocket Knife JS

communication

Friday, November 11, 11

Page 45: Pocket Knife JS

jXHR

• clone-variant of the XMLHttpRequest object API

• makes cross-domain JSON-P styled call

Friday, November 11, 11

Page 46: Pocket Knife JS

jXHRfunction handleError(msg,url) { alert(msg);}

function doit() { var x1 = new jXHR(); x1.onerror = handleError; x1.onreadystatechange = function(data){ if (x1.readyState === 4) { alert("Success:"+data.source); } }; x1.open("GET","jsonme.php?callback=?&data="+

encodeURIComponent(JSON.stringify({data:"my value 1"}))+"&_="+Math.random());

x1.send();}

Friday, November 11, 11

Page 47: Pocket Knife JS

benchmarking

Friday, November 11, 11

Page 48: Pocket Knife JS

benchmark.js

• works on nearly all JavaScript platforms

• supports high-resolution timers

• returns statistically significant results

Friday, November 11, 11

Page 49: Pocket Knife JS

benchmark.jsvar suite = new Benchmark.Suite;

// add testssuite.add('RegExp#test', function() { /o/.test('Hello World!');}).add('String#indexOf', function() { 'Hello World!'.indexOf('o') > -1;}).add('String#match', function() { !!'Hello World!'.match(/o/);})// add listeners.on('cycle', function(event, bench) { console.log(String(bench));}).on('complete', function() { console.log('Fastest is ' + this.filter('fastest').pluck('name'));})// run async.run({ 'async': true });

Friday, November 11, 11

Page 50: Pocket Knife JS

games

Friday, November 11, 11

Page 51: Pocket Knife JS

mibbu

• fast prototyping your Javascript game

• displayed using Canvas or DOM mode

• CSS animations

Friday, November 11, 11

Page 52: Pocket Knife JS

mibbu

Friday, November 11, 11

Page 53: Pocket Knife JS

feature detection

Friday, November 11, 11

Page 54: Pocket Knife JS

Modernizr

• feature detection with media queries and conditional resource loading

• adds classes to html element to say if a certain feature is available

• Modernizr JS object let’s you have a set of flags that help you building your code

Friday, November 11, 11

Page 55: Pocket Knife JS

Modernizr

if (Modernizr.geolocation) { //do whatever you want}

<html class="js canvas canvastext geolocation rgba hsla no-multiplebgs borderimage borderradius boxshadow opacity no-cssanimations csscolumns no-cssgradients no-cssreflections csstransforms no-csstransforms3d no-csstransitions video audio cufon-active fontface cufon-ready">

Friday, November 11, 11

Page 56: Pocket Knife JS

system.js

• Javacript object with the user's system information

document.body.innerHTML = [

'<strong>Browser</strong> ' + System.browser, '<strong>OS</strong> ' + System.os, '', '<strong>Canvas</strong> ' + System.support.canvas, '<strong>Local storage</strong> ' + System.support.localStorage, '<strong>File API</strong> ' + System.support.file, '<strong>FileSystem API</strong> ' + System.support.fileSystem, '<strong>RequestAnimationFrame</strong> ' + System.support.requestAnimationFrame, '<strong>Session storage</strong> ' + System.support.sessionStorage, '<strong>WebGL</strong> ' + System.support.webgl, '<strong>Worker</strong> ' + System.support.worker

].join( '<br />' );

Friday, November 11, 11

Page 57: Pocket Knife JS

events

Friday, November 11, 11

Page 58: Pocket Knife JS

EventEmitter

• you can listen for and emit events from what ever objects you choose

• port of the node.js EventEmitter

Friday, November 11, 11

Page 59: Pocket Knife JS

EventEmitter// Initialise the EventEmittervar ee = new EventEmitter();

// Initialise the listener functionfunction myListener() { console.log('The foo event was emitted.');}

// Add the listeneree.addListener('foo', myListener);

// Emit the foo eventee.emit('foo'); // The listener function is now called

// Remove the listeneree.removeListener('foo', myListener);

// Log the array of listeners to show that it has been removedconsole.log(ee.listeners('foo'));

Friday, November 11, 11

Page 60: Pocket Knife JS

polyfills

Friday, November 11, 11

Page 61: Pocket Knife JS

Augment.js

• Enables use of modern JavaScript by augmenting built in objects with the latest JavaScript methods

Friday, November 11, 11

Page 62: Pocket Knife JS

Augment.js

Array.prototype.everyArray.prototype.filterArray.prototype.forEachArray.prototype.indexOfArray.isArrayDate.nowDate.prototype.toJSONDate.prototype.toISOStringFunction.prototype.bindObject.keysString.prototype.trim

Friday, November 11, 11

Page 63: Pocket Knife JS

State Machine

Friday, November 11, 11

Page 64: Pocket Knife JS

gowiththeflow

• asynchronous flow-control micro library

• asynchronous code is executed, sequentially or in parallel

Friday, November 11, 11

Page 65: Pocket Knife JS

gowiththeflow

var Flow = require('gowiththeflow')Flow().seq(function(next){ console.log("step 1: started, it will last 1sec"); setTimeout(function(){ console.log("step 1: 1sec expired. Step 1 completed"); next(); }, 1000);}).seq(function(next){ console.log("step 2: run after step1 has been completed");})

Friday, November 11, 11

Page 66: Pocket Knife JS

what you just need

Friday, November 11, 11

Page 67: Pocket Knife JS

Ender

• Build only what you need, when you need it.

• Lightweight, expressive, familiar.

• think of it as NPM's little sister

• if one library goes bad or unmaintained, it can be replaced with another

Friday, November 11, 11

Page 68: Pocket Knife JS

Ender is not a JavaScript library.

Friday, November 11, 11

Page 69: Pocket Knife JS

Ender

ender build domready qwery underscore

$('#content a.button') .bind('click.button', function (e) { $(this).data('clicked', true).unbind() e.preventDefault() }) .css({ opacity: 1 , color: 'red' }) .fadeOut(250)$.map(['a', 'b', 'c'], function (letter) { return letter.toUpperCase()})$.ajax('/data', function (resp) { $('#content').html(resp)})

Friday, November 11, 11

Page 70: Pocket Knife JS

Ender

// IN THE BROWSER

// Require packages to access them as raw packagesvar _ = require('underscore') , _.each([1, 2, 3], alert)

// Access methods augmented directly to the $$.ready(function () { $([1, 2, null, 3]) .filter(function (item) { return item }) .each(alert)})

Friday, November 11, 11

Page 71: Pocket Knife JS

full purpose frameworks

Friday, November 11, 11

Page 72: Pocket Knife JS

full purpose frameworks

• jQuery

• Dojo

• Prototype.js

• YUI

• LibSAPO.js

• etc.

Friday, November 11, 11

Page 73: Pocket Knife JS

why should I bother?

Friday, November 11, 11

Page 74: Pocket Knife JS

be a better developer

Friday, November 11, 11

Page 76: Pocket Knife JS

Do’s and don’ts

Friday, November 11, 11

Page 77: Pocket Knife JS

Wrap Up

Friday, November 11, 11

Page 78: Pocket Knife JS

Use it carefully

Friday, November 11, 11

Page 79: Pocket Knife JS

Think for yourself

Friday, November 11, 11

Page 80: Pocket Knife JS

Thanks

Friday, November 11, 11