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

Requirejs
RequirejsRequirejs
Requirejssioked
 
Using RequireJS for Modular JavaScript Code
Using RequireJS for Modular JavaScript CodeUsing RequireJS for Modular JavaScript Code
Using RequireJS for Modular JavaScript CodeThomas Lundström
 
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 Naresh Chintalcheru
 
Frontend Application Architecture, Patterns, and Workflows
Frontend Application Architecture, Patterns, and WorkflowsFrontend Application Architecture, Patterns, and Workflows
Frontend Application Architecture, Patterns, and WorkflowsTreasure Data, Inc.
 
Step by Step - AngularJS
Step by Step - AngularJSStep by Step - AngularJS
Step by Step - AngularJSInfragistics
 
AngularJS with RequireJS
AngularJS with RequireJSAngularJS with RequireJS
AngularJS with RequireJSJohannes Weber
 
[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 AngularJSSrijan Technologies
 
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 DevelopmentChristian Baranowski
 
Jsp (java server page)
Jsp (java server page)Jsp (java server page)
Jsp (java server page)Chitrank Dixit
 
Workshop Intro: FrontEnd General Overview
Workshop Intro: FrontEnd General OverviewWorkshop Intro: FrontEnd General Overview
Workshop Intro: FrontEnd General OverviewVisual Engineering
 
AngularJS Introduction
AngularJS IntroductionAngularJS Introduction
AngularJS IntroductionCarlos Morales
 
Play with Angular JS
Play with Angular JSPlay with Angular JS
Play with Angular JSKnoldus Inc.
 
JavaScript Dependencies, Modules & Browserify
JavaScript Dependencies, Modules & BrowserifyJavaScript Dependencies, Modules & Browserify
JavaScript Dependencies, Modules & BrowserifyJohan Nilsson
 
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 Norrismfrancis
 
Angularjs architecture
Angularjs architectureAngularjs architecture
Angularjs architectureMichael He
 
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 Railscodeinmotion
 
Workshop 9: BackboneJS y patrones MVC
Workshop 9: BackboneJS y patrones MVCWorkshop 9: BackboneJS y patrones MVC
Workshop 9: BackboneJS y patrones MVCVisual Engineering
 
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 ApplicationsVforce Infotech
 

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

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) Againjonknapp
 
Planbox Backbone MVC
Planbox Backbone MVCPlanbox Backbone MVC
Planbox Backbone MVCAcquisio
 
Create an application with ember
Create an application with ember Create an application with ember
Create an application with ember Chandra Sekar
 
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 2019Andrew Rota
 
Developing Java Web Applications
Developing Java Web ApplicationsDeveloping Java Web Applications
Developing Java Web Applicationshchen1
 
Spring tutorials
Spring tutorialsSpring tutorials
Spring tutorialsTIB Academy
 
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 Applicationadityakumar2080
 
Isomorphic JavaScript: #DevBeat Master Class
Isomorphic JavaScript: #DevBeat Master ClassIsomorphic JavaScript: #DevBeat Master Class
Isomorphic JavaScript: #DevBeat Master ClassSpike Brehm
 
Modular Web Applications With Netzke
Modular Web Applications With NetzkeModular Web Applications With Netzke
Modular Web Applications With Netzkenetzke
 
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 Appsdnelson-cs
 
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...Katy Slemon
 
Seven Versions of One Web Application
Seven Versions of One Web ApplicationSeven Versions of One Web Application
Seven Versions of One Web ApplicationYakov Fain
 
Creating MVC Application with backbone js
Creating MVC Application with backbone jsCreating MVC Application with backbone js
Creating MVC Application with backbone jsMindfire Solutions
 

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

Yolo Family TechTalk
Yolo Family TechTalkYolo Family TechTalk
Yolo Family TechTalkMinh Hoang
 
ElasticSearch Introduction
ElasticSearch IntroductionElasticSearch Introduction
ElasticSearch IntroductionMinh Hoang
 
Zero redeployment with JRebel
Zero redeployment with JRebelZero redeployment with JRebel
Zero redeployment with JRebelMinh Hoang
 
Regular Expression
Regular ExpressionRegular Expression
Regular ExpressionMinh Hoang
 
Java Performance Tuning
Java Performance TuningJava Performance Tuning
Java Performance TuningMinh Hoang
 
Gatein Presentation
Gatein PresentationGatein Presentation
Gatein PresentationMinh Hoang
 

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

Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfLoriGlavin3
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxLoriGlavin3
 
Assure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyesAssure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyesThousandEyes
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentEmixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentPim van der Noll
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfIngrid Airi González
 
Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rick Flair
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 
Scale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterScale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterMydbops
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxLoriGlavin3
 
2024 April Patch Tuesday
2024 April Patch Tuesday2024 April Patch Tuesday
2024 April Patch TuesdayIvanti
 
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...panagenda
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxLoriGlavin3
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsNathaniel Shimoni
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationKnoldus Inc.
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxLoriGlavin3
 

Recently uploaded (20)

Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdf
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
 
Assure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyesAssure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyes
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentEmixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdf
 
Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 
Scale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterScale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL Router
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
 
2024 April Patch Tuesday
2024 April Patch Tuesday2024 April Patch Tuesday
2024 April Patch Tuesday
 
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directions
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog Presentation
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
 

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