SlideShare a Scribd company logo
Single Page Applications (SPA)
Jeremy Likness
Principal Architect
@JeremyLikness
Our Mission, Vision, and Values
Our Solutions
INDUSTRIES WE WORK WITH
OUR AWARDS
TODAY’S AGENDA
1. Why? Drivers behind adoption of SPA applications
2. What? Features that Make up a Single Page App
3. How? Frameworks make building apps easier
4. Q&A You have questions, we have answers
WHY?
Why? A Brief History (Pt. 1)
1995
• Complete pages are loaded from the server
• Pages disappear, then reappear
1996
• Internet Explorer introduces the IFRAME
• Dozens of websites adopt this ugly hack
1998
• Microsoft Outlook Web App introduces the XMLHTTP component
1999
• XMLHTTP elevated to ActiveX status
• Mozilla, Safari, Operate implement XMLHttpRequest
2004
• Another web-based email app, GMail, pushes the envelope
• The Ajax standard is born. Work on HTML5 begins (yeah, really!)
2006
• W3C standardizes XMLHttpRequest
Why? (A Brief History Pt. 2)
2006
• jQuery normalizes the DOM
• Developers suddenly have a lot more free time
2007
• Silverlight released
• Microsoft successfully distracts developers away from building SPA apps
2009
• First version of AngularJS is released
2010
• Silverlight 5 is released. It is almost immediately killed
• KnockoutJS is released. BackboneJS is released a few months later
2011
• Last call for HTML5 specification
• EmberJS is released
2015
• It’s simple. “We want to access any app, from anywhere, on any device.”
And you’re responsible to make it happen!
DEMO: Before SPA
Disadvantages
UX Reload Real-time
Server
Load
Network
Load
Mobile
The Experience
UX
• Lacks responsiveness (click and wait)
• Page abandonment
• Amazon: 100ms slower = 1% lost revenue
• Google: 500ms slower = 20% decreased traffic
• Lots of manual effort, limited “one-click” experience
• Real-time notifications and updates are difficult
Reloading and Round-Trips
Reload
• Server logic is often convoluted when trying to pull data from
various areas to aggregate in order to render
• Must remember state and re-render state each time (as
opposed to state being preserved in the client)
• Flicker/page freeze is disruptive
Support for Real-time
Real-time
• Only practical method without SPA is to POST on a timer
• Notifications require rebuilding the entire page
Server and Scalability
Server
Load
• Server must aggregate data from multiple places
• Server now has to process everything again or resort to exotic
cache methods to avoid re-processing on refresh
• Server is responsible for the logic of taking data and
transforming it into presentation, so 1000 clients = 1000x CPU-
bound logic on the server
Chattiness on the Network
Network
Load
Vs.
Mobile-Friendliness
Mobile
• Requires lighter payloads
• Needs simplified model
• Less processing (but less rendering is needed)
• Less data when going over metered networks
Challenges
DOM
Standards
Routing Security
Modularity Testing Development
WHAT?
What? Typical SPA Features
Data Binding
Views /
Components
Routing
Dependency
Injection
Data
Services
Testing
Data-Binding Support
Data-
Binding
• Separate presentation logic from actual presentation
• For example: “button click” vs. “my action” that can then be
bound to a button, hyperlink, or other action
• Validation
• Data transformation
• Leads to testability and scale
• “Designer/developer workflow”
Don’t Repeat Yourself!
Views /
Components
• Support for rendering to a part of the page
• Reusable data transformations (i.e. filters, value converters)
• Reusable components (i.e. grids, type-ahead, dialog boxes, etc.)
• HTML5 standards (Web Components)
• Responsive
• Master/detail side-by-side on desktop
• Master/detail separate pages on mobile
It’s Still the Browser!
Routing
• Navigation: I can browse to an area of the application
• Bookmarks: I can save the hyperlink to a useful piece of
information or workflow that I am a part of
• State: I can persist my state between areas of the application
• Journal: I can use the back and forward buttons on my browser
the way I’m used to
Managing Large Code Bases
Dependency
Injection
• Loosely couple JavaScript objects
• Separation of concerns enables parallel development
• Inversion of control enables testability and promotes reusability
• Service location makes it easier to develop components with
dependencies
Would You Rather This …
Data
Services
… Or This?
Data
Services
Given SPA When Test Then OK!
Testing
• Many frameworks come with their own test suites
• Some have specific support for testing and mocking interfaces
• All should expose a straightforward means to test
• Best frameworks don’t require a dependency on a visible
browser
HOW?
http://jquery.com/
• “Normalize the DOM”
• Most popular JavaScript library in use
• One of the longest maintained frameworks
• Many SPA frameworks can layer on top of this
• DEMO: http://todomvc.com/examples/jquery/#/all
• Source: https://github.com/tastejs/todomvc/blob/gh-
pages/examples/jquery/js/app.js
http://www.typescriptlang.org/
• Fooled you, this isn’t a SPA framework
• Works well with many existing SPA frameworks
• Helps “tame” JavaScript
• Very useful for projects with scale (lots of code and/or many developers)
• Page: https://github.com/tastejs/todomvc/blob/gh-
pages/examples/typescript-angular/index.html
• Source: https://github.com/tastejs/todomvc/tree/gh-
pages/examples/typescript-angular/js
http://knockoutjs.com/
• Introduced in early MVC templates by Microsoft
• Declarative bindings
• Automatic refresh of UI
• Relationships and computed models
• Templates
• Page: https://github.com/tastejs/todomvc/blob/gh-
pages/examples/knockoutjs/index.html
• Source: https://github.com/tastejs/todomvc/blob/gh-
pages/examples/knockoutjs/js/app.js
http://backbonejs.org/
• Model-driven
• Idea of “entities” and “collections”
• Views
• Convention-based REST interface
• Page: https://github.com/tastejs/todomvc/blob/gh-
pages/examples/backbone/index.html
• Source: https://github.com/tastejs/todomvc/tree/gh-
pages/examples/backbone/js
http://emberjs.com/
• Focused on productivity
• Handlebar templates
• Common idioms / convention based
• Page: https://github.com/tastejs/todomvc/blob/gh-
pages/examples/emberjs/index.html
• Source: https://github.com/tastejs/todomvc/tree/gh-
pages/examples/emberjs/js
https://angularjs.org/
• Teach HTML New Tricks
• Extensible
• Dependency injection out of the box
• My favorite framework to use, especially on large projects
• Page: https://github.com/tastejs/todomvc/blob/gh-
pages/examples/angularjs/index.html
• Source: https://github.com/tastejs/todomvc/tree/gh-
pages/examples/angularjs/js
http://www.telerik.com/kendo-ui
• Web and Mobile
• HTML5 and JavaScript focused
• Layered on top of jQuery
• Adapters for AngularJS and BackboneJS “out of the box”
• Page: http://kendotodo.apphb.com/Home/Batch
Angular 2.0
• Embraces ECMAScript 6
• Built on TypeScript
• Example: https://github.com/Microsoft/ngconf2015demo
• Page:
https://github.com/Microsoft/ngconf2015demo/blob/master/todo.html
• Source:
https://github.com/Microsoft/ngconf2015demo/blob/master/todo.ts
http://aurelia.io/
• Convention-based
• Built for ECMAScript 6 from the ground up
• Former member of AngularJS 2.0 team
• Examples: http://aurelia.io/get-started.html
DEMO: Todo SPA
Questions?
• Demo Code: https://github.com/JeremyLikness/SPAAppsExplained
• A Different Angle: What is AngularJS?
http://csharperimage.jeremylikness.com/2014/10/a-different-
angle-what-is-angularjs.html
• Let’s Build an AngularJS App!
http://csharperimage.jeremylikness.com/2014/10/lets-build-
angularjs-app.html
• iVision Application Development:
http://ivision.com/our-services/technology-services/application-
development/
Jeremy Likness, Principal Architect @JeremyLikness

More Related Content

PPTX
Advanced AngularJS Tips and Tricks
PPTX
My XML is Alive! An Intro to XAML
PPTX
Enterprise TypeScript
PPTX
The Windows Runtime and the Web
PDF
iOS development best practices
KEY
SGCE 2012 Lightning Talk-Single Page Interface
PDF
Better Page Object Handling with Loadable Component Pattern
PPTX
Better End-to-End Testing with Page Objects Model using Protractor
Advanced AngularJS Tips and Tricks
My XML is Alive! An Intro to XAML
Enterprise TypeScript
The Windows Runtime and the Web
iOS development best practices
SGCE 2012 Lightning Talk-Single Page Interface
Better Page Object Handling with Loadable Component Pattern
Better End-to-End Testing with Page Objects Model using Protractor

What's hot (20)

PDF
Sencha and Spring (Spring 2GX 2013)
PPT
Jasmine - A BDD test framework for JavaScript
PPTX
Lightweight webdev
PDF
Webservices: connecting Joomla! with other programs.
PDF
Sharing the pain using Protractor
PPTX
ASP .NET MVC
PDF
BP101: A Modernized Workflow w/ Domino/XPages
PPTX
jQuery Conference 2012 keynote
PPTX
Backbonemeetup
PPTX
Aspect oriented programming
PPTX
Getting started with MVC 5 and Visual Studio 2013
PPT
OSGi and JavaScript - Simon Kaegi
PDF
Single Page Applications
PPTX
Fast Track introduction to ASP.NET MVC
PDF
APIs: A Better Alternative to Page Objects
PDF
learn mvc project in 7 day
KEY
Enterprise Strength Mobile JavaScript
PPTX
Angular on ASP.NET MVC 6
PPTX
Develop a Basic REST API from Scratch Using TDD with Val Karpov
PPT
MSDN - ASP.NET MVC
Sencha and Spring (Spring 2GX 2013)
Jasmine - A BDD test framework for JavaScript
Lightweight webdev
Webservices: connecting Joomla! with other programs.
Sharing the pain using Protractor
ASP .NET MVC
BP101: A Modernized Workflow w/ Domino/XPages
jQuery Conference 2012 keynote
Backbonemeetup
Aspect oriented programming
Getting started with MVC 5 and Visual Studio 2013
OSGi and JavaScript - Simon Kaegi
Single Page Applications
Fast Track introduction to ASP.NET MVC
APIs: A Better Alternative to Page Objects
learn mvc project in 7 day
Enterprise Strength Mobile JavaScript
Angular on ASP.NET MVC 6
Develop a Basic REST API from Scratch Using TDD with Val Karpov
MSDN - ASP.NET MVC
Ad

Viewers also liked (7)

PPTX
Angular from a Different Angle
PPTX
Let's Build an Angular App!
PPTX
Angle Forward with TypeScript
PPTX
C# Async/Await Explained
PPTX
Windows 8.1 Sockets
PPTX
Back to the ng2 Future
PPTX
Cross-Platform Agile DevOps with Visual Studio Team Services
Angular from a Different Angle
Let's Build an Angular App!
Angle Forward with TypeScript
C# Async/Await Explained
Windows 8.1 Sockets
Back to the ng2 Future
Cross-Platform Agile DevOps with Visual Studio Team Services
Ad

Similar to Single Page Applications: Your Browser is the OS! (20)

PDF
Transitioning Groupon to Node.js - EmpireJS 2014
ODP
Cvcc performance tuning
PPTX
From Zero to Performance Hero in Minutes - Agile Testing Days 2014 Potsdam
PPTX
All about that reactive ui
PDF
27.1.2014, Tampere. Perinteinen mobiilimaailma murroksessa. Petri Niemi: Sing...
PPTX
Benefits of developing single page web applications using angular js
PPTX
Mvc presentation
PDF
Microservices for java architects it-symposium-2015-09-15
PDF
Tech Talk on Cloud Computing
PPTX
Mobile gotcha
PPTX
Integrate Applications into IBM Connections Cloud and On Premises (AD 1632)
PPTX
React.js at Cortex
KEY
Developing High Performance Web Apps - CodeMash 2011
PPTX
Azure Functions Real World Examples
PDF
Optimus XPages: An Explosion of Techniques and Best Practices
PDF
Web Performance Optimization (WPO)
PDF
The future of web development write once, run everywhere with angular js an...
PPTX
The future of web development write once, run everywhere with angular.js and ...
PPTX
Debugging,Troubleshooting & Monitoring Distributed Web & Cloud Applications a...
PPTX
Чурюканов Вячеслав, “Code simple, but not simpler”
Transitioning Groupon to Node.js - EmpireJS 2014
Cvcc performance tuning
From Zero to Performance Hero in Minutes - Agile Testing Days 2014 Potsdam
All about that reactive ui
27.1.2014, Tampere. Perinteinen mobiilimaailma murroksessa. Petri Niemi: Sing...
Benefits of developing single page web applications using angular js
Mvc presentation
Microservices for java architects it-symposium-2015-09-15
Tech Talk on Cloud Computing
Mobile gotcha
Integrate Applications into IBM Connections Cloud and On Premises (AD 1632)
React.js at Cortex
Developing High Performance Web Apps - CodeMash 2011
Azure Functions Real World Examples
Optimus XPages: An Explosion of Techniques and Best Practices
Web Performance Optimization (WPO)
The future of web development write once, run everywhere with angular js an...
The future of web development write once, run everywhere with angular.js and ...
Debugging,Troubleshooting & Monitoring Distributed Web & Cloud Applications a...
Чурюканов Вячеслав, “Code simple, but not simpler”

Recently uploaded (20)

PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
Electronic commerce courselecture one. Pdf
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PDF
KodekX | Application Modernization Development
PPTX
Cloud computing and distributed systems.
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PDF
CIFDAQ's Market Insight: SEC Turns Pro Crypto
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PDF
Empathic Computing: Creating Shared Understanding
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
Per capita expenditure prediction using model stacking based on satellite ima...
Mobile App Security Testing_ A Comprehensive Guide.pdf
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
Electronic commerce courselecture one. Pdf
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
Dropbox Q2 2025 Financial Results & Investor Presentation
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
Spectral efficient network and resource selection model in 5G networks
Advanced methodologies resolving dimensionality complications for autism neur...
KodekX | Application Modernization Development
Cloud computing and distributed systems.
Diabetes mellitus diagnosis method based random forest with bat algorithm
NewMind AI Weekly Chronicles - August'25 Week I
Understanding_Digital_Forensics_Presentation.pptx
CIFDAQ's Market Insight: SEC Turns Pro Crypto
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
Empathic Computing: Creating Shared Understanding

Single Page Applications: Your Browser is the OS!

  • 1. Single Page Applications (SPA) Jeremy Likness Principal Architect @JeremyLikness
  • 2. Our Mission, Vision, and Values
  • 6. TODAY’S AGENDA 1. Why? Drivers behind adoption of SPA applications 2. What? Features that Make up a Single Page App 3. How? Frameworks make building apps easier 4. Q&A You have questions, we have answers
  • 8. Why? A Brief History (Pt. 1) 1995 • Complete pages are loaded from the server • Pages disappear, then reappear 1996 • Internet Explorer introduces the IFRAME • Dozens of websites adopt this ugly hack 1998 • Microsoft Outlook Web App introduces the XMLHTTP component 1999 • XMLHTTP elevated to ActiveX status • Mozilla, Safari, Operate implement XMLHttpRequest 2004 • Another web-based email app, GMail, pushes the envelope • The Ajax standard is born. Work on HTML5 begins (yeah, really!) 2006 • W3C standardizes XMLHttpRequest
  • 9. Why? (A Brief History Pt. 2) 2006 • jQuery normalizes the DOM • Developers suddenly have a lot more free time 2007 • Silverlight released • Microsoft successfully distracts developers away from building SPA apps 2009 • First version of AngularJS is released 2010 • Silverlight 5 is released. It is almost immediately killed • KnockoutJS is released. BackboneJS is released a few months later 2011 • Last call for HTML5 specification • EmberJS is released 2015 • It’s simple. “We want to access any app, from anywhere, on any device.” And you’re responsible to make it happen!
  • 12. The Experience UX • Lacks responsiveness (click and wait) • Page abandonment • Amazon: 100ms slower = 1% lost revenue • Google: 500ms slower = 20% decreased traffic • Lots of manual effort, limited “one-click” experience • Real-time notifications and updates are difficult
  • 13. Reloading and Round-Trips Reload • Server logic is often convoluted when trying to pull data from various areas to aggregate in order to render • Must remember state and re-render state each time (as opposed to state being preserved in the client) • Flicker/page freeze is disruptive
  • 14. Support for Real-time Real-time • Only practical method without SPA is to POST on a timer • Notifications require rebuilding the entire page
  • 15. Server and Scalability Server Load • Server must aggregate data from multiple places • Server now has to process everything again or resort to exotic cache methods to avoid re-processing on refresh • Server is responsible for the logic of taking data and transforming it into presentation, so 1000 clients = 1000x CPU- bound logic on the server
  • 16. Chattiness on the Network Network Load Vs.
  • 17. Mobile-Friendliness Mobile • Requires lighter payloads • Needs simplified model • Less processing (but less rendering is needed) • Less data when going over metered networks
  • 19. WHAT?
  • 20. What? Typical SPA Features Data Binding Views / Components Routing Dependency Injection Data Services Testing
  • 21. Data-Binding Support Data- Binding • Separate presentation logic from actual presentation • For example: “button click” vs. “my action” that can then be bound to a button, hyperlink, or other action • Validation • Data transformation • Leads to testability and scale • “Designer/developer workflow”
  • 22. Don’t Repeat Yourself! Views / Components • Support for rendering to a part of the page • Reusable data transformations (i.e. filters, value converters) • Reusable components (i.e. grids, type-ahead, dialog boxes, etc.) • HTML5 standards (Web Components) • Responsive • Master/detail side-by-side on desktop • Master/detail separate pages on mobile
  • 23. It’s Still the Browser! Routing • Navigation: I can browse to an area of the application • Bookmarks: I can save the hyperlink to a useful piece of information or workflow that I am a part of • State: I can persist my state between areas of the application • Journal: I can use the back and forward buttons on my browser the way I’m used to
  • 24. Managing Large Code Bases Dependency Injection • Loosely couple JavaScript objects • Separation of concerns enables parallel development • Inversion of control enables testability and promotes reusability • Service location makes it easier to develop components with dependencies
  • 25. Would You Rather This … Data Services
  • 27. Given SPA When Test Then OK! Testing • Many frameworks come with their own test suites • Some have specific support for testing and mocking interfaces • All should expose a straightforward means to test • Best frameworks don’t require a dependency on a visible browser
  • 28. HOW?
  • 29. http://jquery.com/ • “Normalize the DOM” • Most popular JavaScript library in use • One of the longest maintained frameworks • Many SPA frameworks can layer on top of this • DEMO: http://todomvc.com/examples/jquery/#/all • Source: https://github.com/tastejs/todomvc/blob/gh- pages/examples/jquery/js/app.js
  • 30. http://www.typescriptlang.org/ • Fooled you, this isn’t a SPA framework • Works well with many existing SPA frameworks • Helps “tame” JavaScript • Very useful for projects with scale (lots of code and/or many developers) • Page: https://github.com/tastejs/todomvc/blob/gh- pages/examples/typescript-angular/index.html • Source: https://github.com/tastejs/todomvc/tree/gh- pages/examples/typescript-angular/js
  • 31. http://knockoutjs.com/ • Introduced in early MVC templates by Microsoft • Declarative bindings • Automatic refresh of UI • Relationships and computed models • Templates • Page: https://github.com/tastejs/todomvc/blob/gh- pages/examples/knockoutjs/index.html • Source: https://github.com/tastejs/todomvc/blob/gh- pages/examples/knockoutjs/js/app.js
  • 32. http://backbonejs.org/ • Model-driven • Idea of “entities” and “collections” • Views • Convention-based REST interface • Page: https://github.com/tastejs/todomvc/blob/gh- pages/examples/backbone/index.html • Source: https://github.com/tastejs/todomvc/tree/gh- pages/examples/backbone/js
  • 33. http://emberjs.com/ • Focused on productivity • Handlebar templates • Common idioms / convention based • Page: https://github.com/tastejs/todomvc/blob/gh- pages/examples/emberjs/index.html • Source: https://github.com/tastejs/todomvc/tree/gh- pages/examples/emberjs/js
  • 34. https://angularjs.org/ • Teach HTML New Tricks • Extensible • Dependency injection out of the box • My favorite framework to use, especially on large projects • Page: https://github.com/tastejs/todomvc/blob/gh- pages/examples/angularjs/index.html • Source: https://github.com/tastejs/todomvc/tree/gh- pages/examples/angularjs/js
  • 35. http://www.telerik.com/kendo-ui • Web and Mobile • HTML5 and JavaScript focused • Layered on top of jQuery • Adapters for AngularJS and BackboneJS “out of the box” • Page: http://kendotodo.apphb.com/Home/Batch
  • 36. Angular 2.0 • Embraces ECMAScript 6 • Built on TypeScript • Example: https://github.com/Microsoft/ngconf2015demo • Page: https://github.com/Microsoft/ngconf2015demo/blob/master/todo.html • Source: https://github.com/Microsoft/ngconf2015demo/blob/master/todo.ts
  • 37. http://aurelia.io/ • Convention-based • Built for ECMAScript 6 from the ground up • Former member of AngularJS 2.0 team • Examples: http://aurelia.io/get-started.html
  • 39. Questions? • Demo Code: https://github.com/JeremyLikness/SPAAppsExplained • A Different Angle: What is AngularJS? http://csharperimage.jeremylikness.com/2014/10/a-different- angle-what-is-angularjs.html • Let’s Build an AngularJS App! http://csharperimage.jeremylikness.com/2014/10/lets-build- angularjs-app.html • iVision Application Development: http://ivision.com/our-services/technology-services/application- development/ Jeremy Likness, Principal Architect @JeremyLikness

Editor's Notes

  • #13: Kohavi and Longobtham 2007 – Amazon.com Linden 2006 – Google.com Rest are google
  • #22: Kohavi and Longobtham 2007 – Amazon.com Linden 2006 – Google.com Rest are google