際際滷

際際滷Share 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
The Client Strikes Back
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
The Client Strikes Back
The Client Strikes Back
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 (20)

PDF
BK2011 Utvikling av lette webapplikasjoner i java script og html
Geodata AS
PDF
Firefox os og web som mobil plattform
H奪vard Wigtil
PDF
Firefox os og web som mobil plattform
H奪vard Wigtil
PDF
Firefox OS - og web som mobil plattform
H奪vard Wigtil
PDF
Hybrid-applikasjoner
Kjartan Michalsen
PDF
Frontend webutvikling
hegerokenes
PDF
Meetup16
Morten Bergset
PPTX
20 ting andre gundersen
klamsvett
KEY
Mobilism
strandoe
PDF
GoOpen 2010: H奪vard Haug Hanssen
Friprogsenteret
PPTX
2011 09-13 j query workshop
Visma Consulting AS
PDF
Kristiansand php meeting #1
Morten Bergset
PDF
Introduksjon til phonegap
Kjartan Michalsen
PPTX
Mobil (r)evolusjon
Mobiletech
PPTX
Responsiv design og Bootstrap 3
Morten Bergset
PDF
Medlemsm淡te i PHP Norge: Flex 2 og PHP
Knut Urdalen
PPTX
Kundeseminar April 2014, universell utforming og cookie loven
CoreTrek
PDF
Meetup 9 i KristansandPHP
Morten Bergset
PPTX
web-periode 1mkb
sijo26
PDF
Om sosiale medier, SpareBank 1 og 7 viktige trender - Hvor g奪r den sosiale di...
Christian Brosstad
BK2011 Utvikling av lette webapplikasjoner i java script og html
Geodata AS
Firefox os og web som mobil plattform
H奪vard Wigtil
Firefox os og web som mobil plattform
H奪vard Wigtil
Firefox OS - og web som mobil plattform
H奪vard Wigtil
Hybrid-applikasjoner
Kjartan Michalsen
Frontend webutvikling
hegerokenes
Meetup16
Morten Bergset
20 ting andre gundersen
klamsvett
Mobilism
strandoe
GoOpen 2010: H奪vard Haug Hanssen
Friprogsenteret
2011 09-13 j query workshop
Visma Consulting AS
Kristiansand php meeting #1
Morten Bergset
Introduksjon til phonegap
Kjartan Michalsen
Mobil (r)evolusjon
Mobiletech
Responsiv design og Bootstrap 3
Morten Bergset
Medlemsm淡te i PHP Norge: Flex 2 og PHP
Knut Urdalen
Kundeseminar April 2014, universell utforming og cookie loven
CoreTrek
Meetup 9 i KristansandPHP
Morten Bergset
web-periode 1mkb
sijo26
Om sosiale medier, SpareBank 1 og 7 viktige trender - Hvor g奪r den sosiale di...
Christian Brosstad

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
  • 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
  • 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

  • #9: GmailEvernoteFacebookTwitter