SlideShare a Scribd company logo
1 of 38
Download to read offline
Modularize JavaScript with RequireJS
Minh Hoang TO
August 8, 2013
Performance Problem
Problem Analysis
JavaScript Code Organizing
RequireJS Library
RequireJS Integration
Agenda
1 Performance Problem
2 Problem Analysis
3 JavaScript Code Organizing
4 RequireJS Library
5 RequireJS Integration
Minh Hoang TO Modularize JavaScript with RequireJS
Performance Problem
Problem Analysis
JavaScript Code Organizing
RequireJS Library
RequireJS Integration
Bad User Experience
Numerical Reports
Slow Login Page
Open login form of Dagens Nyheter (http://dn.se) or browse for the first
time to
https://auth.dn.se/login?appId=dagensnyheter.se
↓
↓
Minh Hoang TO Modularize JavaScript with RequireJS
Performance Problem
Problem Analysis
JavaScript Code Organizing
RequireJS Library
RequireJS Integration
Bad User Experience
Numerical Reports
Low PageSpeed Scores
Figure 1: PageSpeed scores of https://auth.dn.se/login?appId=dagensnyheter.se
Minh Hoang TO Modularize JavaScript with RequireJS
Performance Problem
Problem Analysis
JavaScript Code Organizing
RequireJS Library
RequireJS Integration
Firebug Timeline
Fundamental Causes
Initiative Idea
Firebug Timeline
Figure 2: Loading timeline on all resources
Figure 3: Loading timeline on JavaScript resources
DOMContentLoaded time: 7.6s
Load main.js time: 5s
Minh Hoang TO Modularize JavaScript with RequireJS
Performance Problem
Problem Analysis
JavaScript Code Organizing
RequireJS Library
RequireJS Integration
Firebug Timeline
Fundamental Causes
Initiative Idea
Blocking JavaScript
Browser loads the entire main.js file (314.4KB) before rendering DOM content
Figure 4: Blocking main.js
Minh Hoang TO Modularize JavaScript with RequireJS
Performance Problem
Problem Analysis
JavaScript Code Organizing
RequireJS Library
RequireJS Integration
Firebug Timeline
Fundamental Causes
Initiative Idea
Too Sequential Loading
main.js = jquery + jquery-ui + some jquery plugins + business code of DN
→ Should find one way to load library parts in parallel
Minh Hoang TO Modularize JavaScript with RequireJS
Performance Problem
Problem Analysis
JavaScript Code Organizing
RequireJS Library
RequireJS Integration
Firebug Timeline
Fundamental Causes
Initiative Idea
Initiative Idea
Organize JavaScript code into modules with loose dependencies so that they
are eligible to deferred, lazy and parallel loading
Minh Hoang TO Modularize JavaScript with RequireJS
Performance Problem
Problem Analysis
JavaScript Code Organizing
RequireJS Library
RequireJS Integration
Common JavaScript Style
Innovative JavaScript Style
Math Functions
Minh Hoang TO Modularize JavaScript with RequireJS
Performance Problem
Problem Analysis
JavaScript Code Organizing
RequireJS Library
RequireJS Integration
Common JavaScript Style
Innovative JavaScript Style
Math Functions - Drawbacks
Blocking and sequential load of JavaScript resources:
Browser loads square.js and fourthPower.js too early
Evaluation of fourthPower.js requires function declared in square.js,
sequential load is inevitable
→ See if new JavaScript code styles help?
Minh Hoang TO Modularize JavaScript with RequireJS
Performance Problem
Problem Analysis
JavaScript Code Organizing
RequireJS Library
RequireJS Integration
Common JavaScript Style
Innovative JavaScript Style
Asynchronous Module Definition
Provide resource containing factory method of R, denote this resource as F(R),
instead of providing directly resource R
F(R) holds:
Name of module R
Names of dependency modules of R
Factory method that generates R
Minh Hoang TO Modularize JavaScript with RequireJS
Performance Problem
Problem Analysis
JavaScript Code Organizing
RequireJS Library
RequireJS Integration
Common JavaScript Style
Innovative JavaScript Style
Math Functions - AMD Modules
Figure 5: squareAMD module defined in squareAMD.js
Figure 6: fourthPowerAMD module defined in fourthPowerAMD.js
Minh Hoang TO Modularize JavaScript with RequireJS
Performance Problem
Problem Analysis
JavaScript Code Organizing
RequireJS Library
RequireJS Integration
Common JavaScript Style
Innovative JavaScript Style
AMD - Valuable Features
Browser evaluation of F(R) does not trigger evaluation of R, that
heavy-weight work could be deferred
F(R1), F(R2), . . . , F(Rk ) have no inter-dependencies at evaluation time
even if R1, R2, . . . , Rk do → ideal for parallel loading
Minh Hoang TO Modularize JavaScript with RequireJS
Performance Problem
Problem Analysis
JavaScript Code Organizing
RequireJS Library
RequireJS Integration
Common JavaScript Style
Innovative JavaScript Style
Math Functions - Use of AMD Modules
Figure 7: Use AMD modules in AMD style
Execution of require block triggers:
Resolution1
of squareAMD and fourthPowerAMD modules
Execution of callback method on completing module resolution
squareAMD and fourthPowerAMD are wired to sq and fp, respectively.
1
Full explanation on resolution is given in RequireJS slides
Minh Hoang TO Modularize JavaScript with RequireJS
Performance Problem
Problem Analysis
JavaScript Code Organizing
RequireJS Library
RequireJS Integration
Common JavaScript Style
Innovative JavaScript Style
Inversion of Control
Inversion of Control pattern applied to JavaScript
Use of AMD requires JavaScript loader library2
which:
Manages lazy (on demand) and parallel loading of factory resources
F(R1), F(R2), . . . , F(Rk )
Invoke factory methods with proper execution order
Provides naming service for modules
2
RequireJS is such a library
Minh Hoang TO Modularize JavaScript with RequireJS
Performance Problem
Problem Analysis
JavaScript Code Organizing
RequireJS Library
RequireJS Integration
General Information
How To Use RequireJS
General Information
http://requirejs.org
JavaScript file and module loader library
Supports Asynchronous Module Definition
Minified size: 14.7KB
Minh Hoang TO Modularize JavaScript with RequireJS
Performance Problem
Problem Analysis
JavaScript Code Organizing
RequireJS Library
RequireJS Integration
General Information
How To Use RequireJS
Math Functions
Figure 8: Math Functions example illustrates use of RequireJS
Minh Hoang TO Modularize JavaScript with RequireJS
Performance Problem
Problem Analysis
JavaScript Code Organizing
RequireJS Library
RequireJS Integration
General Information
How To Use RequireJS
Module Resolution
For each module name appears in array parameter, RequireJS looks up
associated module object
FOUND:
Assign module object to corresponding parameter of callback function
NOT FOUND:
Generate script block loading JavaScript file named ${module name}.js
Looks up dependencies of AMD module declared in ${module name}.js and
invoke factory method
Put return object into a map structure with key ${module name}
Assign return object to corresponding parameter of callback function of
require block
Minh Hoang TO Modularize JavaScript with RequireJS
Performance Problem
Problem Analysis
JavaScript Code Organizing
RequireJS Library
RequireJS Integration
General Information
How To Use RequireJS
RequireJS Configuration Variable
Provide flexible mapping between AMD module and URL of JavaScript
resource containing module definition
Figure 9: Configuration variable in case squareAMD and fourthPowerAMD module definitions are
declared in /js/square_amd.js and /js/fourthPower_amd.js
Minh Hoang TO Modularize JavaScript with RequireJS
Performance Problem
Problem Analysis
JavaScript Code Organizing
RequireJS Library
RequireJS Integration
General Information
How To Use RequireJS
Math Functions - Firebug View
Figure 10: Firebug shows that script blocks loading module are added programmatically
Minh Hoang TO Modularize JavaScript with RequireJS
Performance Problem
Problem Analysis
JavaScript Code Organizing
RequireJS Library
RequireJS Integration
Legacy JavaScript
New JavaScript
Achievements
Extensions
Serviceplus - main.js
Content varies with application (DN, DI, Expressen, . . .)
/main.js?appId=name_of_requested_application
Average size: ≥ 300KB
Common structure: jQuery + jQuery Plugins + business code of application
→ Better JavaScript code organization:
Serviceplus provides jQuery, jQuery Plugins as AMD modules
Business code part of main.js is moved into callback function of require
block
Minh Hoang TO Modularize JavaScript with RequireJS
Performance Problem
Problem Analysis
JavaScript Code Organizing
RequireJS Library
RequireJS Integration
Legacy JavaScript
New JavaScript
Achievements
Extensions
Serviceplus - AMD Modules
Serviceplus provides popular JavaScript libraries in form of AMD modules:
jQuery
jQuery UI
Other jQuery Plugins
Minh Hoang TO Modularize JavaScript with RequireJS
Performance Problem
Problem Analysis
JavaScript Code Organizing
RequireJS Library
RequireJS Integration
Legacy JavaScript
New JavaScript
Achievements
Extensions
Serviceplus - jQuery
jQuery module = Minified jQuery wrapped in define block
Figure 11: jQuery AMD module, jQuery.noConflict() is used to avoid conflict with other jQuery
versions
Minh Hoang TO Modularize JavaScript with RequireJS
Performance Problem
Problem Analysis
JavaScript Code Organizing
RequireJS Library
RequireJS Integration
Legacy JavaScript
New JavaScript
Achievements
Extensions
Serviceplus - jQuery UI
jQuery UI module = Minified jQuery UI wrapped in define block
Figure 12: jQuery UI AMD moduleMinh Hoang TO Modularize JavaScript with RequireJS
Performance Problem
Problem Analysis
JavaScript Code Organizing
RequireJS Library
RequireJS Integration
Legacy JavaScript
New JavaScript
Achievements
Extensions
Serviceplus - RequireJS Configuration Variable
Declares mapping between Serviceplus AMD modules and URLs of
JavaScript resources
Merged to RequireJS library to save one HTTP request
Minh Hoang TO Modularize JavaScript with RequireJS
Performance Problem
Problem Analysis
JavaScript Code Organizing
RequireJS Library
RequireJS Integration
Legacy JavaScript
New JavaScript
Achievements
Extensions
Serviceplus - New main.js Structure
New main.js = Business code part of main.js wrapped in require block
Figure 13: main.js of an application using jQuery and jQuery UI
Minh Hoang TO Modularize JavaScript with RequireJS
Performance Problem
Problem Analysis
JavaScript Code Organizing
RequireJS Library
RequireJS Integration
Legacy JavaScript
New JavaScript
Achievements
Extensions
Faster Login Page
http://account.qa.newsplus.se/login?appId=dagensnyheter.se
↓
↓
Minh Hoang TO Modularize JavaScript with RequireJS
Performance Problem
Problem Analysis
JavaScript Code Organizing
RequireJS Library
RequireJS Integration
Legacy JavaScript
New JavaScript
Achievements
Extensions
PageSpeed Scores
Figure 14: PageSpeed scores of http://account.qa.newsplus.se/?appId=dagensnyheter.se
Minh Hoang TO Modularize JavaScript with RequireJS
Performance Problem
Problem Analysis
JavaScript Code Organizing
RequireJS Library
RequireJS Integration
Legacy JavaScript
New JavaScript
Achievements
Extensions
PageSpeed Suggestion
Figure 15: No significant issue on JavaScript resource from PageSpeed suggestions
Minh Hoang TO Modularize JavaScript with RequireJS
Performance Problem
Problem Analysis
JavaScript Code Organizing
RequireJS Library
RequireJS Integration
Legacy JavaScript
New JavaScript
Achievements
Extensions
Firebug Timeline
Figure 16: Firebug report on JavaScript resource loading
DOMContentLoaded time: 1.88s
Big JavaScript resources jquery, jquery-ui and jquery-custom are loaded in
parallel
Minh Hoang TO Modularize JavaScript with RequireJS
Performance Problem
Problem Analysis
JavaScript Code Organizing
RequireJS Library
RequireJS Integration
Legacy JavaScript
New JavaScript
Achievements
Extensions
WebPageTest Result
Figure 17: WebPageTest result shows parallel load of large JavaScript resources and sharp reduction
on DOMContentLoaded time
Minh Hoang TO Modularize JavaScript with RequireJS
Performance Problem
Problem Analysis
JavaScript Code Organizing
RequireJS Library
RequireJS Integration
Legacy JavaScript
New JavaScript
Achievements
Extensions
Extensions
Refine Serviceplus AMD modules
Extend relevant server-side functionalities
Minh Hoang TO Modularize JavaScript with RequireJS
Modularize JavaScript with RequireJS

More Related Content

What's hot

Frontend Application Architecture, Patterns, and Workflows
Frontend Application Architecture, Patterns, and WorkflowsFrontend Application Architecture, Patterns, and Workflows
Frontend Application Architecture, Patterns, and Workflows
Treasure Data, Inc.
 
RESTful OSGi Web Applications Tutorial - Khawaja S Shams & Jeff Norris
RESTful OSGi Web Applications Tutorial - Khawaja S Shams & Jeff NorrisRESTful OSGi Web Applications Tutorial - Khawaja S Shams & Jeff Norris
RESTful OSGi Web Applications Tutorial - Khawaja S Shams & Jeff Norris
mfrancis
 

What's hot (20)

Requirejs
RequirejsRequirejs
Requirejs
 
Requirejs
RequirejsRequirejs
Requirejs
 
Using RequireJS for Modular JavaScript Code
Using RequireJS for Modular JavaScript CodeUsing RequireJS for Modular JavaScript Code
Using RequireJS for Modular JavaScript Code
 
Design & Development of Web Applications using SpringMVC
Design & Development of Web Applications using SpringMVC Design & Development of Web Applications using SpringMVC
Design & Development of Web Applications using SpringMVC
 
Frontend Application Architecture, Patterns, and Workflows
Frontend Application Architecture, Patterns, and WorkflowsFrontend Application Architecture, Patterns, and Workflows
Frontend Application Architecture, Patterns, and Workflows
 
Step by Step - AngularJS
Step by Step - AngularJSStep by Step - AngularJS
Step by Step - AngularJS
 
AngularJS with RequireJS
AngularJS with RequireJSAngularJS with RequireJS
AngularJS with RequireJS
 
Getting started with angular js
Getting started with angular jsGetting started with angular js
Getting started with angular js
 
[Srijan Wednesday Webinars] Developing Large Scale Applications in AngularJS
[Srijan Wednesday Webinars] Developing Large Scale Applications in AngularJS[Srijan Wednesday Webinars] Developing Large Scale Applications in AngularJS
[Srijan Wednesday Webinars] Developing Large Scale Applications in AngularJS
 
OSGi and Spring Data for simple (Web) Application Development
OSGi and Spring Data  for simple (Web) Application DevelopmentOSGi and Spring Data  for simple (Web) Application Development
OSGi and Spring Data for simple (Web) Application Development
 
Jsp (java server page)
Jsp (java server page)Jsp (java server page)
Jsp (java server page)
 
Workshop Intro: FrontEnd General Overview
Workshop Intro: FrontEnd General OverviewWorkshop Intro: FrontEnd General Overview
Workshop Intro: FrontEnd General Overview
 
AngularJS Introduction
AngularJS IntroductionAngularJS Introduction
AngularJS Introduction
 
Play with Angular JS
Play with Angular JSPlay with Angular JS
Play with Angular JS
 
JavaScript Dependencies, Modules & Browserify
JavaScript Dependencies, Modules & BrowserifyJavaScript Dependencies, Modules & Browserify
JavaScript Dependencies, Modules & Browserify
 
RESTful OSGi Web Applications Tutorial - Khawaja S Shams & Jeff Norris
RESTful OSGi Web Applications Tutorial - Khawaja S Shams & Jeff NorrisRESTful OSGi Web Applications Tutorial - Khawaja S Shams & Jeff Norris
RESTful OSGi Web Applications Tutorial - Khawaja S Shams & Jeff Norris
 
Angularjs architecture
Angularjs architectureAngularjs architecture
Angularjs architecture
 
MVC Demystified: Essence of Ruby on Rails
MVC Demystified: Essence of Ruby on RailsMVC Demystified: Essence of Ruby on Rails
MVC Demystified: Essence of Ruby on Rails
 
Workshop 9: BackboneJS y patrones MVC
Workshop 9: BackboneJS y patrones MVCWorkshop 9: BackboneJS y patrones MVC
Workshop 9: BackboneJS y patrones MVC
 
MVC Frameworks for building PHP Web Applications
MVC Frameworks for building PHP Web ApplicationsMVC Frameworks for building PHP Web Applications
MVC Frameworks for building PHP Web Applications
 

Similar to Modularize JavaScript with RequireJS

Isomorphic JavaScript: #DevBeat Master Class
Isomorphic JavaScript: #DevBeat Master ClassIsomorphic JavaScript: #DevBeat Master Class
Isomorphic JavaScript: #DevBeat Master Class
Spike Brehm
 

Similar to Modularize JavaScript with RequireJS (20)

From Backbone to Ember and Back(bone) Again
From Backbone to Ember and Back(bone) AgainFrom Backbone to Ember and Back(bone) Again
From Backbone to Ember and Back(bone) Again
 
Planbox Backbone MVC
Planbox Backbone MVCPlanbox Backbone MVC
Planbox Backbone MVC
 
WordPress: React Way
WordPress: React WayWordPress: React Way
WordPress: React Way
 
Create an application with ember
Create an application with ember Create an application with ember
Create an application with ember
 
Integrating React.js Into a PHP Application: Dutch PHP 2019
Integrating React.js Into a PHP Application: Dutch PHP 2019Integrating React.js Into a PHP Application: Dutch PHP 2019
Integrating React.js Into a PHP Application: Dutch PHP 2019
 
Developing Java Web Applications
Developing Java Web ApplicationsDeveloping Java Web Applications
Developing Java Web Applications
 
FrontEnd-Roadmap.pdf
FrontEnd-Roadmap.pdfFrontEnd-Roadmap.pdf
FrontEnd-Roadmap.pdf
 
Introduction To CodeIgniter
Introduction To CodeIgniterIntroduction To CodeIgniter
Introduction To CodeIgniter
 
Spring tutorials
Spring tutorialsSpring tutorials
Spring tutorials
 
React JS - Introduction
React JS - IntroductionReact JS - Introduction
React JS - Introduction
 
React Js vs Node Js_ Which Framework to Choose for Your Next Web Application
React Js vs Node Js_ Which Framework to Choose for Your Next Web ApplicationReact Js vs Node Js_ Which Framework to Choose for Your Next Web Application
React Js vs Node Js_ Which Framework to Choose for Your Next Web Application
 
Isomorphic JavaScript: #DevBeat Master Class
Isomorphic JavaScript: #DevBeat Master ClassIsomorphic JavaScript: #DevBeat Master Class
Isomorphic JavaScript: #DevBeat Master Class
 
Modular Web Applications With Netzke
Modular Web Applications With NetzkeModular Web Applications With Netzke
Modular Web Applications With Netzke
 
Reactjs Basics
Reactjs BasicsReactjs Basics
Reactjs Basics
 
Javascript Frameworks for Well Architected, Immersive Web Apps
Javascript Frameworks for Well Architected, Immersive Web AppsJavascript Frameworks for Well Architected, Immersive Web Apps
Javascript Frameworks for Well Architected, Immersive Web Apps
 
BackEnd-Roadmap.pdf
BackEnd-Roadmap.pdfBackEnd-Roadmap.pdf
BackEnd-Roadmap.pdf
 
React.js alternatives modern web frameworks and lightweight java script libr...
React.js alternatives  modern web frameworks and lightweight java script libr...React.js alternatives  modern web frameworks and lightweight java script libr...
React.js alternatives modern web frameworks and lightweight java script libr...
 
Seven Versions of One Web Application
Seven Versions of One Web ApplicationSeven Versions of One Web Application
Seven Versions of One Web Application
 
React JS .NET
React JS .NETReact JS .NET
React JS .NET
 
Creating MVC Application with backbone js
Creating MVC Application with backbone jsCreating MVC Application with backbone js
Creating MVC Application with backbone js
 

More from Minh Hoang (7)

Yolo Family TechTalk
Yolo Family TechTalkYolo Family TechTalk
Yolo Family TechTalk
 
ElasticSearch Introduction
ElasticSearch IntroductionElasticSearch Introduction
ElasticSearch Introduction
 
Zero redeployment with JRebel
Zero redeployment with JRebelZero redeployment with JRebel
Zero redeployment with JRebel
 
Servlet 3.0
Servlet 3.0Servlet 3.0
Servlet 3.0
 
Regular Expression
Regular ExpressionRegular Expression
Regular Expression
 
Java Performance Tuning
Java Performance TuningJava Performance Tuning
Java Performance Tuning
 
Gatein Presentation
Gatein PresentationGatein Presentation
Gatein Presentation
 

Recently uploaded

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
giselly40
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 
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
Enterprise Knowledge
 

Recently uploaded (20)

Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
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
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
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
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
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 Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
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
 
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...
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 

Modularize JavaScript with RequireJS

  • 1. Modularize JavaScript with RequireJS Minh Hoang TO August 8, 2013
  • 2. Performance Problem Problem Analysis JavaScript Code Organizing RequireJS Library RequireJS Integration Agenda 1 Performance Problem 2 Problem Analysis 3 JavaScript Code Organizing 4 RequireJS Library 5 RequireJS Integration Minh Hoang TO Modularize JavaScript with RequireJS
  • 3.
  • 4. Performance Problem Problem Analysis JavaScript Code Organizing RequireJS Library RequireJS Integration Bad User Experience Numerical Reports Slow Login Page Open login form of Dagens Nyheter (http://dn.se) or browse for the first time to https://auth.dn.se/login?appId=dagensnyheter.se ↓ ↓ Minh Hoang TO Modularize JavaScript with RequireJS
  • 5. Performance Problem Problem Analysis JavaScript Code Organizing RequireJS Library RequireJS Integration Bad User Experience Numerical Reports Low PageSpeed Scores Figure 1: PageSpeed scores of https://auth.dn.se/login?appId=dagensnyheter.se Minh Hoang TO Modularize JavaScript with RequireJS
  • 6.
  • 7. Performance Problem Problem Analysis JavaScript Code Organizing RequireJS Library RequireJS Integration Firebug Timeline Fundamental Causes Initiative Idea Firebug Timeline Figure 2: Loading timeline on all resources Figure 3: Loading timeline on JavaScript resources DOMContentLoaded time: 7.6s Load main.js time: 5s Minh Hoang TO Modularize JavaScript with RequireJS
  • 8. Performance Problem Problem Analysis JavaScript Code Organizing RequireJS Library RequireJS Integration Firebug Timeline Fundamental Causes Initiative Idea Blocking JavaScript Browser loads the entire main.js file (314.4KB) before rendering DOM content Figure 4: Blocking main.js Minh Hoang TO Modularize JavaScript with RequireJS
  • 9. Performance Problem Problem Analysis JavaScript Code Organizing RequireJS Library RequireJS Integration Firebug Timeline Fundamental Causes Initiative Idea Too Sequential Loading main.js = jquery + jquery-ui + some jquery plugins + business code of DN → Should find one way to load library parts in parallel Minh Hoang TO Modularize JavaScript with RequireJS
  • 10. Performance Problem Problem Analysis JavaScript Code Organizing RequireJS Library RequireJS Integration Firebug Timeline Fundamental Causes Initiative Idea Initiative Idea Organize JavaScript code into modules with loose dependencies so that they are eligible to deferred, lazy and parallel loading Minh Hoang TO Modularize JavaScript with RequireJS
  • 11.
  • 12. Performance Problem Problem Analysis JavaScript Code Organizing RequireJS Library RequireJS Integration Common JavaScript Style Innovative JavaScript Style Math Functions Minh Hoang TO Modularize JavaScript with RequireJS
  • 13. Performance Problem Problem Analysis JavaScript Code Organizing RequireJS Library RequireJS Integration Common JavaScript Style Innovative JavaScript Style Math Functions - Drawbacks Blocking and sequential load of JavaScript resources: Browser loads square.js and fourthPower.js too early Evaluation of fourthPower.js requires function declared in square.js, sequential load is inevitable → See if new JavaScript code styles help? Minh Hoang TO Modularize JavaScript with RequireJS
  • 14. Performance Problem Problem Analysis JavaScript Code Organizing RequireJS Library RequireJS Integration Common JavaScript Style Innovative JavaScript Style Asynchronous Module Definition Provide resource containing factory method of R, denote this resource as F(R), instead of providing directly resource R F(R) holds: Name of module R Names of dependency modules of R Factory method that generates R Minh Hoang TO Modularize JavaScript with RequireJS
  • 15. Performance Problem Problem Analysis JavaScript Code Organizing RequireJS Library RequireJS Integration Common JavaScript Style Innovative JavaScript Style Math Functions - AMD Modules Figure 5: squareAMD module defined in squareAMD.js Figure 6: fourthPowerAMD module defined in fourthPowerAMD.js Minh Hoang TO Modularize JavaScript with RequireJS
  • 16. Performance Problem Problem Analysis JavaScript Code Organizing RequireJS Library RequireJS Integration Common JavaScript Style Innovative JavaScript Style AMD - Valuable Features Browser evaluation of F(R) does not trigger evaluation of R, that heavy-weight work could be deferred F(R1), F(R2), . . . , F(Rk ) have no inter-dependencies at evaluation time even if R1, R2, . . . , Rk do → ideal for parallel loading Minh Hoang TO Modularize JavaScript with RequireJS
  • 17. Performance Problem Problem Analysis JavaScript Code Organizing RequireJS Library RequireJS Integration Common JavaScript Style Innovative JavaScript Style Math Functions - Use of AMD Modules Figure 7: Use AMD modules in AMD style Execution of require block triggers: Resolution1 of squareAMD and fourthPowerAMD modules Execution of callback method on completing module resolution squareAMD and fourthPowerAMD are wired to sq and fp, respectively. 1 Full explanation on resolution is given in RequireJS slides Minh Hoang TO Modularize JavaScript with RequireJS
  • 18. Performance Problem Problem Analysis JavaScript Code Organizing RequireJS Library RequireJS Integration Common JavaScript Style Innovative JavaScript Style Inversion of Control Inversion of Control pattern applied to JavaScript Use of AMD requires JavaScript loader library2 which: Manages lazy (on demand) and parallel loading of factory resources F(R1), F(R2), . . . , F(Rk ) Invoke factory methods with proper execution order Provides naming service for modules 2 RequireJS is such a library Minh Hoang TO Modularize JavaScript with RequireJS
  • 19.
  • 20. Performance Problem Problem Analysis JavaScript Code Organizing RequireJS Library RequireJS Integration General Information How To Use RequireJS General Information http://requirejs.org JavaScript file and module loader library Supports Asynchronous Module Definition Minified size: 14.7KB Minh Hoang TO Modularize JavaScript with RequireJS
  • 21. Performance Problem Problem Analysis JavaScript Code Organizing RequireJS Library RequireJS Integration General Information How To Use RequireJS Math Functions Figure 8: Math Functions example illustrates use of RequireJS Minh Hoang TO Modularize JavaScript with RequireJS
  • 22. Performance Problem Problem Analysis JavaScript Code Organizing RequireJS Library RequireJS Integration General Information How To Use RequireJS Module Resolution For each module name appears in array parameter, RequireJS looks up associated module object FOUND: Assign module object to corresponding parameter of callback function NOT FOUND: Generate script block loading JavaScript file named ${module name}.js Looks up dependencies of AMD module declared in ${module name}.js and invoke factory method Put return object into a map structure with key ${module name} Assign return object to corresponding parameter of callback function of require block Minh Hoang TO Modularize JavaScript with RequireJS
  • 23. Performance Problem Problem Analysis JavaScript Code Organizing RequireJS Library RequireJS Integration General Information How To Use RequireJS RequireJS Configuration Variable Provide flexible mapping between AMD module and URL of JavaScript resource containing module definition Figure 9: Configuration variable in case squareAMD and fourthPowerAMD module definitions are declared in /js/square_amd.js and /js/fourthPower_amd.js Minh Hoang TO Modularize JavaScript with RequireJS
  • 24. Performance Problem Problem Analysis JavaScript Code Organizing RequireJS Library RequireJS Integration General Information How To Use RequireJS Math Functions - Firebug View Figure 10: Firebug shows that script blocks loading module are added programmatically Minh Hoang TO Modularize JavaScript with RequireJS
  • 25.
  • 26. Performance Problem Problem Analysis JavaScript Code Organizing RequireJS Library RequireJS Integration Legacy JavaScript New JavaScript Achievements Extensions Serviceplus - main.js Content varies with application (DN, DI, Expressen, . . .) /main.js?appId=name_of_requested_application Average size: ≥ 300KB Common structure: jQuery + jQuery Plugins + business code of application → Better JavaScript code organization: Serviceplus provides jQuery, jQuery Plugins as AMD modules Business code part of main.js is moved into callback function of require block Minh Hoang TO Modularize JavaScript with RequireJS
  • 27. Performance Problem Problem Analysis JavaScript Code Organizing RequireJS Library RequireJS Integration Legacy JavaScript New JavaScript Achievements Extensions Serviceplus - AMD Modules Serviceplus provides popular JavaScript libraries in form of AMD modules: jQuery jQuery UI Other jQuery Plugins Minh Hoang TO Modularize JavaScript with RequireJS
  • 28. Performance Problem Problem Analysis JavaScript Code Organizing RequireJS Library RequireJS Integration Legacy JavaScript New JavaScript Achievements Extensions Serviceplus - jQuery jQuery module = Minified jQuery wrapped in define block Figure 11: jQuery AMD module, jQuery.noConflict() is used to avoid conflict with other jQuery versions Minh Hoang TO Modularize JavaScript with RequireJS
  • 29. Performance Problem Problem Analysis JavaScript Code Organizing RequireJS Library RequireJS Integration Legacy JavaScript New JavaScript Achievements Extensions Serviceplus - jQuery UI jQuery UI module = Minified jQuery UI wrapped in define block Figure 12: jQuery UI AMD moduleMinh Hoang TO Modularize JavaScript with RequireJS
  • 30. Performance Problem Problem Analysis JavaScript Code Organizing RequireJS Library RequireJS Integration Legacy JavaScript New JavaScript Achievements Extensions Serviceplus - RequireJS Configuration Variable Declares mapping between Serviceplus AMD modules and URLs of JavaScript resources Merged to RequireJS library to save one HTTP request Minh Hoang TO Modularize JavaScript with RequireJS
  • 31. Performance Problem Problem Analysis JavaScript Code Organizing RequireJS Library RequireJS Integration Legacy JavaScript New JavaScript Achievements Extensions Serviceplus - New main.js Structure New main.js = Business code part of main.js wrapped in require block Figure 13: main.js of an application using jQuery and jQuery UI Minh Hoang TO Modularize JavaScript with RequireJS
  • 32. Performance Problem Problem Analysis JavaScript Code Organizing RequireJS Library RequireJS Integration Legacy JavaScript New JavaScript Achievements Extensions Faster Login Page http://account.qa.newsplus.se/login?appId=dagensnyheter.se ↓ ↓ Minh Hoang TO Modularize JavaScript with RequireJS
  • 33. Performance Problem Problem Analysis JavaScript Code Organizing RequireJS Library RequireJS Integration Legacy JavaScript New JavaScript Achievements Extensions PageSpeed Scores Figure 14: PageSpeed scores of http://account.qa.newsplus.se/?appId=dagensnyheter.se Minh Hoang TO Modularize JavaScript with RequireJS
  • 34. Performance Problem Problem Analysis JavaScript Code Organizing RequireJS Library RequireJS Integration Legacy JavaScript New JavaScript Achievements Extensions PageSpeed Suggestion Figure 15: No significant issue on JavaScript resource from PageSpeed suggestions Minh Hoang TO Modularize JavaScript with RequireJS
  • 35. Performance Problem Problem Analysis JavaScript Code Organizing RequireJS Library RequireJS Integration Legacy JavaScript New JavaScript Achievements Extensions Firebug Timeline Figure 16: Firebug report on JavaScript resource loading DOMContentLoaded time: 1.88s Big JavaScript resources jquery, jquery-ui and jquery-custom are loaded in parallel Minh Hoang TO Modularize JavaScript with RequireJS
  • 36. Performance Problem Problem Analysis JavaScript Code Organizing RequireJS Library RequireJS Integration Legacy JavaScript New JavaScript Achievements Extensions WebPageTest Result Figure 17: WebPageTest result shows parallel load of large JavaScript resources and sharp reduction on DOMContentLoaded time Minh Hoang TO Modularize JavaScript with RequireJS
  • 37. Performance Problem Problem Analysis JavaScript Code Organizing RequireJS Library RequireJS Integration Legacy JavaScript New JavaScript Achievements Extensions Extensions Refine Serviceplus AMD modules Extend relevant server-side functionalities Minh Hoang TO Modularize JavaScript with RequireJS