SlideShare a Scribd company logo
Bit.ly/nnugspa
Instagram #nnug
MAGNUS GREEN (@magnusg)
        Reise                                      Film

                                                   Rock n’ Roll
        Kaffe
                                                   www

   Konsulent
                                                   Gaming


         TDD                                       .net
JavaScript

  Clean Code                                       Øl

                                                   Smidig
     Sneakers
                                                   New York
                Master of Information Technology
BOUVET
54 26'43" S 3 21'46" E
meetup.com/Bouvet-Oslo-Tech
Hva skal vi gjennom?

•   Hva er en Single Page Application?
•   Hvorfor Single Page Application?
•   Hvordan lage en Single Page Application?
•   Bootstrap – HTML5 UI rammeverk
•   RequireJS – Modularisert JavaScript
•   Knockout – MVVM rammeverk
•   SignalR – Real-time async signaling
•   Deploy som en Azure web-site
•   Oppsummering
Single Page Web Application

    • Applikasjon != Webside
    • Data oppdateres når det er
      nødvendig
    • Data oppdateres der hvor det
      er nødvendig
    • Tilstand og navigasjon
6
Client            Server                          Data store
    Tradisjonell web
                       Display HTML      Authentication
                       Decorative JS     Authorization
                       Ajax for HTML       Validation                         Store data
                                         Business logic                      Retrieve data
                                        Generate HTML                        Business logic




                          Client             Server                          Data store
                        Ajax for JSON    Authentication
                       Business Logic    Authorization
    SPA




                       Generate HTML       Validation                          Store data
                                        Generate JSON                         Retrieve data



                                        Kilde:
                                        Single page web applications, Michael S. Mikowski og Josh C.
                                        Powell
7
Forvirret og sint bruker
   (Dårlig steming)        Blid og fornøyd bruker
                               (God stemning)
KISS

     • SPA i sin enkleste form med jQuery
       – http://jsfiddle.net/magnusg/xCDR5/
     • Litt mer avansert med flere rammeverk
       – http://bit.ly/nnugspa




11
Twitter Bootstrap

     • Hva?
       – Front-end rammeverk fra skaperne av
         twitter
     • Hvorfor?
       – Rask vei til å få opp et godt rammeverk /
         prototyp for en SPA eller webside.
       – Lett å style om i etterkant


12
<ul class="nav nav-tabs">
           <li class="active">                     Aktiverer funksjonalitet via
               <a href="#home" data-toggle="tab"> data attributter, ingen
                    <i class="icon-home"></i>Home  JavaScript her!
bootstrap icon
               </a>
           </li>
           <li><a href="#map" data-toggle="tab">Map</a></li>
           <li><a href="#statistics" data-toggle="tab">Statistics</a></li>
     </ul>

<div class="tab-content">
        <div class="tab-pane active" id="home">
           @RenderPage("Views/home.cshtml")
       </div>
        <div class="tab-pane" id="map">Map</div>
        <div class="tab-pane" id="statistics">Statistics</div>
    </div>
                                                  bootstrap css tab pane

13
RequireJS

     • Hva?
       – Dependency injection for JavaScript
     • Hvorfor?
       – JavaScript-koden deles opp i moduler
       – Lettere å få til SRP og renere kode
       – Tar hånd om rekkefølgen på lastingen av
         JavaScript moduler

14
Modulnavn                 Avhengighet


define('dataservice.images', ['ajaxhelper'], function (ajaxhelper) {
    var getImages = function (callbacks, searchTerm) {
        var search = { searchTerm: searchTerm };
        var data = search.searchTerm ? search : searchTerm;
        return ajaxhelper.ajaxRequest('api/images', data)
            .done(callbacks.success)
            .fail(callbacks.error);
    };
    return {
        getImages: getImages              Revealing module
    };
});
define('someservice', ['jquery', 'dataservice.images'],
function($, dataService) {
    $.when(
        dataService.getImages(
            {
                success: function(data) {
                },
                error: function(err) {
                }
            }))
        .then(function() {
            //Do something clever
        });
});
KnockoutJS

     • Hva?
       – MVVM (Model-View-ViewModel) rammeverk
       – Data-binding for JavaScript
     • Hvorfor?
       – Oppdatering av UI når og hvor det er behov
       – Applikasjonstilstand
       – Renere markup og JavaScript
       – Klart skille mellom markup og JavaScript


17
<div class="modal-body">
            <p></p>
            <img data-bind="attr: { src: image_standard_res }"/>
            <div class="heart-image">
                 <strong data-bind="text:likes"></strong>
           </div>
            <div data-bind="foreach:tags">
            <span class="label label-inverse" data-bind="text:$data"></span>
           </div>
     </div>

      var Image = function () {
                   var self = this;
                   self.caption = ko.observable();          foreach-binding
                   self.user = ko.observable();
                   self.userProfilePicture = ko.observable();
                   self.userRealName = ko.observable();
                   self.link = ko.observable();
                   self.image_standard_res = ko.observable();
      text binding
                   self.likes = ko.observable();
                   self.tags = ko.observableArray();
     };
18
click binding – bundet mot view model

<div data-bind="foreach:images">    binding handler, egendefinert binding
    <div class="imageTile span4" data-bind="simplePopup:caption">
        <a href="#imagesModal" data-toggle="modal" data-bind="click:
$root.setCurrentImage">
             <img data-bind="attr: { src: image_standard_res }"/>
        </a>
    </div>
</div>

 var Image = function () {
            var self = this;
            self.caption = ko.observable();
            self.user = ko.observable();
            self.userProfilePicture = ko.observable();
            self.userRealName = ko.observable();
            self.link = ko.observable();
            self.image_standard_res = ko.observable();
            self.likes = ko.observable();
            self.tags = ko.observableArray();
};
SignalR

     • Hva?
       – Sanntidskommunikasjon mellom server og klient
     • Hvorfor?
       – Sanntidsoppdatering av klienter
       – Meldinger om endringer i data eller endringer i andre
         klienter




20
+

        =
     AWESOME
21
Pass på!

     •   JavaScript minnehåndtering
     •   Ikke rør DOM hvis du ikke må!
     •   Lær deg JavaScript!
     •   Bruk Chrome debugging og
         performance tools (Firebug /
         Dragonfly)

22
Oppsummering

     • SPA = RIA = RWA?
     • SPA er applikasjoner, ikke web-sider
     • Bedre brukeropplevelse på flere plattformer
     • JavaScript kan være rent og
       vedlikeholdbart
     • Web browseren som plattform har kommet
       for å bli!

23   22. august 2012   Bunntekst – endres/slettes med "Sett inn, Topptekst og bunntekst"
24
Do you haz teh codez?

     • Websiden:
       – http://bit.ly/nnugspa
     • SPA Starter
       – https://github.com/magnushg/SinglePageAppStarter
     • Awsome SPA
       – https://github.com/magnushg/AwesomeSPAReboot




25
Ressurser

     • http://twitter.github.com/bootstrap/index.html
     • http://requirejs.org/
     • http://www.knockmeout.net/
     • http://knockoutjs.com/
     • https://github.com/SignalR/SignalR
     • http://addyosmani.com/blog/
     • http://www.johnpapa.net/building-single-page-apps-with-
       knockout-jquery-and-web-api-ndash-the-story-begins/
     • http://chutzpah.codeplex.com/
     • http://javascriptjabber.com/
     • http://responsinator.com/

26
Takk for meg!
     Ta gjerne kontakt hvis du lurer på noe.

     @magnusg
     magnus.green@bouvet.no




27

More Related Content

Similar to The Client Strikes Back

Nnug angular
Nnug angularNnug angular
Nnug angularfnakstad
 
Firefox os og web som mobil plattform
Firefox os og web som mobil plattformFirefox os og web som mobil plattform
Firefox os og web som mobil plattform
Håvard Wigtil
 
Firefox OS - og web som mobil plattform
Firefox OS - og web som mobil plattformFirefox OS - og web som mobil plattform
Firefox OS - og web som mobil plattform
Håvard Wigtil
 
Firefox os og web som mobil plattform
Firefox os og web som mobil plattformFirefox os og web som mobil plattform
Firefox os og web som mobil plattform
Håvard Wigtil
 
Javascript tar hevn
Javascript tar hevnJavascript tar hevn
Javascript tar hevn
fossmo
 
Responsiv design og Bootstrap 3
Responsiv design og Bootstrap 3Responsiv design og Bootstrap 3
Responsiv design og Bootstrap 3
Morten Bergset
 
BK2011 Utvikling av lette webapplikasjoner i java script og html
BK2011 Utvikling av lette webapplikasjoner i java script og htmlBK2011 Utvikling av lette webapplikasjoner i java script og html
BK2011 Utvikling av lette webapplikasjoner i java script og htmlGeodata AS
 
11 erfaringer ditt prosjekt ikke behøver å gjenta
11 erfaringer ditt prosjekt ikke behøver å gjenta11 erfaringer ditt prosjekt ikke behøver å gjenta
11 erfaringer ditt prosjekt ikke behøver å gjenta
ilmyggo
 
Beste praksis for å implementere ArcGIS i din virksomhet - BK2016
Beste praksis for å implementere ArcGIS i din virksomhet - BK2016Beste praksis for å implementere ArcGIS i din virksomhet - BK2016
Beste praksis for å implementere ArcGIS i din virksomhet - BK2016
Geodata AS
 
BK2011 Introduksjon til arc gis desktop add ins
BK2011 Introduksjon til arc gis desktop add insBK2011 Introduksjon til arc gis desktop add ins
BK2011 Introduksjon til arc gis desktop add insGeodata AS
 
20130212 firstpoint citrix seminar 12 februar
20130212 firstpoint citrix seminar 12 februar20130212 firstpoint citrix seminar 12 februar
20130212 firstpoint citrix seminar 12 februarSturla Grelland
 
Blazor - en kjapp intro
Blazor - en kjapp introBlazor - en kjapp intro
Blazor - en kjapp intro
Runegri
 
Kinderegget enklere billigere og mye raskere_baksia
Kinderegget enklere billigere og mye raskere_baksiaKinderegget enklere billigere og mye raskere_baksia
Kinderegget enklere billigere og mye raskere_baksia
Tormod Varhaugvik
 
Mellom bedriftens nettverk og skyen
Mellom bedriftens nettverk og skyenMellom bedriftens nettverk og skyen
Mellom bedriftens nettverk og skyen
MVP Dagen
 
BK2015 dataforvaltning i nettskyen
BK2015 dataforvaltning i nettskyenBK2015 dataforvaltning i nettskyen
BK2015 dataforvaltning i nettskyen
Geodata AS
 
Monolitter og byggeklosser jon erik solheim - stacc
Monolitter og byggeklosser   jon erik solheim - staccMonolitter og byggeklosser   jon erik solheim - stacc
Monolitter og byggeklosser jon erik solheim - stacc
Jon Solheim
 
HTML5 - en int teori
HTML5 - en int teoriHTML5 - en int teori
HTML5 - en int teoriDag Tjemsland
 
N2CMS presentation 2013-07-04
N2CMS presentation 2013-07-04N2CMS presentation 2013-07-04
N2CMS presentation 2013-07-04
Svein Fidjestøl
 
Web 2.0 og sosiale teknologier
Web 2.0 og sosiale teknologierWeb 2.0 og sosiale teknologier
Web 2.0 og sosiale teknologier
Bergen Public Library
 
Gøyere med VisGI - BK2016
Gøyere med VisGI - BK2016Gøyere med VisGI - BK2016
Gøyere med VisGI - BK2016
Geodata AS
 

Similar to The Client Strikes Back (20)

Nnug angular
Nnug angularNnug angular
Nnug angular
 
Firefox os og web som mobil plattform
Firefox os og web som mobil plattformFirefox os og web som mobil plattform
Firefox os og web som mobil plattform
 
Firefox OS - og web som mobil plattform
Firefox OS - og web som mobil plattformFirefox OS - og web som mobil plattform
Firefox OS - og web som mobil plattform
 
Firefox os og web som mobil plattform
Firefox os og web som mobil plattformFirefox os og web som mobil plattform
Firefox os og web som mobil plattform
 
Javascript tar hevn
Javascript tar hevnJavascript tar hevn
Javascript tar hevn
 
Responsiv design og Bootstrap 3
Responsiv design og Bootstrap 3Responsiv design og Bootstrap 3
Responsiv design og Bootstrap 3
 
BK2011 Utvikling av lette webapplikasjoner i java script og html
BK2011 Utvikling av lette webapplikasjoner i java script og htmlBK2011 Utvikling av lette webapplikasjoner i java script og html
BK2011 Utvikling av lette webapplikasjoner i java script og html
 
11 erfaringer ditt prosjekt ikke behøver å gjenta
11 erfaringer ditt prosjekt ikke behøver å gjenta11 erfaringer ditt prosjekt ikke behøver å gjenta
11 erfaringer ditt prosjekt ikke behøver å gjenta
 
Beste praksis for å implementere ArcGIS i din virksomhet - BK2016
Beste praksis for å implementere ArcGIS i din virksomhet - BK2016Beste praksis for å implementere ArcGIS i din virksomhet - BK2016
Beste praksis for å implementere ArcGIS i din virksomhet - BK2016
 
BK2011 Introduksjon til arc gis desktop add ins
BK2011 Introduksjon til arc gis desktop add insBK2011 Introduksjon til arc gis desktop add ins
BK2011 Introduksjon til arc gis desktop add ins
 
20130212 firstpoint citrix seminar 12 februar
20130212 firstpoint citrix seminar 12 februar20130212 firstpoint citrix seminar 12 februar
20130212 firstpoint citrix seminar 12 februar
 
Blazor - en kjapp intro
Blazor - en kjapp introBlazor - en kjapp intro
Blazor - en kjapp intro
 
Kinderegget enklere billigere og mye raskere_baksia
Kinderegget enklere billigere og mye raskere_baksiaKinderegget enklere billigere og mye raskere_baksia
Kinderegget enklere billigere og mye raskere_baksia
 
Mellom bedriftens nettverk og skyen
Mellom bedriftens nettverk og skyenMellom bedriftens nettverk og skyen
Mellom bedriftens nettverk og skyen
 
BK2015 dataforvaltning i nettskyen
BK2015 dataforvaltning i nettskyenBK2015 dataforvaltning i nettskyen
BK2015 dataforvaltning i nettskyen
 
Monolitter og byggeklosser jon erik solheim - stacc
Monolitter og byggeklosser   jon erik solheim - staccMonolitter og byggeklosser   jon erik solheim - stacc
Monolitter og byggeklosser jon erik solheim - stacc
 
HTML5 - en int teori
HTML5 - en int teoriHTML5 - en int teori
HTML5 - en int teori
 
N2CMS presentation 2013-07-04
N2CMS presentation 2013-07-04N2CMS presentation 2013-07-04
N2CMS presentation 2013-07-04
 
Web 2.0 og sosiale teknologier
Web 2.0 og sosiale teknologierWeb 2.0 og sosiale teknologier
Web 2.0 og sosiale teknologier
 
Gøyere med VisGI - BK2016
Gøyere med VisGI - BK2016Gøyere med VisGI - BK2016
Gøyere med VisGI - BK2016
 

The Client Strikes Back

  • 2. MAGNUS GREEN (@magnusg) Reise Film Rock n’ Roll Kaffe www Konsulent Gaming TDD .net JavaScript Clean Code Øl Smidig Sneakers New York Master of Information Technology
  • 3. BOUVET 54 26'43" S 3 21'46" E meetup.com/Bouvet-Oslo-Tech
  • 4.
  • 5. Hva skal vi gjennom? • Hva er en Single Page Application? • Hvorfor Single Page Application? • Hvordan lage en Single Page Application? • Bootstrap – HTML5 UI rammeverk • RequireJS – Modularisert JavaScript • Knockout – MVVM rammeverk • SignalR – Real-time async signaling • Deploy som en Azure web-site • Oppsummering
  • 6. Single Page Web Application • Applikasjon != Webside • Data oppdateres når det er nødvendig • Data oppdateres der hvor det er nødvendig • Tilstand og navigasjon 6
  • 7. Client Server Data store Tradisjonell web Display HTML Authentication Decorative JS Authorization Ajax for HTML Validation Store data Business logic Retrieve data Generate HTML Business logic Client Server Data store Ajax for JSON Authentication Business Logic Authorization SPA Generate HTML Validation Store data Generate JSON Retrieve data Kilde: Single page web applications, Michael S. Mikowski og Josh C. Powell 7
  • 8.
  • 9.
  • 10. Forvirret og sint bruker (Dårlig steming) Blid og fornøyd bruker (God stemning)
  • 11. KISS • SPA i sin enkleste form med jQuery – http://jsfiddle.net/magnusg/xCDR5/ • Litt mer avansert med flere rammeverk – http://bit.ly/nnugspa 11
  • 12. Twitter Bootstrap • Hva? – Front-end rammeverk fra skaperne av twitter • Hvorfor? – Rask vei til å få opp et godt rammeverk / prototyp for en SPA eller webside. – Lett å style om i etterkant 12
  • 13. <ul class="nav nav-tabs"> <li class="active"> Aktiverer funksjonalitet via <a href="#home" data-toggle="tab"> data attributter, ingen <i class="icon-home"></i>Home JavaScript her! bootstrap icon </a> </li> <li><a href="#map" data-toggle="tab">Map</a></li> <li><a href="#statistics" data-toggle="tab">Statistics</a></li> </ul> <div class="tab-content"> <div class="tab-pane active" id="home"> @RenderPage("Views/home.cshtml") </div> <div class="tab-pane" id="map">Map</div> <div class="tab-pane" id="statistics">Statistics</div> </div> bootstrap css tab pane 13
  • 14. RequireJS • Hva? – Dependency injection for JavaScript • Hvorfor? – JavaScript-koden deles opp i moduler – Lettere å få til SRP og renere kode – Tar hånd om rekkefølgen på lastingen av JavaScript moduler 14
  • 15. Modulnavn Avhengighet define('dataservice.images', ['ajaxhelper'], function (ajaxhelper) { var getImages = function (callbacks, searchTerm) { var search = { searchTerm: searchTerm }; var data = search.searchTerm ? search : searchTerm; return ajaxhelper.ajaxRequest('api/images', data) .done(callbacks.success) .fail(callbacks.error); }; return { getImages: getImages Revealing module }; });
  • 16. define('someservice', ['jquery', 'dataservice.images'], function($, dataService) { $.when( dataService.getImages( { success: function(data) { }, error: function(err) { } })) .then(function() { //Do something clever }); });
  • 17. KnockoutJS • Hva? – MVVM (Model-View-ViewModel) rammeverk – Data-binding for JavaScript • Hvorfor? – Oppdatering av UI når og hvor det er behov – Applikasjonstilstand – Renere markup og JavaScript – Klart skille mellom markup og JavaScript 17
  • 18. <div class="modal-body"> <p></p> <img data-bind="attr: { src: image_standard_res }"/> <div class="heart-image"> <strong data-bind="text:likes"></strong> </div> <div data-bind="foreach:tags"> <span class="label label-inverse" data-bind="text:$data"></span> </div> </div> var Image = function () { var self = this; self.caption = ko.observable(); foreach-binding self.user = ko.observable(); self.userProfilePicture = ko.observable(); self.userRealName = ko.observable(); self.link = ko.observable(); self.image_standard_res = ko.observable(); text binding self.likes = ko.observable(); self.tags = ko.observableArray(); }; 18
  • 19. click binding – bundet mot view model <div data-bind="foreach:images"> binding handler, egendefinert binding <div class="imageTile span4" data-bind="simplePopup:caption"> <a href="#imagesModal" data-toggle="modal" data-bind="click: $root.setCurrentImage"> <img data-bind="attr: { src: image_standard_res }"/> </a> </div> </div> var Image = function () { var self = this; self.caption = ko.observable(); self.user = ko.observable(); self.userProfilePicture = ko.observable(); self.userRealName = ko.observable(); self.link = ko.observable(); self.image_standard_res = ko.observable(); self.likes = ko.observable(); self.tags = ko.observableArray(); };
  • 20. SignalR • Hva? – Sanntidskommunikasjon mellom server og klient • Hvorfor? – Sanntidsoppdatering av klienter – Meldinger om endringer i data eller endringer i andre klienter 20
  • 21. + = AWESOME 21
  • 22. Pass på! • JavaScript minnehåndtering • Ikke rør DOM hvis du ikke må! • Lær deg JavaScript! • Bruk Chrome debugging og performance tools (Firebug / Dragonfly) 22
  • 23. Oppsummering • SPA = RIA = RWA? • SPA er applikasjoner, ikke web-sider • Bedre brukeropplevelse på flere plattformer • JavaScript kan være rent og vedlikeholdbart • Web browseren som plattform har kommet for å bli! 23 22. august 2012 Bunntekst – endres/slettes med "Sett inn, Topptekst og bunntekst"
  • 24. 24
  • 25. Do you haz teh codez? • Websiden: – http://bit.ly/nnugspa • SPA Starter – https://github.com/magnushg/SinglePageAppStarter • Awsome SPA – https://github.com/magnushg/AwesomeSPAReboot 25
  • 26. Ressurser • http://twitter.github.com/bootstrap/index.html • http://requirejs.org/ • http://www.knockmeout.net/ • http://knockoutjs.com/ • https://github.com/SignalR/SignalR • http://addyosmani.com/blog/ • http://www.johnpapa.net/building-single-page-apps-with- knockout-jquery-and-web-api-ndash-the-story-begins/ • http://chutzpah.codeplex.com/ • http://javascriptjabber.com/ • http://responsinator.com/ 26
  • 27. Takk for meg! Ta gjerne kontakt hvis du lurer på noe. @magnusg magnus.green@bouvet.no 27

Editor's Notes

  1. GmailEvernoteFacebookTwitter