SlideShare a Scribd company logo
Managing JavaScript
Dependencies with RequireJS


         Den Odell
Libraries
         jQuery, Modernizr, ...

             Frameworks
         Backbone, Ember, ...

   Reusable Plugin and Utility Scripts
jQuery plugins, TypeKit, Underscore, ...

        Custom Application Code
<script src="/assets/js/lib/jquery-1.7.1.min.js"></script>
<script src="/assets/js/lib/jquery-ui-1.8.17.custom.min.js"></script>
<script src="/assets/js/global.js"></script>
<script src="/assets/js/breaking-news.js"></script>
<script src="/assets/js/lib/jquery.colorbox.js"></script>
<script src="/assets/js/modal.js"></script>
<script src="http://use.typekit.com/did3rrm.js"></script>
<!--[if lt IE 9]>
    <script src="/assets/js/lib/cssSandpaper/EventHelpers.js"></script>
    <script src="/assets/js/lib/cssSandpaper/cssQuery-p.js"></script>
    <script src="/assets/js/lib/cssSandpaper/jcoglan.com/sylvester.js"></script>
    <script src="/assets/js/lib/cssSandpaper/cssSandpaper.js"></script>
    <script src="/assets/js/lib/jquery-extended-selectors.js"></script>
    <script src="/assets/js/lib/selectivizr-min.js"></script>
<![endif]-->
<script src="/assets/js/lib/bgpos.js"></script>
<script src="http://w.sharethis.com/button/buttons.js"></script>
<script src="/assets/js/lib/yepnope.css-prefix.js"></script>
<script src="/assets/js/feature-carousel.js"></script>
<script src="/assets/js/dropdown.js"></script>
<script src="/assets/js/lib/jquery.ui.selectmenu.js"></script>
<script src="/assets/js/lib/jquery.selectmenu.js"></script>
<script src="/assets/js/lib/swfobject.js"></script>
<script src="/assets/js/flashembed.js"></script>
<script src="/assets/js/lib/jquery.jqplugin.1.0.2.min.js"></script>
<script src="/assets/js/audioplayer.js"></script>
<script src="/assets/js/game-tray.js"></script>
<script src="/assets/js/tracking.js"></script>
<script src="/assets/js/lib/time-tracker.js"></script>
More JavaScript typically means more complexity
RequireJS Modules & Dependencies
Managing JavaScript Dependencies With RequireJS
Let’s build a signup form!
Managing JavaScript Dependencies With RequireJS
<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>Mailing list</title>
    <link rel="stylesheet" href="styles/main.css">
</head>
<body>
    <form action="thank-you.html" id="form" method="post">
          <h1>Join our mailing list</h1>
          <label for="email">Enter your email address</label>
          <input type="text" name="email" id="email" placeholder="e.g. me@mysite.com">
          <input type="submit" value="Sign up">
    </form>
</body>
</html>
http://requirejs.org

                  Current version: 2.1.4
Support: IE6+, FF2+, Safari 3.2+, Chrome 3+, Opera 10+
                  Size: 5.5KB min+gzip
1. Listen for ‘submit’ event on the form
2. Validate the format of the email address provided
3. If the format is valid, allow the form to submit to the server
4. If the format is not valid, highlight the error and prevent the form submitting
jQuery

                                                             Validation plugin for jQuery
1. Listen for ‘submit’ event on the form
2. Validate the format of the email address provided
3. If the format is valid, allow the form to submit to the server
4. If the format is not valid, highlight the error and prevent the form submitting
       Main application script
jQuery
Validation plugin for jQuery
  Main application script
Dependencies




           jQuery
Validation plugin for jQuery
  Main application script
Managing JavaScript Dependencies With RequireJS
Adding RequireJS to HTML



<script src="scripts/require.js" data-main="scripts/main"></script>
Defining a code module in RequireJS

define(
     moduleName,    // optional, defaults to name of file
     dependencies, // optional array listing dependencies
     function(params) {
          // Function to execute once dependencies have been loaded
          // params contains return values from the dependencies
     }
);
Example of a code module in RequireJS




define(["lib/jquery-1.9.0"], function($) {
      // Do something with jQuery as $
});
Creating a module mapping for jQuery in main.js


       requirejs.config({
             paths: {
                 "jquery": "lib/jquery-1.9.0”
             }
       });
Managing JavaScript Dependencies With RequireJS
Extending the module mapping for jQuery in main.js


requirejs.config({
      paths: {
          "jquery": [
                 "https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min",
                 // If the CDN fails, load from this local module instead
                 "lib/jquery-1.9.0"
          ]
      }
});
jQuery Validation Plug-in Module
   scripts/lib/validation-plugin.js
scripts/lib/validation-plugin.js
define(["jquery"], function($) {
      $.fn.isValidEmail = function() {
           var isValid = true,
                 regEx = /S+@S+.S+/;


           this.each(function() {
                 if (!regEx.test(this.value)) {
                     isValid = false;
                 }
           });
           return isValid;
      };
});
Main application script
  scripts/lib/main.js
scripts/lib/main.js
require(["jquery", "lib/validation-plugin"], function($) {
      var $form = $("#form”),
            $email = $("#email");


      $form.on("submit", function(e) {
            e.preventDefault();
            if ($email.isValidEmail()) {
                $form.get(0).submit();
            } else {
                $email.addClass("error").focus();
            }
      });
            $email.on("keyup", function() {
            $email.removeClass("error");
      });
});
Improving page load performance...
scripts/lib/main.js
require(["jquery"], function($) {
      var $form = $("#form"),
            $email = $("#email");


      $form.on("submit", function(e) {
            e.preventDefault();
            require(["lib/validation-plugin"], function() {
                  if ($email.isValidEmail()) {
                      $form.get(0).submit();
                  } else {
                      $email.addClass("error").focus();
                  }
            });
      });


      $email.on("keyup", function() {
            $email.removeClass("error");
      });
});
Managing JavaScript Dependencies With RequireJS
What else can RequireJS do?
Some Useful Plug-ins

       i18n
        text
    handlebars
       font
      cache
Thank You
Ad

Recommended

RequireJS
RequireJS
Tim Doherty
 
Requirejs
Requirejs
sioked
 
Requirejs
Requirejs
Jason Lotito
 
Modularize JavaScript with RequireJS
Modularize JavaScript with RequireJS
Minh Hoang
 
Require js
Require js
Nirbhay Kundan
 
Asynchronous Module Definition (AMD) used for Dependency Injection (DI) and MVVM
Asynchronous Module Definition (AMD) used for Dependency Injection (DI) and MVVM
Hugh Anderson
 
AngularJS 101 - Everything you need to know to get started
AngularJS 101 - Everything you need to know to get started
Stéphane Bégaudeau
 
Javascript ui for rest services
Javascript ui for rest services
Ioan Eugen Stan
 
JavaScript Dependencies, Modules & Browserify
JavaScript Dependencies, Modules & Browserify
Johan Nilsson
 
Require.JS
Require.JS
Ivano Malavolta
 
Workshop 16: EmberJS Parte I
Workshop 16: EmberJS Parte I
Visual Engineering
 
Modern Web Application Development Workflow - EclipseCon Europe 2014
Modern Web Application Development Workflow - EclipseCon Europe 2014
Stéphane Bégaudeau
 
Vuex
Vuex
Asaquzzaman Mishu
 
AngularJS Deep Dives (NYC GDG Apr 2013)
AngularJS Deep Dives (NYC GDG Apr 2013)
Nitya Narasimhan
 
An Introduction To Testing In AngularJS Applications
An Introduction To Testing In AngularJS Applications
Rohan Chandane
 
Angularjs architecture
Angularjs architecture
Michael He
 
Javascript first-class citizenery
Javascript first-class citizenery
toddbr
 
Advanced Tips & Tricks for using Angular JS
Advanced Tips & Tricks for using Angular JS
Simon Guest
 
Introducing Rendr: Run your Backbone.js apps on the client and server
Introducing Rendr: Run your Backbone.js apps on the client and server
Spike Brehm
 
Workshop 2: JavaScript Design Patterns
Workshop 2: JavaScript Design Patterns
Visual Engineering
 
Packing it all: JavaScript module bundling from 2000 to now
Packing it all: JavaScript module bundling from 2000 to now
Derek Willian Stavis
 
Step by Step - AngularJS
Step by Step - AngularJS
Infragistics
 
Backbone js
Backbone js
Rohan Chandane
 
Backbone.js
Backbone.js
VO Tho
 
Introduction to Angularjs
Introduction to Angularjs
Manish Shekhawat
 
Vue, vue router, vuex
Vue, vue router, vuex
Samundra khatri
 
Design & Development of Web Applications using SpringMVC
Design & Development of Web Applications using SpringMVC
Naresh Chintalcheru
 
Expressjs
Expressjs
Yauheni Nikanovich
 
AMD & Require.js
AMD & Require.js
Eyal Vardi
 
A1 Connections Mashups
A1 Connections Mashups
Andreas Schulte
 

More Related Content

What's hot (20)

JavaScript Dependencies, Modules & Browserify
JavaScript Dependencies, Modules & Browserify
Johan Nilsson
 
Require.JS
Require.JS
Ivano Malavolta
 
Workshop 16: EmberJS Parte I
Workshop 16: EmberJS Parte I
Visual Engineering
 
Modern Web Application Development Workflow - EclipseCon Europe 2014
Modern Web Application Development Workflow - EclipseCon Europe 2014
Stéphane Bégaudeau
 
Vuex
Vuex
Asaquzzaman Mishu
 
AngularJS Deep Dives (NYC GDG Apr 2013)
AngularJS Deep Dives (NYC GDG Apr 2013)
Nitya Narasimhan
 
An Introduction To Testing In AngularJS Applications
An Introduction To Testing In AngularJS Applications
Rohan Chandane
 
Angularjs architecture
Angularjs architecture
Michael He
 
Javascript first-class citizenery
Javascript first-class citizenery
toddbr
 
Advanced Tips & Tricks for using Angular JS
Advanced Tips & Tricks for using Angular JS
Simon Guest
 
Introducing Rendr: Run your Backbone.js apps on the client and server
Introducing Rendr: Run your Backbone.js apps on the client and server
Spike Brehm
 
Workshop 2: JavaScript Design Patterns
Workshop 2: JavaScript Design Patterns
Visual Engineering
 
Packing it all: JavaScript module bundling from 2000 to now
Packing it all: JavaScript module bundling from 2000 to now
Derek Willian Stavis
 
Step by Step - AngularJS
Step by Step - AngularJS
Infragistics
 
Backbone js
Backbone js
Rohan Chandane
 
Backbone.js
Backbone.js
VO Tho
 
Introduction to Angularjs
Introduction to Angularjs
Manish Shekhawat
 
Vue, vue router, vuex
Vue, vue router, vuex
Samundra khatri
 
Design & Development of Web Applications using SpringMVC
Design & Development of Web Applications using SpringMVC
Naresh Chintalcheru
 
Expressjs
Expressjs
Yauheni Nikanovich
 
JavaScript Dependencies, Modules & Browserify
JavaScript Dependencies, Modules & Browserify
Johan Nilsson
 
Modern Web Application Development Workflow - EclipseCon Europe 2014
Modern Web Application Development Workflow - EclipseCon Europe 2014
Stéphane Bégaudeau
 
AngularJS Deep Dives (NYC GDG Apr 2013)
AngularJS Deep Dives (NYC GDG Apr 2013)
Nitya Narasimhan
 
An Introduction To Testing In AngularJS Applications
An Introduction To Testing In AngularJS Applications
Rohan Chandane
 
Angularjs architecture
Angularjs architecture
Michael He
 
Javascript first-class citizenery
Javascript first-class citizenery
toddbr
 
Advanced Tips & Tricks for using Angular JS
Advanced Tips & Tricks for using Angular JS
Simon Guest
 
Introducing Rendr: Run your Backbone.js apps on the client and server
Introducing Rendr: Run your Backbone.js apps on the client and server
Spike Brehm
 
Workshop 2: JavaScript Design Patterns
Workshop 2: JavaScript Design Patterns
Visual Engineering
 
Packing it all: JavaScript module bundling from 2000 to now
Packing it all: JavaScript module bundling from 2000 to now
Derek Willian Stavis
 
Step by Step - AngularJS
Step by Step - AngularJS
Infragistics
 
Backbone.js
Backbone.js
VO Tho
 
Design & Development of Web Applications using SpringMVC
Design & Development of Web Applications using SpringMVC
Naresh Chintalcheru
 

Viewers also liked (12)

AMD & Require.js
AMD & Require.js
Eyal Vardi
 
A1 Connections Mashups
A1 Connections Mashups
Andreas Schulte
 
ID304 - Lotus® Connections 3.0 TDI, SSO, and User Life Cycle Management: What...
ID304 - Lotus® Connections 3.0 TDI, SSO, and User Life Cycle Management: What...
Luis Benitez
 
Lotus Connections 3.0: a Technical View on What's New
Lotus Connections 3.0: a Technical View on What's New
Stuart McIntyre
 
Java8 Neue Sprachfeatures - Lambda/Streams/default Methods/FunctionalInterfaces
Java8 Neue Sprachfeatures - Lambda/Streams/default Methods/FunctionalInterfaces
Dirk Detering
 
Category Theory for Mortal Programmers
Category Theory for Mortal Programmers
Stephan February
 
Beyond the Basics: An Overview of User LifeCycle and Managing Users with TDI
Beyond the Basics: An Overview of User LifeCycle and Managing Users with TDI
Stuart McIntyre
 
Mikkel Heisterberg - An introduction to developing for the Activity Stream
Mikkel Heisterberg - An introduction to developing for the Activity Stream
LetsConnect
 
Modular Development with RequireJS
Modular Development with RequireJS
Vernon Kesner
 
Dependency Management with RequireJS
Dependency Management with RequireJS
Aaronius
 
RequireJS
RequireJS
Sebastiano Armeli
 
Open social gadgets in ibm connections
Open social gadgets in ibm connections
Vincent Burckhardt
 
AMD & Require.js
AMD & Require.js
Eyal Vardi
 
ID304 - Lotus® Connections 3.0 TDI, SSO, and User Life Cycle Management: What...
ID304 - Lotus® Connections 3.0 TDI, SSO, and User Life Cycle Management: What...
Luis Benitez
 
Lotus Connections 3.0: a Technical View on What's New
Lotus Connections 3.0: a Technical View on What's New
Stuart McIntyre
 
Java8 Neue Sprachfeatures - Lambda/Streams/default Methods/FunctionalInterfaces
Java8 Neue Sprachfeatures - Lambda/Streams/default Methods/FunctionalInterfaces
Dirk Detering
 
Category Theory for Mortal Programmers
Category Theory for Mortal Programmers
Stephan February
 
Beyond the Basics: An Overview of User LifeCycle and Managing Users with TDI
Beyond the Basics: An Overview of User LifeCycle and Managing Users with TDI
Stuart McIntyre
 
Mikkel Heisterberg - An introduction to developing for the Activity Stream
Mikkel Heisterberg - An introduction to developing for the Activity Stream
LetsConnect
 
Modular Development with RequireJS
Modular Development with RequireJS
Vernon Kesner
 
Dependency Management with RequireJS
Dependency Management with RequireJS
Aaronius
 
Open social gadgets in ibm connections
Open social gadgets in ibm connections
Vincent Burckhardt
 
Ad

Similar to Managing JavaScript Dependencies With RequireJS (20)

jQuery and Rails: Best Friends Forever
jQuery and Rails: Best Friends Forever
stephskardal
 
Unit testing after Zend Framework 1.8
Unit testing after Zend Framework 1.8
Michelangelo van Dam
 
Rails is not just Ruby
Rails is not just Ruby
Marco Otte-Witte
 
Beyond DOMReady: Ultra High-Performance Javascript
Beyond DOMReady: Ultra High-Performance Javascript
aglemann
 
Building Large jQuery Applications
Building Large jQuery Applications
Rebecca Murphey
 
Asynchronous Interfaces
Asynchronous Interfaces
maccman
 
SproutCore and the Future of Web Apps
SproutCore and the Future of Web Apps
Mike Subelsky
 
Understanding backbonejs
Understanding backbonejs
Nick Lee
 
SPTechCon Boston 2015 - Whither SPServices?
SPTechCon Boston 2015 - Whither SPServices?
Marc D Anderson
 
Javascript MVC & Backbone Tips & Tricks
Javascript MVC & Backbone Tips & Tricks
Hjörtur Hilmarsson
 
WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...
Fabio Franzini
 
Virtual Madness @ Etsy
Virtual Madness @ Etsy
Nishan Subedi
 
Avinash Kundaliya: Javascript and WordPress
Avinash Kundaliya: Javascript and WordPress
wpnepal
 
The Magic Revealed: Four Real-World Examples of Using the Client Object Model...
The Magic Revealed: Four Real-World Examples of Using the Client Object Model...
SPTechCon
 
jQuery secrets
jQuery secrets
Bastian Feder
 
Bootstrat REST APIs with Laravel 5
Bootstrat REST APIs with Laravel 5
Elena Kolevska
 
international PHP2011_Bastian Feder_jQuery's Secrets
international PHP2011_Bastian Feder_jQuery's Secrets
smueller_sandsmedia
 
JQuery In Drupal
JQuery In Drupal
katbailey
 
JavaServer Faces 2.0 - JavaOne India 2011
JavaServer Faces 2.0 - JavaOne India 2011
Arun Gupta
 
Ajax on drupal the right way - DrupalCamp Campinas, São Paulo, Brazil 2016
Ajax on drupal the right way - DrupalCamp Campinas, São Paulo, Brazil 2016
Nicolás Bouhid
 
jQuery and Rails: Best Friends Forever
jQuery and Rails: Best Friends Forever
stephskardal
 
Unit testing after Zend Framework 1.8
Unit testing after Zend Framework 1.8
Michelangelo van Dam
 
Beyond DOMReady: Ultra High-Performance Javascript
Beyond DOMReady: Ultra High-Performance Javascript
aglemann
 
Building Large jQuery Applications
Building Large jQuery Applications
Rebecca Murphey
 
Asynchronous Interfaces
Asynchronous Interfaces
maccman
 
SproutCore and the Future of Web Apps
SproutCore and the Future of Web Apps
Mike Subelsky
 
Understanding backbonejs
Understanding backbonejs
Nick Lee
 
SPTechCon Boston 2015 - Whither SPServices?
SPTechCon Boston 2015 - Whither SPServices?
Marc D Anderson
 
Javascript MVC & Backbone Tips & Tricks
Javascript MVC & Backbone Tips & Tricks
Hjörtur Hilmarsson
 
WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...
Fabio Franzini
 
Virtual Madness @ Etsy
Virtual Madness @ Etsy
Nishan Subedi
 
Avinash Kundaliya: Javascript and WordPress
Avinash Kundaliya: Javascript and WordPress
wpnepal
 
The Magic Revealed: Four Real-World Examples of Using the Client Object Model...
The Magic Revealed: Four Real-World Examples of Using the Client Object Model...
SPTechCon
 
Bootstrat REST APIs with Laravel 5
Bootstrat REST APIs with Laravel 5
Elena Kolevska
 
international PHP2011_Bastian Feder_jQuery's Secrets
international PHP2011_Bastian Feder_jQuery's Secrets
smueller_sandsmedia
 
JQuery In Drupal
JQuery In Drupal
katbailey
 
JavaServer Faces 2.0 - JavaOne India 2011
JavaServer Faces 2.0 - JavaOne India 2011
Arun Gupta
 
Ajax on drupal the right way - DrupalCamp Campinas, São Paulo, Brazil 2016
Ajax on drupal the right way - DrupalCamp Campinas, São Paulo, Brazil 2016
Nicolás Bouhid
 
Ad

Recently uploaded (20)

cnc-processing-centers-centateq-p-110-en.pdf
cnc-processing-centers-centateq-p-110-en.pdf
AmirStern2
 
Cyber Defense Matrix Workshop - RSA Conference
Cyber Defense Matrix Workshop - RSA Conference
Priyanka Aash
 
You are not excused! How to avoid security blind spots on the way to production
You are not excused! How to avoid security blind spots on the way to production
Michele Leroux Bustamante
 
Smarter Aviation Data Management: Lessons from Swedavia Airports and Sweco
Smarter Aviation Data Management: Lessons from Swedavia Airports and Sweco
Safe Software
 
UserCon Belgium: Honey, VMware increased my bill
UserCon Belgium: Honey, VMware increased my bill
stijn40
 
GenAI Opportunities and Challenges - Where 370 Enterprises Are Focusing Now.pdf
GenAI Opportunities and Challenges - Where 370 Enterprises Are Focusing Now.pdf
Priyanka Aash
 
Lessons Learned from Developing Secure AI Workflows.pdf
Lessons Learned from Developing Secure AI Workflows.pdf
Priyanka Aash
 
CapCut Pro Crack For PC Latest Version {Fully Unlocked} 2025
CapCut Pro Crack For PC Latest Version {Fully Unlocked} 2025
pcprocore
 
Python Conference Singapore - 19 Jun 2025
Python Conference Singapore - 19 Jun 2025
ninefyi
 
Mastering AI Workflows with FME by Mark Döring
Mastering AI Workflows with FME by Mark Döring
Safe Software
 
Securing AI - There Is No Try, Only Do!.pdf
Securing AI - There Is No Try, Only Do!.pdf
Priyanka Aash
 
Using the SQLExecutor for Data Quality Management: aka One man's love for the...
Using the SQLExecutor for Data Quality Management: aka One man's love for the...
Safe Software
 
"Scaling in space and time with Temporal", Andriy Lupa.pdf
"Scaling in space and time with Temporal", Andriy Lupa.pdf
Fwdays
 
Curietech AI in action - Accelerate MuleSoft development
Curietech AI in action - Accelerate MuleSoft development
shyamraj55
 
Raman Bhaumik - Passionate Tech Enthusiast
Raman Bhaumik - Passionate Tech Enthusiast
Raman Bhaumik
 
A Constitutional Quagmire - Ethical Minefields of AI, Cyber, and Privacy.pdf
A Constitutional Quagmire - Ethical Minefields of AI, Cyber, and Privacy.pdf
Priyanka Aash
 
AI VIDEO MAGAZINE - June 2025 - r/aivideo
AI VIDEO MAGAZINE - June 2025 - r/aivideo
1pcity Studios, Inc
 
ReSTIR [DI]: Spatiotemporal reservoir resampling for real-time ray tracing ...
ReSTIR [DI]: Spatiotemporal reservoir resampling for real-time ray tracing ...
revolcs10
 
Securing Account Lifecycles in the Age of Deepfakes.pptx
Securing Account Lifecycles in the Age of Deepfakes.pptx
FIDO Alliance
 
EIS-Webinar-Engineering-Retail-Infrastructure-06-16-2025.pdf
EIS-Webinar-Engineering-Retail-Infrastructure-06-16-2025.pdf
Earley Information Science
 
cnc-processing-centers-centateq-p-110-en.pdf
cnc-processing-centers-centateq-p-110-en.pdf
AmirStern2
 
Cyber Defense Matrix Workshop - RSA Conference
Cyber Defense Matrix Workshop - RSA Conference
Priyanka Aash
 
You are not excused! How to avoid security blind spots on the way to production
You are not excused! How to avoid security blind spots on the way to production
Michele Leroux Bustamante
 
Smarter Aviation Data Management: Lessons from Swedavia Airports and Sweco
Smarter Aviation Data Management: Lessons from Swedavia Airports and Sweco
Safe Software
 
UserCon Belgium: Honey, VMware increased my bill
UserCon Belgium: Honey, VMware increased my bill
stijn40
 
GenAI Opportunities and Challenges - Where 370 Enterprises Are Focusing Now.pdf
GenAI Opportunities and Challenges - Where 370 Enterprises Are Focusing Now.pdf
Priyanka Aash
 
Lessons Learned from Developing Secure AI Workflows.pdf
Lessons Learned from Developing Secure AI Workflows.pdf
Priyanka Aash
 
CapCut Pro Crack For PC Latest Version {Fully Unlocked} 2025
CapCut Pro Crack For PC Latest Version {Fully Unlocked} 2025
pcprocore
 
Python Conference Singapore - 19 Jun 2025
Python Conference Singapore - 19 Jun 2025
ninefyi
 
Mastering AI Workflows with FME by Mark Döring
Mastering AI Workflows with FME by Mark Döring
Safe Software
 
Securing AI - There Is No Try, Only Do!.pdf
Securing AI - There Is No Try, Only Do!.pdf
Priyanka Aash
 
Using the SQLExecutor for Data Quality Management: aka One man's love for the...
Using the SQLExecutor for Data Quality Management: aka One man's love for the...
Safe Software
 
"Scaling in space and time with Temporal", Andriy Lupa.pdf
"Scaling in space and time with Temporal", Andriy Lupa.pdf
Fwdays
 
Curietech AI in action - Accelerate MuleSoft development
Curietech AI in action - Accelerate MuleSoft development
shyamraj55
 
Raman Bhaumik - Passionate Tech Enthusiast
Raman Bhaumik - Passionate Tech Enthusiast
Raman Bhaumik
 
A Constitutional Quagmire - Ethical Minefields of AI, Cyber, and Privacy.pdf
A Constitutional Quagmire - Ethical Minefields of AI, Cyber, and Privacy.pdf
Priyanka Aash
 
AI VIDEO MAGAZINE - June 2025 - r/aivideo
AI VIDEO MAGAZINE - June 2025 - r/aivideo
1pcity Studios, Inc
 
ReSTIR [DI]: Spatiotemporal reservoir resampling for real-time ray tracing ...
ReSTIR [DI]: Spatiotemporal reservoir resampling for real-time ray tracing ...
revolcs10
 
Securing Account Lifecycles in the Age of Deepfakes.pptx
Securing Account Lifecycles in the Age of Deepfakes.pptx
FIDO Alliance
 
EIS-Webinar-Engineering-Retail-Infrastructure-06-16-2025.pdf
EIS-Webinar-Engineering-Retail-Infrastructure-06-16-2025.pdf
Earley Information Science
 

Managing JavaScript Dependencies With RequireJS

  • 2. Libraries jQuery, Modernizr, ... Frameworks Backbone, Ember, ... Reusable Plugin and Utility Scripts jQuery plugins, TypeKit, Underscore, ... Custom Application Code
  • 3. <script src="/assets/js/lib/jquery-1.7.1.min.js"></script> <script src="/assets/js/lib/jquery-ui-1.8.17.custom.min.js"></script> <script src="/assets/js/global.js"></script> <script src="/assets/js/breaking-news.js"></script> <script src="/assets/js/lib/jquery.colorbox.js"></script> <script src="/assets/js/modal.js"></script> <script src="http://use.typekit.com/did3rrm.js"></script> <!--[if lt IE 9]> <script src="/assets/js/lib/cssSandpaper/EventHelpers.js"></script> <script src="/assets/js/lib/cssSandpaper/cssQuery-p.js"></script> <script src="/assets/js/lib/cssSandpaper/jcoglan.com/sylvester.js"></script> <script src="/assets/js/lib/cssSandpaper/cssSandpaper.js"></script> <script src="/assets/js/lib/jquery-extended-selectors.js"></script> <script src="/assets/js/lib/selectivizr-min.js"></script> <![endif]--> <script src="/assets/js/lib/bgpos.js"></script> <script src="http://w.sharethis.com/button/buttons.js"></script> <script src="/assets/js/lib/yepnope.css-prefix.js"></script> <script src="/assets/js/feature-carousel.js"></script> <script src="/assets/js/dropdown.js"></script> <script src="/assets/js/lib/jquery.ui.selectmenu.js"></script> <script src="/assets/js/lib/jquery.selectmenu.js"></script> <script src="/assets/js/lib/swfobject.js"></script> <script src="/assets/js/flashembed.js"></script> <script src="/assets/js/lib/jquery.jqplugin.1.0.2.min.js"></script> <script src="/assets/js/audioplayer.js"></script> <script src="/assets/js/game-tray.js"></script> <script src="/assets/js/tracking.js"></script> <script src="/assets/js/lib/time-tracker.js"></script>
  • 4. More JavaScript typically means more complexity
  • 5. RequireJS Modules & Dependencies
  • 7. Let’s build a signup form!
  • 9. <!doctype html> <html> <head> <meta charset="utf-8"> <title>Mailing list</title> <link rel="stylesheet" href="styles/main.css"> </head> <body> <form action="thank-you.html" id="form" method="post"> <h1>Join our mailing list</h1> <label for="email">Enter your email address</label> <input type="text" name="email" id="email" placeholder="e.g. [email protected]"> <input type="submit" value="Sign up"> </form> </body> </html>
  • 10. http://requirejs.org Current version: 2.1.4 Support: IE6+, FF2+, Safari 3.2+, Chrome 3+, Opera 10+ Size: 5.5KB min+gzip
  • 11. 1. Listen for ‘submit’ event on the form 2. Validate the format of the email address provided 3. If the format is valid, allow the form to submit to the server 4. If the format is not valid, highlight the error and prevent the form submitting
  • 12. jQuery Validation plugin for jQuery 1. Listen for ‘submit’ event on the form 2. Validate the format of the email address provided 3. If the format is valid, allow the form to submit to the server 4. If the format is not valid, highlight the error and prevent the form submitting Main application script
  • 13. jQuery Validation plugin for jQuery Main application script
  • 14. Dependencies jQuery Validation plugin for jQuery Main application script
  • 16. Adding RequireJS to HTML <script src="scripts/require.js" data-main="scripts/main"></script>
  • 17. Defining a code module in RequireJS define( moduleName, // optional, defaults to name of file dependencies, // optional array listing dependencies function(params) { // Function to execute once dependencies have been loaded // params contains return values from the dependencies } );
  • 18. Example of a code module in RequireJS define(["lib/jquery-1.9.0"], function($) { // Do something with jQuery as $ });
  • 19. Creating a module mapping for jQuery in main.js requirejs.config({ paths: { "jquery": "lib/jquery-1.9.0” } });
  • 21. Extending the module mapping for jQuery in main.js requirejs.config({ paths: { "jquery": [ "https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min", // If the CDN fails, load from this local module instead "lib/jquery-1.9.0" ] } });
  • 22. jQuery Validation Plug-in Module scripts/lib/validation-plugin.js
  • 23. scripts/lib/validation-plugin.js define(["jquery"], function($) { $.fn.isValidEmail = function() { var isValid = true, regEx = /S+@S+.S+/; this.each(function() { if (!regEx.test(this.value)) { isValid = false; } }); return isValid; }; });
  • 24. Main application script scripts/lib/main.js
  • 25. scripts/lib/main.js require(["jquery", "lib/validation-plugin"], function($) { var $form = $("#form”), $email = $("#email"); $form.on("submit", function(e) { e.preventDefault(); if ($email.isValidEmail()) { $form.get(0).submit(); } else { $email.addClass("error").focus(); } }); $email.on("keyup", function() { $email.removeClass("error"); }); });
  • 26. Improving page load performance...
  • 27. scripts/lib/main.js require(["jquery"], function($) { var $form = $("#form"), $email = $("#email"); $form.on("submit", function(e) { e.preventDefault(); require(["lib/validation-plugin"], function() { if ($email.isValidEmail()) { $form.get(0).submit(); } else { $email.addClass("error").focus(); } }); }); $email.on("keyup", function() { $email.removeClass("error"); }); });
  • 29. What else can RequireJS do?
  • 30. Some Useful Plug-ins i18n text handlebars font cache

Editor's Notes

  • #2: Learn how to manage and dynamically load JavaScript code files and their dependencies in a robust, scalable way within your large web sites and applications using the RequireJS library.
  • #3: JavaScript code is usually divided into layers, each building upon the last becoming more application-specific as it goes along.
  • #4: Example of script tags used in a real site. Order is important such that plugins are loaded after libraries, etc. and variables are present and loaded before they ’ re used.
  • #5: If I wanted to know which of those files are safe to remove without affecting other files, how could I know? Where would I add in a new file - at the bottom?
  • #6: RequireJS is a JavaScript implementation of the AMD API (Asynchronous Module Definition), a language-agnostic unified way of associating a block of code ( “ module ” ) with the code it relies upon ( “ dependencies ” ). Gaining a lot of traction in the industry. Used on sites for the BBC, Hallmark, Etsy, and Instagram.
  • #7: BBC use it across their sites - here ’ s their documentation site for their developers.
  • #8: I ’ m going to talk you through building this simple newsletter signup form, managing the JavaScript code with RequireJS.
  • #9: Here ’ s how it ’ s going to look - if you use my CSS :)
  • #10: Here ’ s the base HTML code for this page. There ’ s a form that submits to a thank-you.html page, which we ’ re assuming will save the given email address into a database somewhere.
  • #11: Download RequireJS from the site. Good browser support Small footprint.
  • #12: Define what our page will do so we can plan the JavaScript code we ’ ll need.
  • #13: Which files will we need?
  • #14: 3 files required. A library, a plugin, and our main application script.
  • #15: Dependencies are marked with arrows. Plugin only dependent on jQuery. Main application script dependent on plugin and jQuery.
  • #16: Let ’ s organise this into a file structure. RequireJS goes in the root of the ‘ scripts ’ folder. Let ’ s create our 3 JavaScript files and place them into this folder. I place the main application script at the same level as RequireJS and any 3rd party or reusable scripts (here, jQuery and the plugin script) I ’ m placing together into a ‘ lib ’ folder.
  • #17: We can go back to our HTML page and add in a &lt;script&gt; reference to RequireJS. When it initialises, RequireJS looks for a data-main attribute on its &lt;script&gt; tag. If it finds it, it will asynchronously load in the file referenced within it. RequireJS assumes a .js file extension by default, so we can safely leave this out.
  • #18: Reusable blocks of code or “ modules ” are defined with RequireJS using its ‘ define ’ method, which follows this pattern. All you NEED is the code block wrapped in a function. You SHOULD pass an array of dependency script modules that this code needs to function correctly. You MAY give an optional name, though the default name is taken from the location and name of the file. This codifies the relationship between a code block and its dependencies, and RequireJS contains code to ensure no code block gets executed before its listed dependencies are loaded first.
  • #19: Example of a code module that has a dependency on jQuery. We reference the dependency based on its location relative to the RequireJS script itself. We don ’ t need the .js file extension. Any values returned by dependencies are provided as input parameters to the code block function, in order. This ensures encapsulation of code and dependency. jQuery contains code to register itself as a RequireJS module, so we don ’ t need to do anything special with jQuery in order for this to work.
  • #20: We don ’ t always want to have to write our dependencies on jQuery to include the specific version number within it, but jQuery file naming convention has this version number in its name. We can add a configuration object to setup RequireJS at the top of our main application script (main.js) to create a module name-value mapping so we can refer to just ‘ jquery ’ in our dependency arrays and it will be mapped to the specific version of jQuery we specify. We only need update our reference to the jQuery file in one place should we wish to upgrade it to a version of jQuery with a different file name.
  • #21: Many devs want to use jQuery from a CDN. RequireJS supports this as dependencies can be accessed directly from external locations just by using the URL.
  • #22: Simpler to add this into a module name/value mapping so as not to duplicate the URL across your code base. Using an ARRAY means that we can provide a list of backup files in case the external URL fails to load.
  • #23: Let ’ s write our jQuery validation plug-in module, using RequireJS to codify our dependencies.
  • #24: The module name is taken from the file name and its position relative to the RequireJS script. This module will be named lib/validation-plugin.js
  • #25: We ’ ve already written the configuration at the top of our main application script file to setup a module name/value mapping for jQuery. Now let ’ s extend our main application script, using RequireJS to codify our dependencies.
  • #26: So far we ’ ve been using the ‘ define ’ method of RequireJS to configure modules for later use. Here we ’ re going to use the ‘ require ’ method instead. It has the same function pattern as ‘ define ’ , the only difference is in the meaning behind its use. ‘ require ’ should only be used where you want to immediately execute some code, based on dependencies, and which should not be stored in a module for reuse later. It ’ s this reusability that ’ s the difference between whether you use ‘ define ’ or ‘ require ’ . The validator plugin extends jQuery directly so is not provided as an input parameter to the code block function.
  • #27: We ’ re loading in jQuery and the plugin on page load right now. RequireJS loads in main.js which immediately loads in the two dependencies. In actual fact, we don ’ t need that plugin until the user attempts to submit the form. We can take advantage of RequireJS ’ asynchronous file loading capability by rewriting our code.
  • #28: Now I only load jQuery at the start to configure my form submit handler. I wait until that handler is called, then I call ‘ require ’ to load in the validation plugin on-demand in order to validate the form. If this plugin were large, there might be a delay loading the file before validating the form which isn ’ t a good user experience. Consider adjusting the code to load in the plugin when the user focuses into the input box instead to improve reaction time when the user submits the form. If the user never submits the form, the code is never downloaded.
  • #29: Waterfall for script loading in our updated code. Notice how the plugin loads much later, when the user actually submits the form.
  • #30: Load plain JavaScript objects data as modules for use throughout your page. Load that data from URLs using JSON-P (callback function should be specified as = define) Numerous configuration options including options for configuring how to pull in external scripts (like Backbone) that don ’ t support RequireJS by default, allowing them to be used. Optimisation as part of a build process - scans files and groups together dependencies used together to minimise HTTP requests, and minifies files for deployment
  • #31: i18n - allows you to configure ‘ locale ’ parameter and loads in files dynamically based on that text - allows text files to be loaded in - useful for blocks of HTML or plain text to be used as a string handlebars - allows handlebars templates to be used as dependencies in modules. Passed through as function to which you pass your data and it renders a string you can place on your page using innerHTML font - uses Google WebFonts loader API to specify font files as dependencies in your code cache - stores downloaded modules in localStorage so they don ’ t need to be redownloaded on page refreshes