Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

Who am I Friday, November 11, 11

Slide 3

Slide 3 text

Who am I • Diogo Antunes Friday, November 11, 11

Slide 4

Slide 4 text

Who am I • Diogo Antunes • JavaScript developer @ SAPO Friday, November 11, 11

Slide 5

Slide 5 text

Who am I • Diogo Antunes • JavaScript developer @ SAPO • @dicode Friday, November 11, 11

Slide 6

Slide 6 text

Who am I • Diogo Antunes • JavaScript developer @ SAPO • @dicode • http://js.sapo.pt Friday, November 11, 11

Slide 7

Slide 7 text

JS World • Wonderful things are happening • Lot’s of new code, snippets • Great community • Always looking forward Friday, November 11, 11

Slide 8

Slide 8 text

Why? • JS is cool • Lot to learn • Lot to innovate Friday, November 11, 11

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

Going deep Friday, November 11, 11

Slide 11

Slide 11 text

Templating Friday, November 11, 11

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

Mustache var view = { "name": "Bill", "address": { "street": "801 Streetly street", "city": "Boston", "state": "MA", "zip" "02101" } } var template = '

Contact: {{name}}

{{#address}}

{{street}}

{{city}}, {{state}} {{zip}}

{{/address}}'; var html = Mustache.to_html(template, view);

Contact: Bill

801 Streetly street

Boston, MA 02101

Friday, November 11, 11

Slide 14

Slide 14 text

Loaders Friday, November 11, 11

Slide 15

Slide 15 text

Lab.js • Loading And Blocking JavaScript • Load JS from anywhere at anytime • You can even load LABjs dynamically Friday, November 11, 11

Slide 16

Slide 16 text

Lab.js $LAB .script("framework.js").wait() .script("plugin.framework.js") .script("myplugin.framework.js").wait() .script("init.js").wait(); Friday, November 11, 11

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

require.js My Sample Project

My Sample Project

project-directory/ project.html scripts/ main.js require.js helper/ util.js Friday, November 11, 11

Slide 19

Slide 19 text

require.js My Sample Project

My Sample Project

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

Slide 20

Slide 20 text

webkit-based Friday, November 11, 11

Slide 21

Slide 21 text

zepto.js • minimalist JavaScript framework for mobile WebKit browsers, with a jQuery-compatible syntax. • ~5kb • has almost everything Friday, November 11, 11

Slide 22

Slide 22 text

zepto.js $(document).ready(function(){ ... }); $.isFunction(function), $.isObject(object), $.isArray(array); $('some selector').bind('click', function(event){ ... }); Friday, November 11, 11

Slide 23

Slide 23 text

animation Friday, November 11, 11

Slide 24

Slide 24 text

é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

Slide 25

Slide 25 text

émile • one method emile(element, style, options, after) Friday, November 11, 11

Slide 26

Slide 26 text

shifty • A teeny tiny tweening engine in JavaScript • low-level library meant to be encapsulated by higher-level tools Friday, November 11, 11

Slide 27

Slide 27 text

shifty - do’s • Tweening of Numbers. • Extensibility hooks for the tweening. Friday, November 11, 11

Slide 28

Slide 28 text

shifty - dont’s • Keyframing. • Drawing. • Much else. Friday, November 11, 11

Slide 29

Slide 29 text

shifty var 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

Slide 30

Slide 30 text

swipe.js • lightweight mobile slider with 1-to-1 touch movement
Friday, November 11, 11

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

selectors Friday, November 11, 11

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

Jaguar Jaguar.search(String selector[, DOMElement|DOMDocument context]) // Or simply: Jaguar(String selector[, DOMElement|DOMDocument context]) Jaguar.match(Jaguar('#id')[0], '#id') // true Jaguar.match(Jaguar('#cake')[0], '.edible') // hopefully true Friday, November 11, 11

Slide 35

Slide 35 text

enhancement Friday, November 11, 11

Slide 36

Slide 36 text

underscore • functional programming • utility-belt library • think Prototype.js • without extending built-in • so fits great with jQuery or Zepto Friday, November 11, 11

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

MVC Friday, November 11, 11

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

Backbone.js var 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

Slide 41

Slide 41 text

OOP Friday, November 11, 11

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

communication Friday, November 11, 11

Slide 45

Slide 45 text

jXHR • clone-variant of the XMLHttpRequest object API • makes cross-domain JSON-P styled call Friday, November 11, 11

Slide 46

Slide 46 text

jXHR function 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

Slide 47

Slide 47 text

benchmarking Friday, November 11, 11

Slide 48

Slide 48 text

benchmark.js • works on nearly all JavaScript platforms • supports high-resolution timers • returns statistically significant results Friday, November 11, 11

Slide 49

Slide 49 text

benchmark.js var suite = new Benchmark.Suite; // add tests suite.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

Slide 50

Slide 50 text

games Friday, November 11, 11

Slide 51

Slide 51 text

mibbu • fast prototyping your Javascript game • displayed using Canvas or DOM mode • CSS animations Friday, November 11, 11

Slide 52

Slide 52 text

mibbu Friday, November 11, 11

Slide 53

Slide 53 text

feature detection Friday, November 11, 11

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

Modernizr if (Modernizr.geolocation) { //do whatever you want } Friday, November 11, 11

Slide 56

Slide 56 text

system.js • Javacript object with the user's system information document.body.innerHTML = [ 'Browser ' + System.browser, 'OS ' + System.os, '', 'Canvas ' + System.support.canvas, 'Local storage ' + System.support.localStorage, 'File API ' + System.support.file, 'FileSystem API ' + System.support.fileSystem, 'RequestAnimationFrame ' + System.support.requestAnimationFrame, 'Session storage ' + System.support.sessionStorage, 'WebGL ' + System.support.webgl, 'Worker ' + System.support.worker ].join( '
' ); Friday, November 11, 11

Slide 57

Slide 57 text

events Friday, November 11, 11

Slide 58

Slide 58 text

EventEmitter • you can listen for and emit events from what ever objects you choose • port of the node.js EventEmitter Friday, November 11, 11

Slide 59

Slide 59 text

EventEmitter // Initialise the EventEmitter var ee = new EventEmitter(); // Initialise the listener function function myListener() { console.log('The foo event was emitted.'); } // Add the listener ee.addListener('foo', myListener); // Emit the foo event ee.emit('foo'); // The listener function is now called // Remove the listener ee.removeListener('foo', myListener); // Log the array of listeners to show that it has been removed console.log(ee.listeners('foo')); Friday, November 11, 11

Slide 60

Slide 60 text

polyfills Friday, November 11, 11

Slide 61

Slide 61 text

Augment.js • Enables use of modern JavaScript by augmenting built in objects with the latest JavaScript methods Friday, November 11, 11

Slide 62

Slide 62 text

Augment.js Array.prototype.every Array.prototype.filter Array.prototype.forEach Array.prototype.indexOf Array.isArray Date.now Date.prototype.toJSON Date.prototype.toISOString Function.prototype.bind Object.keys String.prototype.trim Friday, November 11, 11

Slide 63

Slide 63 text

State Machine Friday, November 11, 11

Slide 64

Slide 64 text

gowiththeflow • asynchronous flow-control micro library • asynchronous code is executed, sequentially or in parallel Friday, November 11, 11

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

what you just need Friday, November 11, 11

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

Ender is not a JavaScript library. Friday, November 11, 11

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

Ender // IN THE BROWSER // Require packages to access them as raw packages var _ = 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

Slide 71

Slide 71 text

full purpose frameworks Friday, November 11, 11

Slide 72

Slide 72 text

full purpose frameworks • jQuery • Dojo • Prototype.js • YUI • LibSAPO.js • etc. Friday, November 11, 11

Slide 73

Slide 73 text

why should I bother? Friday, November 11, 11

Slide 74

Slide 74 text

be a better developer Friday, November 11, 11

Slide 75

Slide 75 text

Make It Work Make It Right Make It Fast Friday, November 11, 11

Slide 76

Slide 76 text

Do’s and don’ts Friday, November 11, 11

Slide 77

Slide 77 text

Wrap Up Friday, November 11, 11

Slide 78

Slide 78 text

Use it carefully Friday, November 11, 11

Slide 79

Slide 79 text

Think for yourself Friday, November 11, 11

Slide 80

Slide 80 text

Thanks Friday, November 11, 11