Nano? Pico? Femto? Atto?



Zepto!
  @thomasfuchs



    (cc) 2011 Thomas Fuchs
“real” computer
Fast and stable network connection
Lots of storage
Fast, multi-core CPUs
Hardware-accelerated graphics
Slow & unstable network connection
Limited storage
Slow CPUs
Hardware acceleration only on iOS
All major JS libs
  where created
before phones had
 web browsers to
write home about.
Don’t use something
  because it’s popular.

Use stuff because it’s the
 right tool for the job.
WebKit
Proprietary features
Adoption of features
  from JavaScript
    frameworks
Proprietary features
   are awesome
CSS Selectors
document.querySelectorAll('div.awesome > p')
full featured
              CSS3 selectors

// select all li elements with both "just" and "testing"
classnames
document.querySelectorAll('li.just.testing')

// how many paragraphs?
document.querySelectorAll('p').length

// select even paragraphs
document.querySelectorAll('p:nth-child(2n+1)')
[].slice.apply(nodelist)

           convert to
        JavaScript array



   document.querySelectorAll
   returns a NodeList, not an array
querySelectorAll


Full-featured CSS selectors
No need for external JavaScript libraries
Fast, native implementation

Returns a NodeList, not an array
JSON
JSON.stringify({
   s: 'a string',
   n: 123,
   d: new Date
})
JSON.parse('{"some":"json","test":123}')
Native JSON

Parsing JSON (convert to JS object)
Serializing JS objects to JSON
Fast, native implementation
No problem with security of “eval” as in
some JavaScript-based
implementations
Array iteration
[1,2,3].forEach(alert);
[1,2,3].forEach(alert);




array with three numbers
[1,2,3].forEach(alert);




   forEach is a native function on
 arrays, taking a function argument
[1,2,3].forEach(alert);




          call with window.alert
                   function
[1,2,3].forEach(alert);
[].slice.apply(nodelist).forEach(
    function(element){
      alert(element.innerHTML);
    }
 );



Iterate through all elements found,
  alerting the element’s contents
Array Iteration
Array Iteration

No more for loops required
Array Iteration

No more for loops required
No more for loops required
Array Iteration

No more for loops required
No more for loops required
No more for loops required
Array Iteration

No more for loops required
No more for loops required
No more for loops required
No more for loops required
Array Iteration

No more for loops required
No more for loops required
No more for loops required
No more for loops required
No more for loops required
Mobile JavaScript
  framework?
Why not use
Prototype, jQuery or
 other frameworks?
Some functionality is not
supported or not meaningful
    on mobile devices.



                              resizing & scrolling
                              orientation
                              fixed positioning
                              fonts
                              SVG
More code causes longer download
     and initialization times.
Most of the downloaded code
      isn’t even used.

(there’s no IE 6 to support on
  mobile phones, lucky us)
A lot of the rest of the code is
duplicating features that are
 directly available as native
      implementations.
Goals for a mobile
JavaScript framework
Reduce code size as much as
possible to keep download and
  initialization times down.
Easy to use API—possibly
emulating jQuery because
developers already know it.
Easy to extend and customize—
again, jQuery has a familiar plugin/
       extension mechanism
Ideally, have a fallback mechanism
  in case it’s run on non-WebKit
          mobile browsers.
It’s not so important
   what’s there, but
   what’s not there.
Meet zepto.js
     http://github.com/madrobby/zepto


Target size: 5K
jQuery-compatible API
Uses mobile WebKit features whenever possible
Easily replaceable with jQuery proper if needed
Doesn’t cover all of jQuery (but lots of it!)
31.33K




               4.83K
              Zepto (master)
 jQuery 1.6
Various special cases
Main use case $(some selector)
this saves ~6k of selector engine code
make sure dom is a JavaScript array
swap out the
      prototype,
  but leave “length”
and other properties
   intact, uses the
     proprietary
 __proto__ property
Z.prototype is pointing to $.fn which holds all
  methods that are used on found elements
Reusing array methods, works because
     we have an array-like object
this is an array-like of resulting nodes
 and a Zepto object at the same time
insertAdjacentElement is IE-
proprietary, but supported by WebKit




  (doesn’t work on Firefox!)
Zepto.js
    http://github.com/madrobby/zepto


CSS Selectors and DOM manipulation
Ajax including x-domain JSONP
Events (including touch events)
Polyfills and bug fixes for older WebKits
Modular (can leave out events, xhr, etc.)
WebKit only! (with focus on mobile)
/
m.checkers.com
One more thing…
scriptaculous
Prototype.js
jQuery
mootools
Micro-Frameworks




                   you/users are the rebels
                   —the ewoks are helping
                   you achieve your goals
Classic frameworks

Do all things and do it ok-ish
Force you into an API
Not modular/not modular enough
25k+ minified & gzipped
Many extensions are now available
in the DOM or JavaScript
Micro-Frameworks
      (are awesome!)
do one thing and do it really well
smaller than 5k, minified & gzipped
use directly or loosely coupled
Small is beautiful
easier to understand code & fork
downloads and runs faster
fewer bugs (less code!)
…and you’ll learn how
JavaScript REALLY works
{{ mustache }} ~ 1.5k
Lawnchair ~ 2.0k
Backbone.js ~ 3.9k
But how do I know
 what’s out there?
microjs.com
Add your own!
github.com/madrobby/
     microjs.com
Questions?
  @thomasfuchs

Zepto and the rise of the JavaScript Micro-Frameworks