HAS(“BUILDS”)
                             @dojoconf :: 16/17 Sept 2011 :: Peter Higgins




Monday, September 19, 2011
Me, Briefly.
                 Dojo Toolkit Project Lead

                 JavaScript Engineer @joost / Adconion

                 Blogs Infrequently :: http://higginsforpresident.net

                 Codes @GitHub :: http://github.com/phiggins42

                 Twitter: @phiggins

                 Beer Drinking Expert


Monday, September 19, 2011
THE HISTORY
                                ... and motivation




Monday, September 19, 2011
//>>webkitMobile

            //>>excludeStart("webkitMobile", kwArgs.webkitMobile);
            /*
            //>>excludeEnd("webkitMobile");
            //>>includeStart("webkitMobile", kwArgs.webkitMobile);
            ["indexOf", "lastIndexOf", "forEach", "map", "some", "every", "filter"].forEach(
                function(name, idx){
                    dojo[name] = function(arr, callback, thisObj){
                        if((idx > 1) && (typeof callback == "string")){
                            callback = new Function("item", "index", "array", callback);
                        }
                        return Array.prototype[name].call(arr, callback, thisObj);
                    }
                }
            );
            //>>includeEnd("webkitMobile");
            //>>excludeStart("webkitMobile", kwArgs.webkitMobile);
            */
            //>>excludeEnd("webkitMobile");




Monday, September 19, 2011
/sigh


                 Sloppy code

                 Error prone

                 Difficult debugging / Build required

                 Single specific platform




Monday, September 19, 2011
embed.js / Uxebu


                 different direction, same idea: minimal bytes

                 per-function modules

                 minimal API surface (a la carte)

                 Dojo based, but not Dojo




Monday, September 19, 2011
Modernizr


                 new features, not old bugs.

                 up front testing, all tests always

                 dojo.uacss-style HTML classes




Monday, September 19, 2011
dojo-fd


                 dojo/trunk branch

                 Pure feature detection

                 first has() sighting




Monday, September 19, 2011
has.js

                 Feature detection API

                 Feature + Future tests available

                 Minimal bytes / No initial overhead

                 Simple API for configurable code paths

                 Generic / Agnostic



Monday, September 19, 2011
has() in Dojo: old “sniff”

               require(["dojo/_base/sniff"], function(has){

                     has.add("some-magic", function(){
                         // randomly return true or false
                         return Math.random() > 0.5;
                     });

                     if(has("some-magic")){
                         // do it this way
                     }else{
                         // do it this way
                     }

               });




Monday, September 19, 2011
has() in Dojo: plugin

               define([
                   "dojo/has!native-array!mylib/Thinger!mylib/AltThinger"
               ], function(Thinger){

                      // Thinger is mylib/Thinger return if has("native-array")
                      // otherwise is mylib/AltThinger

                      // ideally they have the same API (a la embedjs)

               });




Monday, September 19, 2011
Builder


                 hasMap in profile

                 variable substitution

                 dead path removal




Monday, September 19, 2011
Builder

           mylib.trim = has("string-trim") ?
               function(str){ return str.trim(); } :
               function(str){ /* regexp/replace that guy */ };

           // build = { “string-trim”:“true” } becomes:

           my.trim = true ?
               function(a){ return a.trim(); } :
               function(a){ /* ... */ };

           // becomes:

           my.trim = function(a){ return a.trim(); }




Monday, September 19, 2011
Misc. Building


                 RequireJS

                 Dojo 1.7

                 ua-optimize https://github.com/kriszyp/ua-optimized




Monday, September 19, 2011
Detect or Assume

                 has() is agnostic

                 write own tests

                 document historic truth

                 limit impact of testing in production

                      10ms - 1800ms



Monday, September 19, 2011
WHERE
                             does this leave us?




Monday, September 19, 2011
AAAAND THANKS.
                                 I promise I’m done talking.




Monday, September 19, 2011
Me, again:

                 http://dante.dojotoolkit.org

                 http://higginsforpresident.net

                 http://twitter.com/phiggins

                 http://github.com/phiggins42

                 phiggins @ irc.freenode.net

                                          Questions?

Monday, September 19, 2011

has("builds")

  • 1.
    HAS(“BUILDS”) @dojoconf :: 16/17 Sept 2011 :: Peter Higgins Monday, September 19, 2011
  • 2.
    Me, Briefly. Dojo Toolkit Project Lead JavaScript Engineer @joost / Adconion Blogs Infrequently :: http://higginsforpresident.net Codes @GitHub :: http://github.com/phiggins42 Twitter: @phiggins Beer Drinking Expert Monday, September 19, 2011
  • 3.
    THE HISTORY ... and motivation Monday, September 19, 2011
  • 4.
    //>>webkitMobile //>>excludeStart("webkitMobile", kwArgs.webkitMobile); /* //>>excludeEnd("webkitMobile"); //>>includeStart("webkitMobile", kwArgs.webkitMobile); ["indexOf", "lastIndexOf", "forEach", "map", "some", "every", "filter"].forEach( function(name, idx){ dojo[name] = function(arr, callback, thisObj){ if((idx > 1) && (typeof callback == "string")){ callback = new Function("item", "index", "array", callback); } return Array.prototype[name].call(arr, callback, thisObj); } } ); //>>includeEnd("webkitMobile"); //>>excludeStart("webkitMobile", kwArgs.webkitMobile); */ //>>excludeEnd("webkitMobile"); Monday, September 19, 2011
  • 5.
    /sigh Sloppy code Error prone Difficult debugging / Build required Single specific platform Monday, September 19, 2011
  • 6.
    embed.js / Uxebu different direction, same idea: minimal bytes per-function modules minimal API surface (a la carte) Dojo based, but not Dojo Monday, September 19, 2011
  • 7.
    Modernizr new features, not old bugs. up front testing, all tests always dojo.uacss-style HTML classes Monday, September 19, 2011
  • 8.
    dojo-fd dojo/trunk branch Pure feature detection first has() sighting Monday, September 19, 2011
  • 9.
    has.js Feature detection API Feature + Future tests available Minimal bytes / No initial overhead Simple API for configurable code paths Generic / Agnostic Monday, September 19, 2011
  • 10.
    has() in Dojo:old “sniff” require(["dojo/_base/sniff"], function(has){ has.add("some-magic", function(){ // randomly return true or false return Math.random() > 0.5; }); if(has("some-magic")){ // do it this way }else{ // do it this way } }); Monday, September 19, 2011
  • 11.
    has() in Dojo:plugin define([ "dojo/has!native-array!mylib/Thinger!mylib/AltThinger" ], function(Thinger){ // Thinger is mylib/Thinger return if has("native-array") // otherwise is mylib/AltThinger // ideally they have the same API (a la embedjs) }); Monday, September 19, 2011
  • 12.
    Builder hasMap in profile variable substitution dead path removal Monday, September 19, 2011
  • 13.
    Builder mylib.trim = has("string-trim") ? function(str){ return str.trim(); } : function(str){ /* regexp/replace that guy */ }; // build = { “string-trim”:“true” } becomes: my.trim = true ? function(a){ return a.trim(); } : function(a){ /* ... */ }; // becomes: my.trim = function(a){ return a.trim(); } Monday, September 19, 2011
  • 14.
    Misc. Building RequireJS Dojo 1.7 ua-optimize https://github.com/kriszyp/ua-optimized Monday, September 19, 2011
  • 15.
    Detect or Assume has() is agnostic write own tests document historic truth limit impact of testing in production 10ms - 1800ms Monday, September 19, 2011
  • 16.
    WHERE does this leave us? Monday, September 19, 2011
  • 17.
    AAAAND THANKS. I promise I’m done talking. Monday, September 19, 2011
  • 18.
    Me, again: http://dante.dojotoolkit.org http://higginsforpresident.net http://twitter.com/phiggins http://github.com/phiggins42 phiggins @ irc.freenode.net Questions? Monday, September 19, 2011