SlideShare a Scribd company logo
1 of 65
Download to read offline
dojo.Patterns
                 (for Lovers of JavaScript)




   Peter Higgins (dante)
Dojo Toolkit Project Lead
 jsconf 2009 - Apr 24, 25
Me.

http://dante.dojotoolkit.org
http://twitter.com/phiggins
The History of Dojo
      (cliffnotes version)
Alex Russell
“netwindows”
A Foundation.
A Team.
What is Dojo?

• A JavaScript Toolkit
  - Light-weight Base (6k - 26k)
     - ~30k in 1.4 (plugd)
  - Use at will Library
http://xkcd.com/353
Charts?
Charts?




dojo.require(“dojox.charting”)
Calendars?
Calendars?
dojo.require(“dijit.form.DateTextBox”)
File Uploads?
File Uploads?
dojo.require(“dojox.form.FileUpload”)
Syntax Highlighting?
Syntax Highlighting?
dojo.require(“dojox.highlight”)
... On and On
... On and On
It adds up.
Dojo Build System
All-in-One

• Works transparently with Package System
• Group modules into ‘layers’
• Concatenate CSS @import into ‘layers’
• Layer & File minification
   - Comments, Whitespace, newlines ...
• stripConsole (console.warn, .log, .error)
Firebug Lite
Package / Module Loading

• dojo.require(“some.module”)
• dojo.addOnLoad(function(){ ... })
• dojo.registerModulePath(“my”, “../../my/”)
• dojo.require(“my.code”)
• dojo.provide(“my.code”)
#ifdef in JavaScript?

// the code:
//>>excludeStart(“something”, kwArgs.condition == true);
/* code to exclude */
//>>excludeStop(“something”);


# exclude it:
./build.sh condition=true profile=myprofile
Special Builds

 • Stubs (6k dojo.js)
 • Base++ (dojo.js with modules)
 • Cross-Domain
 • plugd
 • Scope Burning
MooJo?
scopeMap + kwArgs


     // Dojo?
     Moo.load(function(){
     
    place(quot;<p>Hello, Moojo</p>quot;, quot;containerquot;);
     
    query(quot;pquot;)
     
    
 .style(quot;fontSizequot;, quot;10pxquot;)
     
    
 .animate({
     
    
 
 fontSize:{ end: 42 }
     
    
 })
          ;
     });




http://dante.dojotoolkit.org/static/otherlibs/moojo.html
//>>excludeStart(“auto”, kwArgs.autoConflict == “on”)
     if(dojo.config.conflict){
     //>>excludeStop(“auto”)

          // exportNS is a plugd plugin
          dojo.exportNS(dojo, dojo.global);

     //>>excludeStart(“auto”, kwArgs.autoConflict == “on”)
     }
     //>>excludeStop(“auto”)




http://dante.dojotoolkit.org/static/otherlibs/moojo.html
TaskSpeed

  • Written by Authors
  • Fair before Right
  • An interesting start
  • Charts Available*


* http://dante.dojotoolkit.org/taskspeed/report/charts.html
It’s JUST JavaScript
Plain JavaScript

 • JavaScript should have:
    - dojo.indexOf / forEach / map / filter
    - hitch / partial (we get bind()!)
    - declare / delegate / mixin / extend
 • Design Philosophy
    - Defense: Namespaces / Globals
    - Offense: Forward Thinking APIs
Forward Thinking


 // Defer to native trim if available
 dojo.trim = String.prototype.trim ?
    function(str){ return str.trim() } :
    function(str){ /* slightly longer regexp version */ }

 // Mimic Mozilla Array methods:
 dojo.forEach = function(array, callback, scope){ ... }
 dojo.map = function(array, callback, scope){ ... }
 dojo.filter = function(array, callback, scope){ ... }
DojoType (the project)

   // put Dojo Array methods on all Array’s
   dojo._clobber(Array.prototype, {
      forEach: function(callback, scope){
         dojo.forEach(this, callback, scope);
         return this;
      },
      map: function(callback, scope){
         return dojo.map(this, callback, scope);
      }
   });

   // use the new ‘native’ functions:
   [1,2,3,4,5].map(function(i){ return i % 2 === 0 })
      .forEach(function(val){ /* do something */ });




http://code.google.com/p/dojotype
Base at a glance



cheat sheet available: http://download.dojotoolkit.org/current-stable/cheat.pdf
Events, Ajax, FX, DOM

• dojo.connect(node, “onclick”, function(){ });
• dojo.connect(obj, “custom”, obj, “sync”);
• dojo.xhrPost({ form:”login”, load:function(data){ ... } });
• dojo.xhrGet({ url:”foo.txt”, load:function(data){ ... } });
• dojo.anim(node, { width:200 });
• dojo.fadeIn({ node: node }).play();
• dojo.style(n, “height”, “50px”);
• dojo.place(“<p>Hi</p>”, dojo.body());
CSS Selectors

• dojo.query(“ul > li”).addClass(“listy”);
• dojo.query(“a”).onclick(function(){ });
• dojo.query(“tr td + td”).forEach(function(n){ });
• dojo.query(“.someClass”).map(function(n){ .. });
• dojo.NodeList.prototype / dojo.extend
Basic Patterns
Magic Arguments


 // function signatures with defaults
 my.func = function(args){
    var opts = dojo.mixin({
        prop:”foo”
    }, args || {});
    console.log(opts.prop);
 }

 my.func(); // “foo”
 my.func({ prop:”bar” }); // “bar”
DOM Arguments


 var n = document.getElementById(“someId”);
 n.style.width = “200px”;

 // pattern: dojo.byId
 var n = dojo.byId(“someId”)
 // pick:
 dojo.style(n, “width”, “200px”);
 dojo.style(“someId”, “width”, “200px”);
 dojo.query(“#someId”).style(“width”, “200px”);
DOM Arguments


// Accept a String ID or DomNode Reference
my.func = function(node, args){
   node = dojo.byId(node);
   var opts = dojo.mixin({
       prop:”foo”
   }, args||{});
   console.log(opts.prop);
}

my.func(“someId”); // “foo”
my.func(nodeRef, { prop:”bar” }); // “bar”
Ambiguous Constructors (poj)

 some.Thing = function(args, node){
    dojo.mixin(this, args);
 }
 dojo.extend(some.Thing, {
    opt:”a-default”,
    method: function(){
         console.log(this.opt);
    }
 });

 var a = new some.Thing(), b = new some.Thing({ opt:”x” });
 a.opt == “a-default”
 b.opt == “x”
Ambiguous Constructors (declare)


 // allows for simulated inheritance
 dojo.declare(“some.Thing”, null, {
     opt:”a-default”,
     constructor: function(args, node){
         dojo.mixin(this, args);
     }
 });

 var a = new some.Thing(), b = new some.Thing({ opt:”x” });
 a.opt == “a-default”
 b.opt == “x”
Ambiguous Constructors


 // uses the patterns:
 dojo.require(“dojo.parser”);

 <!-- in html -->
 <div id=”baz” dojoType=”some.ClassThing” prop=”value”></div>

 // or without parsing - “poj”
 new some.ClassThing({ prop:”value” }, “baz”);

 // or from no DOM at all
 new some.ClassThing({}).placeAt(“container”);
DRY: Functional JS


 my.turnIt = function(dir){
    // if 1, go next. -1, go left.
 }

 var next = dojo.partial(my.turnIt, 1),
     prev = dojo.partial(my.turnIt, -1);

 // later
 dojo.query(“.nextbutton”).onclick(next);
Dual Service Functions

 my.func = function(node, args){
   node = dojo.byId(node); // Sting|DomNode
   /* do something to node */
 }

 dojo.extend(dojo.NodeList, {
    // now a plugin:
    func: dojo.NodeList._adaptAsForEach(my.func)
 });

 // run one, run all
 my.func(“someId”, { opts:true });
 dojo.query(“.someNodes”).func({ opts:true })
Chaining

 // NodeList:
 dojo.query(“.bar”)
    .addClass(“baz”)
    .onclick(fn)
    .place(“#foo”, “before”)
    .blah().blah().blah().blah(n).blah();

 // Elsewhere
 new dojox.gfx.Shape(surface)
    .addFill(“#ededed”).setStroke(...).connect(...);

 // really just “this”
$ vs PlugD


- Dojo - dojo.query(“.class”) dojo.byId(“id”)
- jQuery - $(“.class”) $(“#id”)
- Prototype - $$(“.class”) $(“id”)
- MooTools - $$(“.class”) $(“id”)
$ vs PlugD


 dojo.conflict();
 $(document).ready(function(){
    $(“#bar”).onclick(fn);
 });

 // or automatically:
 var djConfig = { conflict: true };

 # automatically via build:
 ./build.sh autoConflict=on profile=plugd
Expansion Patterns
dojo.Deferred

• from Twisted/Python
• ASYNC Contract
• Chained Callbacks
• Scope-Aware
Indirect Usage

 // plain xhr
 dojo.xhrGet({
    url:”foo.html“,
    load: function(data){
       /* handle response */
    }
 });

 // manipulating scope
 dojo.xhrGet({
    url:”foo.html”,
    error: dojo.hitch(otherScope, function(e){
       this.logError(e);
    })
 });
Why embed?
 // plain xhr
 dojo.xhrGet({
    url:”foo.html“,
    load: function(data){
       /* handle response */
       dojo.xhrPost({
          form:”bar”,
          content: data,
          load:function(){
             // then update some ui, add another callback ...
             // “ugh”
          }
       })
    }
 });
More ‘Direct’ Usage

 var d = dojo.xhrGet({ url:”foo.html“ })
    .addCallback(function(data){
       // can modify data along response chain
       return data.toLowerCase();
    })
    .addCallback(andPost) // a function that handles data
    .addErrback(otherScope, “errHandler”);

 // elsewhere:
 d.addCallback(function(data){
    /* handle it, return nothing */
 });
dojo.data

• More than just DOM
• API at the core
  - Read, Write, Identity, Notification
• Common Functions and Callbacks
• Direct communication
• RESTful
Store Example?

 // load the store:
 dojo.require(“dojox.data.GoogleServiceStore”);

 // make the store:
 var store = new dojox.data.GoogleSearchStore(...);

 store.fetch({
      // the request:
      query:{ q:”Dojo” },
      // the “wiring”
      onItem: dojo.hitch(thinger, “addItem”),
      onComplete: dojo.hitch(thinger, “render”)
 });
http://persevere.sitepen.com/stocker.html
dojox.data Stores:
 • AndOrReadStore     • FlickrRestStore /
 • AppStore             FlickrStore
                      • GoogleFeedStore
 • AtomReadStore
                      • GoogleSearchStore
 • CouchDBRestStore
                      • HtmlStore
 • CssRuleStore
                      • jsonPathStore
 • CsvStore
                      • jsonRestStore
 • FileStore
                      • OpmlStore
Data Consumers:
RPC / SMD
SMD


 dojo.require(“dojox.rpc.Service”);

 var goog = new dojox.rpc.Service(“google.smd”);

 goog.websearch({ q:”Dojo” }).addCallback(function(response){
    // handle the responses
 });

 goog.booksearch({ q:”Dojo” }).addBoth(function(response){
    // Books about Dojo
 });
The Dojo Toolkit


• Long standing Development
• Large, Active Developer Base
• Friendly Professional Community
• Liberally Licensed, Clean IP




http://dojotoolkit.org http://dojofoundation.org
Questions?
Me, Again.
    dante@dojotoolkit.org
 http://twitter.com/phiggins
http://higginsforpresident.net/

More Related Content

What's hot

Advanced guide to develop ajax applications using dojo
Advanced guide to develop ajax applications using dojoAdvanced guide to develop ajax applications using dojo
Advanced guide to develop ajax applications using dojoFu Cheng
 
jQuery in the [Aol.] Enterprise
jQuery in the [Aol.] EnterprisejQuery in the [Aol.] Enterprise
jQuery in the [Aol.] EnterpriseDave Artz
 
JavaScript and jQuery Basics
JavaScript and jQuery BasicsJavaScript and jQuery Basics
JavaScript and jQuery BasicsKaloyan Kosev
 
The Dojo Toolkit An Introduction
The Dojo Toolkit   An IntroductionThe Dojo Toolkit   An Introduction
The Dojo Toolkit An IntroductionJeff Fox
 
Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점
Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점
Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점Jeado Ko
 
Node.js & Twitter Bootstrap Crash Course
Node.js & Twitter Bootstrap Crash CourseNode.js & Twitter Bootstrap Crash Course
Node.js & Twitter Bootstrap Crash CourseAaron Silverman
 
Bootstrap과 UI-Bootstrap
Bootstrap과 UI-BootstrapBootstrap과 UI-Bootstrap
Bootstrap과 UI-BootstrapWebFrameworks
 
Introduction To Dojo
Introduction To DojoIntroduction To Dojo
Introduction To Dojoyoavrubin
 
Moving to Dojo 1.7 and the path to 2.0
Moving to Dojo 1.7 and the path to 2.0Moving to Dojo 1.7 and the path to 2.0
Moving to Dojo 1.7 and the path to 2.0James Thomas
 
Data presentation with dust js technologies backing linkedin
Data presentation with dust js   technologies backing linkedinData presentation with dust js   technologies backing linkedin
Data presentation with dust js technologies backing linkedinRuhaim Izmeth
 
HTML5와 오픈소스 기반의 Web Components 기술
HTML5와 오픈소스 기반의 Web Components 기술HTML5와 오픈소스 기반의 Web Components 기술
HTML5와 오픈소스 기반의 Web Components 기술Jeongkyu Shin
 
Dependency Management with RequireJS
Dependency Management with RequireJSDependency Management with RequireJS
Dependency Management with RequireJSAaronius
 
Dojo javascript toolkit
Dojo javascript toolkit Dojo javascript toolkit
Dojo javascript toolkit Predhin Sapru
 

What's hot (20)

Advanced guide to develop ajax applications using dojo
Advanced guide to develop ajax applications using dojoAdvanced guide to develop ajax applications using dojo
Advanced guide to develop ajax applications using dojo
 
jQuery in the [Aol.] Enterprise
jQuery in the [Aol.] EnterprisejQuery in the [Aol.] Enterprise
jQuery in the [Aol.] Enterprise
 
handout-05b
handout-05bhandout-05b
handout-05b
 
JavaScript and jQuery Basics
JavaScript and jQuery BasicsJavaScript and jQuery Basics
JavaScript and jQuery Basics
 
The Dojo Toolkit An Introduction
The Dojo Toolkit   An IntroductionThe Dojo Toolkit   An Introduction
The Dojo Toolkit An Introduction
 
Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점
Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점
Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점
 
Java script
Java scriptJava script
Java script
 
Node.js & Twitter Bootstrap Crash Course
Node.js & Twitter Bootstrap Crash CourseNode.js & Twitter Bootstrap Crash Course
Node.js & Twitter Bootstrap Crash Course
 
Bootstrap과 UI-Bootstrap
Bootstrap과 UI-BootstrapBootstrap과 UI-Bootstrap
Bootstrap과 UI-Bootstrap
 
Introduction To Dojo
Introduction To DojoIntroduction To Dojo
Introduction To Dojo
 
J query intro_29thsep_alok
J query intro_29thsep_alokJ query intro_29thsep_alok
J query intro_29thsep_alok
 
Moving to Dojo 1.7 and the path to 2.0
Moving to Dojo 1.7 and the path to 2.0Moving to Dojo 1.7 and the path to 2.0
Moving to Dojo 1.7 and the path to 2.0
 
HTML5 Introduction by Dhepthi L
HTML5 Introduction by Dhepthi LHTML5 Introduction by Dhepthi L
HTML5 Introduction by Dhepthi L
 
Data presentation with dust js technologies backing linkedin
Data presentation with dust js   technologies backing linkedinData presentation with dust js   technologies backing linkedin
Data presentation with dust js technologies backing linkedin
 
HTML5와 오픈소스 기반의 Web Components 기술
HTML5와 오픈소스 기반의 Web Components 기술HTML5와 오픈소스 기반의 Web Components 기술
HTML5와 오픈소스 기반의 Web Components 기술
 
Liking performance
Liking performanceLiking performance
Liking performance
 
Dependency Management with RequireJS
Dependency Management with RequireJSDependency Management with RequireJS
Dependency Management with RequireJS
 
Dojo javascript toolkit
Dojo javascript toolkit Dojo javascript toolkit
Dojo javascript toolkit
 
Vue js for beginner
Vue js for beginner Vue js for beginner
Vue js for beginner
 
Aleact
AleactAleact
Aleact
 

Similar to dojo.Patterns

The Beauty Of Java Script V5a
The Beauty Of Java Script V5aThe Beauty Of Java Script V5a
The Beauty Of Java Script V5arajivmordani
 
LISA QooxdooTutorial Slides
LISA QooxdooTutorial SlidesLISA QooxdooTutorial Slides
LISA QooxdooTutorial SlidesTobias Oetiker
 
The Dojo Build System
The Dojo Build SystemThe Dojo Build System
The Dojo Build Systemklipstein
 
JavaScript Growing Up
JavaScript Growing UpJavaScript Growing Up
JavaScript Growing UpDavid Padbury
 
LISA Qooxdoo Tutorial Handouts
LISA Qooxdoo Tutorial HandoutsLISA Qooxdoo Tutorial Handouts
LISA Qooxdoo Tutorial HandoutsTobias Oetiker
 
Grails 1.2 探検隊 -新たな聖杯をもとめて・・・-
Grails 1.2 探検隊 -新たな聖杯をもとめて・・・-Grails 1.2 探検隊 -新たな聖杯をもとめて・・・-
Grails 1.2 探検隊 -新たな聖杯をもとめて・・・-Tsuyoshi Yamamoto
 
Bubbles & Trees with jQuery
Bubbles & Trees with jQueryBubbles & Trees with jQuery
Bubbles & Trees with jQueryBastian Feder
 
Web Crawling with NodeJS
Web Crawling with NodeJSWeb Crawling with NodeJS
Web Crawling with NodeJSSylvain Zimmer
 
Express Presentation
Express PresentationExpress Presentation
Express Presentationaaronheckmann
 
Functional programming using underscorejs
Functional programming using underscorejsFunctional programming using underscorejs
Functional programming using underscorejs偉格 高
 
Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008Guillaume Laforge
 

Similar to dojo.Patterns (20)

Trimming The Cruft
Trimming The CruftTrimming The Cruft
Trimming The Cruft
 
Txjs
TxjsTxjs
Txjs
 
The Beauty Of Java Script V5a
The Beauty Of Java Script V5aThe Beauty Of Java Script V5a
The Beauty Of Java Script V5a
 
The Beauty of Java Script
The Beauty of Java ScriptThe Beauty of Java Script
The Beauty of Java Script
 
Using Dojo
Using DojoUsing Dojo
Using Dojo
 
Dojo and Adobe AIR
Dojo and Adobe AIRDojo and Adobe AIR
Dojo and Adobe AIR
 
LISA QooxdooTutorial Slides
LISA QooxdooTutorial SlidesLISA QooxdooTutorial Slides
LISA QooxdooTutorial Slides
 
ES6 is Nigh
ES6 is NighES6 is Nigh
ES6 is Nigh
 
The Dojo Build System
The Dojo Build SystemThe Dojo Build System
The Dojo Build System
 
JavaScript Growing Up
JavaScript Growing UpJavaScript Growing Up
JavaScript Growing Up
 
LISA Qooxdoo Tutorial Handouts
LISA Qooxdoo Tutorial HandoutsLISA Qooxdoo Tutorial Handouts
LISA Qooxdoo Tutorial Handouts
 
Grails 1.2 探検隊 -新たな聖杯をもとめて・・・-
Grails 1.2 探検隊 -新たな聖杯をもとめて・・・-Grails 1.2 探検隊 -新たな聖杯をもとめて・・・-
Grails 1.2 探検隊 -新たな聖杯をもとめて・・・-
 
Bubbles & Trees with jQuery
Bubbles & Trees with jQueryBubbles & Trees with jQuery
Bubbles & Trees with jQuery
 
Web Crawling with NodeJS
Web Crawling with NodeJSWeb Crawling with NodeJS
Web Crawling with NodeJS
 
Express Presentation
Express PresentationExpress Presentation
Express Presentation
 
Functional programming using underscorejs
Functional programming using underscorejsFunctional programming using underscorejs
Functional programming using underscorejs
 
Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008
 
Having Fun with Play
Having Fun with PlayHaving Fun with Play
Having Fun with Play
 
A More Flash Like Web?
A More Flash Like Web?A More Flash Like Web?
A More Flash Like Web?
 
Mongo-Drupal
Mongo-DrupalMongo-Drupal
Mongo-Drupal
 

More from Peter Higgins

More from Peter Higgins (6)

Jsconf.us.2013
Jsconf.us.2013Jsconf.us.2013
Jsconf.us.2013
 
has("builds")
has("builds")has("builds")
has("builds")
 
has.js
has.jshas.js
has.js
 
Just JavaScript
Just JavaScriptJust JavaScript
Just JavaScript
 
Your Library Sucks, and why you should use it.
Your Library Sucks, and why you should use it.Your Library Sucks, and why you should use it.
Your Library Sucks, and why you should use it.
 
dojo.things()
dojo.things()dojo.things()
dojo.things()
 

Recently uploaded

From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 

Recently uploaded (20)

From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 

dojo.Patterns

  • 1. dojo.Patterns (for Lovers of JavaScript) Peter Higgins (dante) Dojo Toolkit Project Lead jsconf 2009 - Apr 24, 25
  • 3.
  • 4. The History of Dojo (cliffnotes version)
  • 8. What is Dojo? • A JavaScript Toolkit - Light-weight Base (6k - 26k) - ~30k in 1.4 (plugd) - Use at will Library
  • 22. All-in-One • Works transparently with Package System • Group modules into ‘layers’ • Concatenate CSS @import into ‘layers’ • Layer & File minification - Comments, Whitespace, newlines ... • stripConsole (console.warn, .log, .error)
  • 24. Package / Module Loading • dojo.require(“some.module”) • dojo.addOnLoad(function(){ ... }) • dojo.registerModulePath(“my”, “../../my/”) • dojo.require(“my.code”) • dojo.provide(“my.code”)
  • 25. #ifdef in JavaScript? // the code: //>>excludeStart(“something”, kwArgs.condition == true); /* code to exclude */ //>>excludeStop(“something”); # exclude it: ./build.sh condition=true profile=myprofile
  • 26. Special Builds • Stubs (6k dojo.js) • Base++ (dojo.js with modules) • Cross-Domain • plugd • Scope Burning
  • 28. scopeMap + kwArgs // Dojo? Moo.load(function(){ place(quot;<p>Hello, Moojo</p>quot;, quot;containerquot;); query(quot;pquot;) .style(quot;fontSizequot;, quot;10pxquot;) .animate({ fontSize:{ end: 42 } }) ; }); http://dante.dojotoolkit.org/static/otherlibs/moojo.html
  • 29. //>>excludeStart(“auto”, kwArgs.autoConflict == “on”) if(dojo.config.conflict){ //>>excludeStop(“auto”) // exportNS is a plugd plugin dojo.exportNS(dojo, dojo.global); //>>excludeStart(“auto”, kwArgs.autoConflict == “on”) } //>>excludeStop(“auto”) http://dante.dojotoolkit.org/static/otherlibs/moojo.html
  • 30.
  • 31. TaskSpeed • Written by Authors • Fair before Right • An interesting start • Charts Available* * http://dante.dojotoolkit.org/taskspeed/report/charts.html
  • 33. Plain JavaScript • JavaScript should have: - dojo.indexOf / forEach / map / filter - hitch / partial (we get bind()!) - declare / delegate / mixin / extend • Design Philosophy - Defense: Namespaces / Globals - Offense: Forward Thinking APIs
  • 34. Forward Thinking // Defer to native trim if available dojo.trim = String.prototype.trim ? function(str){ return str.trim() } : function(str){ /* slightly longer regexp version */ } // Mimic Mozilla Array methods: dojo.forEach = function(array, callback, scope){ ... } dojo.map = function(array, callback, scope){ ... } dojo.filter = function(array, callback, scope){ ... }
  • 35. DojoType (the project) // put Dojo Array methods on all Array’s dojo._clobber(Array.prototype, { forEach: function(callback, scope){ dojo.forEach(this, callback, scope); return this; }, map: function(callback, scope){ return dojo.map(this, callback, scope); } }); // use the new ‘native’ functions: [1,2,3,4,5].map(function(i){ return i % 2 === 0 }) .forEach(function(val){ /* do something */ }); http://code.google.com/p/dojotype
  • 36. Base at a glance cheat sheet available: http://download.dojotoolkit.org/current-stable/cheat.pdf
  • 37. Events, Ajax, FX, DOM • dojo.connect(node, “onclick”, function(){ }); • dojo.connect(obj, “custom”, obj, “sync”); • dojo.xhrPost({ form:”login”, load:function(data){ ... } }); • dojo.xhrGet({ url:”foo.txt”, load:function(data){ ... } }); • dojo.anim(node, { width:200 }); • dojo.fadeIn({ node: node }).play(); • dojo.style(n, “height”, “50px”); • dojo.place(“<p>Hi</p>”, dojo.body());
  • 38. CSS Selectors • dojo.query(“ul > li”).addClass(“listy”); • dojo.query(“a”).onclick(function(){ }); • dojo.query(“tr td + td”).forEach(function(n){ }); • dojo.query(“.someClass”).map(function(n){ .. }); • dojo.NodeList.prototype / dojo.extend
  • 40. Magic Arguments // function signatures with defaults my.func = function(args){ var opts = dojo.mixin({ prop:”foo” }, args || {}); console.log(opts.prop); } my.func(); // “foo” my.func({ prop:”bar” }); // “bar”
  • 41. DOM Arguments var n = document.getElementById(“someId”); n.style.width = “200px”; // pattern: dojo.byId var n = dojo.byId(“someId”) // pick: dojo.style(n, “width”, “200px”); dojo.style(“someId”, “width”, “200px”); dojo.query(“#someId”).style(“width”, “200px”);
  • 42. DOM Arguments // Accept a String ID or DomNode Reference my.func = function(node, args){ node = dojo.byId(node); var opts = dojo.mixin({ prop:”foo” }, args||{}); console.log(opts.prop); } my.func(“someId”); // “foo” my.func(nodeRef, { prop:”bar” }); // “bar”
  • 43. Ambiguous Constructors (poj) some.Thing = function(args, node){ dojo.mixin(this, args); } dojo.extend(some.Thing, { opt:”a-default”, method: function(){ console.log(this.opt); } }); var a = new some.Thing(), b = new some.Thing({ opt:”x” }); a.opt == “a-default” b.opt == “x”
  • 44. Ambiguous Constructors (declare) // allows for simulated inheritance dojo.declare(“some.Thing”, null, { opt:”a-default”, constructor: function(args, node){ dojo.mixin(this, args); } }); var a = new some.Thing(), b = new some.Thing({ opt:”x” }); a.opt == “a-default” b.opt == “x”
  • 45. Ambiguous Constructors // uses the patterns: dojo.require(“dojo.parser”); <!-- in html --> <div id=”baz” dojoType=”some.ClassThing” prop=”value”></div> // or without parsing - “poj” new some.ClassThing({ prop:”value” }, “baz”); // or from no DOM at all new some.ClassThing({}).placeAt(“container”);
  • 46. DRY: Functional JS my.turnIt = function(dir){ // if 1, go next. -1, go left. } var next = dojo.partial(my.turnIt, 1), prev = dojo.partial(my.turnIt, -1); // later dojo.query(“.nextbutton”).onclick(next);
  • 47. Dual Service Functions my.func = function(node, args){ node = dojo.byId(node); // Sting|DomNode /* do something to node */ } dojo.extend(dojo.NodeList, { // now a plugin: func: dojo.NodeList._adaptAsForEach(my.func) }); // run one, run all my.func(“someId”, { opts:true }); dojo.query(“.someNodes”).func({ opts:true })
  • 48. Chaining // NodeList: dojo.query(“.bar”) .addClass(“baz”) .onclick(fn) .place(“#foo”, “before”) .blah().blah().blah().blah(n).blah(); // Elsewhere new dojox.gfx.Shape(surface) .addFill(“#ededed”).setStroke(...).connect(...); // really just “this”
  • 49. $ vs PlugD - Dojo - dojo.query(“.class”) dojo.byId(“id”) - jQuery - $(“.class”) $(“#id”) - Prototype - $$(“.class”) $(“id”) - MooTools - $$(“.class”) $(“id”)
  • 50. $ vs PlugD dojo.conflict(); $(document).ready(function(){ $(“#bar”).onclick(fn); }); // or automatically: var djConfig = { conflict: true }; # automatically via build: ./build.sh autoConflict=on profile=plugd
  • 52. dojo.Deferred • from Twisted/Python • ASYNC Contract • Chained Callbacks • Scope-Aware
  • 53. Indirect Usage // plain xhr dojo.xhrGet({ url:”foo.html“, load: function(data){ /* handle response */ } }); // manipulating scope dojo.xhrGet({ url:”foo.html”, error: dojo.hitch(otherScope, function(e){ this.logError(e); }) });
  • 54. Why embed? // plain xhr dojo.xhrGet({ url:”foo.html“, load: function(data){ /* handle response */ dojo.xhrPost({ form:”bar”, content: data, load:function(){ // then update some ui, add another callback ... // “ugh” } }) } });
  • 55. More ‘Direct’ Usage var d = dojo.xhrGet({ url:”foo.html“ }) .addCallback(function(data){ // can modify data along response chain return data.toLowerCase(); }) .addCallback(andPost) // a function that handles data .addErrback(otherScope, “errHandler”); // elsewhere: d.addCallback(function(data){ /* handle it, return nothing */ });
  • 56. dojo.data • More than just DOM • API at the core - Read, Write, Identity, Notification • Common Functions and Callbacks • Direct communication • RESTful
  • 57. Store Example? // load the store: dojo.require(“dojox.data.GoogleServiceStore”); // make the store: var store = new dojox.data.GoogleSearchStore(...); store.fetch({ // the request: query:{ q:”Dojo” }, // the “wiring” onItem: dojo.hitch(thinger, “addItem”), onComplete: dojo.hitch(thinger, “render”) });
  • 59. dojox.data Stores: • AndOrReadStore • FlickrRestStore / • AppStore FlickrStore • GoogleFeedStore • AtomReadStore • GoogleSearchStore • CouchDBRestStore • HtmlStore • CssRuleStore • jsonPathStore • CsvStore • jsonRestStore • FileStore • OpmlStore
  • 62. SMD dojo.require(“dojox.rpc.Service”); var goog = new dojox.rpc.Service(“google.smd”); goog.websearch({ q:”Dojo” }).addCallback(function(response){ // handle the responses }); goog.booksearch({ q:”Dojo” }).addBoth(function(response){ // Books about Dojo });
  • 63. The Dojo Toolkit • Long standing Development • Large, Active Developer Base • Friendly Professional Community • Liberally Licensed, Clean IP http://dojotoolkit.org http://dojofoundation.org
  • 65. Me, Again. dante@dojotoolkit.org http://twitter.com/phiggins http://higginsforpresident.net/