Javascript rammeverk

Nylig kom vi over en video fra fjorårets NDC. Det var en talk som het “Choosing a javascript framework” av Rob Eisenberg. Denne videoen inspirerte oss til å se litt nærmere på nettopp javascript rammeverk.

I talken til Eisenberg plukket han ut et sett med javascript rammeverk og sammenligner så disse. Vi ville kjøre en litt lik approach, men valgt å legge til et bibliotek som vi vet mange i Ciber har erfaring med; knockout.js. Ofte er det enklere å sammenligne med noe man kjenner.

Skjermbilde 2016-12-04 kl. 15.13.52.jpg

Rammeverk / Bibliotek?

Som vi ser på bildet over er det noen som blir klassifisert som rammeverk og noen som blir klassifisert som bibliotek. Hva er forskjellen?

Skjermbilde 2016-11-20 kl. 22.51.45.jpg
Rammeverk

En kan tenke på et rammeverk som et hus. Når et hus blir laget må du følge visse retningslinjer.

Du må ha en noen dører, et vindu osv.

Skjermbilde 2016-11-20 kl. 22.52.04.jpg
Bibliotek

Mens i et bibliotek står du friere, du får masse tømmer som du kan utforme slik du vil, uten å følge for mange retningslinjer.

Hva er en toveis binding?

  1. Når data i modellen blir oppdatert, blir også UI’et oppdatert
  2. Når UI elementer blir oppdatert, blir endringene propagert tilbake til modellen

Det er nettopp dette vi har implementert for hvert rammeverk, en toveis databinding. Dette kan forhåpentligvis gi oss et lite inntrykk av rammeverkene.

Koden er tilgjengelig her

toway.gif

Wappalyzer

En nyttig chrome extension vi har brukt litt for å gjøre research er wappalyzer. Du får den til firefox, chrome, opera og som «bookmarklet» på https://wappalyzer.com/download.

Med denne kan du lett se hvilke teknologier nettsidene du besøker bruker. Kategorier av teknologier inkluderer JavaScript rammeverk, web server, Ecommerce platform og CMS.

Vi har tittet litt rundt på store sider for å se hva de bruker

Wappalyzer tilgjengeliggjør også noe av dataen sin på hjemmesiden sin wappalyzer.com – Vi har sett litt på topplistene for de ulike rammeverkene. For å se om det er noen store sider vi har hørt om som bruker de ulike rammeverkene

 

skjermbilde-2016-11-30-kl-21-18-38-kopiskjermbilde-2016-11-30-kl-21-20-57-kopiskjermbilde-2016-11-30-kl-21-21-42-kopi

Angular1

pastedImage0.png

  • 52,899 stjerner
  • Første release på github
  • 21 oktober 2010
  • Google
  • Superpopulært når det kom ut
  • Foreldet

Angular1 ble raskt en supersuksess, og alle som ville gjøre noe som helst med frontend måtte ha kjennskap til Angular1.

angular1

Måten Angular1 henger sammen er ved at ng-controller blir reflektert i .controller. For å koble Angular1 opp mot html-en bruker du ng-app attributten som blir reflektert i .moudle.

For å sette opp en to-veis-binding i Angular1 må du ha propertien i en ng-model for så og skrive ut resultatet, i dette eksempelet en funksjon som skriver ut hele navnet, inneklemt i {{ }}.

Angular2

pastedImage0.png

  • 17,538 stjerner
  • Første release på github
  • 14 mars 2014
  • Google
  • Typescript
  • Tidkrevende å sette opp

Når du bruker Angular2 så er det veldig sterkt anbefalt at du også bruker typescript. Og typescript kan en ramse opp slik:

  • Superset av javascript
  • Sterkt typet javascript
  • Laget av microsoft
  • Må transpiles til javascript

pasted image 0.png

Som vi kan lese på siste punkt er at typescript må transpiles til javascript, men hva er forskjellen på kompilering og transpilering?transpiling.png

Forskjellen er at når du kompilerer noe så blir det gjort om til et nytt språk, slik som i bildet der C blir gjort om til binærkode. Når vi bruker begrepet transpiling snakker vi da om å gjøre om fra et språk til et tilnærmet lik språk, slik som typescript og javascript.

angular21.png

I Angular2 kobler du html-templaten opp mot templateUrl og selector blir gjenspeilt html-en for å kunne vise komponenten.

For å sette opp en to-veis-binding i Angular2 må du ha propertien i en [(ngModel)] for så og skrive ut resultatet, i dette eksempelet en funksjon som skriver ut hele navnet, inneklemt i {{ }}.

Aurelia

aurelia-icon-512x512

Aurelia, rammeverket fra Rob Eisenberg som inspirerte oss til å se på de ulike rammeverkene.

Nytt, men populært

Dette er et veldig nytt rammeverk, release candidaten kom 22. Juni 2016. Allikevel har de 8, 167 stjerner på github, som er mer enn knockout.js som har 7796. Allikevel klarte vi ikke å finne noen store nettsider som brukte Aurelia. Noen eksempler kan du allikevel finne på: http://builtwithaurelia.com/ . Eisenberg, som står bak rammeverket var tidligere en del av angular 2 teamet, men brøt ut fordi han var uenig i hvordan en del ting ble gjort. Han lagde så et nytt rammeverk, på bakgrunn av hva han ikke likte ved angular 2.

Selvstendig

I talken sin argumenterer Eisenberg også med at det er en stor fordel å ikke være underlagt et stort selskap. Google har Angular og Polymer. Facebook har React. Dersom du er enig i at det er positivt med rammeverk som er “selvstendig” kan Aurelia være noe for deg.

Raskt, lite og lett å ta i bruk

Videre argumenterer Eisenberg med at Aurelia er lite, da han sammenligner Aurelia sin filstørelse med konkurentenes vinner Aurelia. Raskt er det også, se mer om dette lenger nede i dette innlegget under performance…

I tillegg skal det være lett å ta i bruk, da Aurelia ikke krever at du benytter noen forkunnskaper eller at du setter deg inn i f.eks JSX eller TypeScript.

Under ser du toveis bindingseksempelet

export class App {
 firstName = 'Kalle';
 lastName = 'Klovn';

 get fullName() {
 return this.firstName + ' ' + this.lastName;
 }
}
<template>
    First Name: <input type="text" value.bind="firstName">
    Last Name: <input type="text" value.bind="lastName">
    Full Name: ${fullName}
</template>

Knockout

knockoutjs-logo

  • 7,796 stjerner
  • Første release på github
    • 5 juli 2010
  • Støtter IE6
  • MVVM
  • …dødt?
function AppViewModel() {
 this.firstName = ko.observable("Kalle");
 this.lastName = ko.observable("Klovn");

 this.fullName = ko.computed(function () {
 return "Full name: " + this.firstName() + " " + this.lastName();
 }, this);
}
<html>
<script type='text/javascript' src='https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.0/knockout-min.js'></script>
<script type='text/javascript' src='script.js'></script>

<body>

 <!--TODO: flytt ut htmlen til en egen html side og inkluder i index.html-->
 First name: <input type="text" data-bind="textInput: firstName"><br>
 Last name: <input type="text" data-bind="textInput: lastName"><br>
 <div data-bind="text: fullName"></div>

 <script>
 ko.applyBindings(new AppViewModel());
 </script>
</body>

</html>

Hvem bruker knockout?

# WEBSITE DETECTIONS
1 duckduckgo.com 49,213
2 login.live.com 43,224
3 mamba.ru 9,655
4 mediafire.com 8,960
5 my2.siteimprove.com 8,011
6 fetlife.com 8,006
7 kooora.com 7,812
8 portal.azure.com 7,231
9 portal.leadforensics.com 6,646
10 dell.com 6,301

Kilde: https://wappalyzer.com/applications/knockoutjs

Er knockout dødt?

Skjermbilde 2016-11-30 kl. 22.53.57.jpg

Kilde: https://github.com/knockout/knockout

Det er ikke kommet en commit på knockout sin github siden 15. Januar 2016 i skrivende stund. Hva betyr det? Dødt? Eller bare fungerer alt for bra?

#KnockoutJS på twitter

Dersom man går på twitter og tar en titt på #knockoutjs finner man fort ut at det fortsatt er mange som både bruker og lærer seg knockoutjs i dag. Knockout er nok ikke dødt, men i ferd med å dø ut…?

pleasetellmywifeimanorangutan

Polymer

1QNHedD04A73PPqTp2GS0kGT4nVfP4Oh4DBJrTB33sA.png

  • 16,221 stjerner
  • Første release på github
  • 11 juli 2013
  • Veldig forskjellig fra de andre
  • Kun html filer
  • Laget av google chrome teamet

Polymer skiller seg veldig fra de andre javascriptene i denne sammenligningen. Dette er fordi alt skrives i html, ved hjelp av webcomponents-standarder.

polymer.png

Når vi lager en to-veis-binding i polymer må vi bruke to {{ og putte inn navnet til propertien og html-typen bak :: . Måten du binder opp Polymer med komponenten er Polymer.is og dom-module.id. Når du skal bruke en polymer-komponent på siden må du da importere komponenten med en link tag for så og bruke den som en html-tag.

React

  • 52,313 stjerner
  • Første release på github
    • 29 mai 2013
  • Må skrive JSX (sort of)
  • Lawyer up

1xUDlzvEr6RUwf6kSAdnxBPpsc0TOXm2COKwP6aU.png

  • “Alle” bruker det
  • Redux? Flux? statesreact.png

react-2.png

angular21.png

Som du kan se så er det litt tungvint å sette opp en to-veis-binding.

Du må ha en onChange-attributt som kaller en funksjon som oppdaterer en state som skriver til verdien du vil oppdatere. Så må du rendre react-klassen i en ReactDOM.render, her må du også skrive iden som skal brukes for å kalle react-komponenten.

Isomorfi? Server Side Rendering? (SSR)

Etter å ha lest litt om react har vi sett at det er populært å lage noe som blir kalt «isomorfiske apper». Men hva er egentlig dette? Vi vet ikke om dette er noe alle gjør, men man kan visstnok få en utrolig rask webapp med det.

Vi fant et eksempel som forklarer isomorfi ganske bra: https://www.lullabot.com/articles/what-is-an-isomorphic-application. La oss se litt nærmere på hva de forklarer.

I web utvikling, er en isomorfisk app en app der koden (i dette tilfellet JavaScript kan kjøre både på serveren og i klienten

I en isomorfisk app vil det første requestet gjort av nettleseren bli prosessert av serveren, mens de følgende requestene blir gjort av klienten. La oss se på eksempelet fra lullabot.

Skjermbilde 2016-12-01 kl. 22.50.25.jpg

Eksempelapplikasjonen deres er en app som viser artikler.

Dersom vi laster appen og ser på kildekoden, vil vi se HTML, CSS og bilder. Ser vi i bunnen finner vi noen JavaScript filer. build/bundle.js er react appen, som inneholder listen av routes, templates og komponentene som trengs for å navigere seg i siden. La oss se trinn for trinn hvordan requesten blir prosessert.

  1. Vi skrev inn http://localhost:3000/articles/importing-huge-databases-faster i nettleseren og trykket enter
  2. Requesten nådde serveren, som hentet artikkelens data fra CouchDB, bygget hele siden, og returnerte den til node.js
  3. Brukeren ser responsen i HTML, mens nettleseren laster ned React appen (build/bundle.js) async…

Skjermbilde 2016-12-03 kl. 21.37.31.jpgTrikset: Den samme requesten er prosessert forskjellig hvis man navigerer seg til artikkelen ved å trykke på linken til den istedenfor å skrive inn urle’en i nettleseren.

Skjermbilde 2016-12-03 kl. 21.17.26.jpg

Nå som vi har artikkelen og applikasjonen lastet inn i nettleseren vår, kan vi se på listen over artikler og trykke på den samme artikkelen som vi lastet inn i sted…

Skjermbilde 2016-12-03 kl. 21.17.36.jpg

Her er responsen sett i chrome developer tools

Det vi ser er en XHR request (XML Http Request Object)

La oss se på det steg for steg…

  1. Vi trykket på artikkelens link mens vi var på /articles
  2. React tolket click eventen og stoppet propageringen (forplantingen?)
  3. React sente en XMLHttpRequest til CouchDB for å hente artikkelen
  4. React sendte artikkelens data til artikkel templaten og rendret den

Skjermbilde 2016-12-03 kl. 21.20.16.jpg

Okay, hæ?

wat8

CouchDB har et HTTP/JSON API som gjør at det kan kalles direkte fra klienten

Derfor henter vi kun ut dataen vi trenger direkte, og mater denne inn i DOM’en…

Skjermbilde 2016-12-03 kl. 21.45.24.jpg

Det gjør at ting går raskere enn om vi måtte gått via serveren

giphy

 

Riot

15IG8cx_r3jCxmHPfZqsrMj0hnykkr0rRxQvlIv0E0w.png

  • 10,729 stjerner
  • 8 november 2013
  • Alternativ til React
  • Tok med pga the Eisenberg Effect nevnte det

Riot er inspirert av react, men i motsetning til react så er det ikke noen klausuler som kan gi deg hindringer i fremtiden.

 

1OAUnCg3Ux-tqDSc_ZJF7grACyZDLxHwYepV6nanLeQ.png

Som du kan se på bildet så har riot en relativt liten størrelse i forhold til andre rammeverker.

2016-12-15 19_50_19-Javascript frameworks - Google Slides.png

Når vi lager en to-veis-binding i riot legger vi propertien som skal endre seg inni det som skal trigge en event. I bildet er det onkeyup som er eventen, og editFirstName som er propertien. For å koble javascript opp mot taggen bruker man navnet på taggen etterfulgt av Tag, for så og kalle på javascriptet.

For å ta i bruk taggen på siden må skrive inn html-attributtet i htmlen, for så og binde opp tag-navnet samt valgene til taggen, hvis de eksisterer.

Performance

Skjermbilde 2016-12-03 kl. 21.51.06.jpg

La oss se litt på performance..

Vi hadde hørt at react var så sykt raskt, så vi søkte litt på performance rundt javascript rammeverk

Etter verdt fant vi en fyr som heter Stefen Krause, han har laget noen performance tester som blant annet lager rader, sletter rader, bytter rader osv osv

Disse oprasjonene har han implementert på mange forskjellige rammeverk og kjørt dem på sin macbook pro. Tidene er i millisekunder, den endelige scoren er hvor raskt rammeverket var sammenlignet med vanlig javascript uten bruk av rammverk.

Kilde: http://stefankrause.net/js-frameworks-benchmark4/webdriver-ts/table.html

performance

Testene ligger tilgjengelig på github, så du kan laste de ned og kjøre de på din egen maskin

Hvis du syns implementasjonen av testene for et av rammeverkene er dårlig implementert, eller tester av et rammeverk mangler kan du gå inn og legge inn en pull request

https://github.com/krausest/js-framework-benchmark

Nettop dette gjorde selvfølgelig “Eisenberg effect”, som ikke var fornøyd med aurelia implementasjonen, han syns den var “poorly written” og sendte inn en pull request. Dette økte performancen på aurelia fra 2.17 til 1.66

eisenberg.jpg

Så hvordan gikk det egentlig med våre utvalgte rammeverk?

3 av de var ikke med de nyeste testresultatene Stefan har publisert på bloggen sin, men i github repoet har jeg sett at det nå er kommet en knockout implementasjon

Uansett, etter at pull requestet til Eisenberg ble tatt inn er det aurelia som er det raskeste av “våre”, det gjør det også til en 6. plass totalt i testen. Før hans implementasjon hadde aurelia 2.66, som ville lagt det etter angular 1

Uansett ser vi at react kommer etter aurelia, så angular 2, så angular, og så ember til sist med en veldig treg score

Skjermbilde 2016-12-04 kl. 10.07.03.jpg

Så, hvem var de raskeste i denne testen?

For oss var disse rammeverkene totalt ukjente, med unntak av vue som vi så vidt hadde hørt om.

Det første vi legger merke til er at inferno skiller seg veldig ut på performance, 1.07 er nesten like raskt som vanillajs

Ellers er de andre her også ganske kjappe, det er hele 8 rammeverk som er raskere enn aurelia

Skjermbilde 2016-12-04 kl. 10.09.33.jpg

Stefan, som han som har laget testen heter, er selv overasket over hvor sykt rask inferno er, og måtte til og med endre litt på testen for at vanlig javascript skulle matche inferno.

Kanskje vi må se litt nærmere på inferno…

inferno.jpg

Men hva med de andre her? Hvem er de? For å få et bilde av hvor populære disse er har vi inkludert antall github stars i tabellen her.

Vi ser da umiddelbart at Vue er ganske mye mer populær enn de andre, med 31 000 stars.

For oss var vue et noe nytt, men det ser da ut som noe som er verdt å titte nærmere på.

Skjermbilde 2016-12-04 kl. 10.13.33.jpg

Konklusjon

Det eneste vi kan «konkludere» med er å dele rammeverkene opp i noen grupper ift. hvor mye vi anbefaler de eller ikke. Det vil ikke være noe fasitsvar på hva du bør velge til ditt neste prosjekt, men vi kan foreslå noen du kanskje bør vurdere. Som tidligere nevnt har vi kun gjort en overfladisk analyse og har ingen erfaring med bruk av dem, med unntak av knockout og angular2.

Hva mener du er fremtiden? Hvilket bibliotek/rammeverk bruker du og hva mener du en bør satse på? Bruk kommentarfeltet under!

Se gjerne mer på

logoinferno

Kanskje se mer på?

aurelia-icon-512x512.png

Bankers?

logo-578x270

Kanskje?

angular2

Litt usikker…

p-logoriotlogo

La ligge..

knockout

angularjs-86a39bb56f1a6a9e1fa7bf2fcba28afe

Anbefalte lenker

https://github.com/njaal/js-frameworks-example
Vår implementasjon av inputfelt eksempelet med de ulike rammeverkene/bibliotekene

https://vuejs.org/guide/comparison.html
Fin oversikt som sammenligner vue med andre rammeverk

https://vuejs.org/guide/ssr.html
Hvordan gjøre isomorfi/Server Side Rendering med VUE

https://www.lullabot.com/articles/what-is-an-isomorphic-application
Eksempel på isomorfisk applikasjon

http://stefankrause.net/js-frameworks-benchmark4/webdriver-ts/table.html
Performance overview over de fleste rammeverk

https://www.youtube.com/watch?v=6I_GwgoGm1w
Rob Eisenberg sin talk: Choosing a JavaScript framework

 

Njaal Almestad Gjerde
Frontend fagansvarlig


 @njaalG

Bjørn Vegard Thoresen
.NET/frontend utvikler

 @bvst89

 

Legg igjen en kommentar

Fyll inn i feltene under, eller klikk på et ikon for å logge inn:

WordPress.com-logo

Du kommenterer med bruk av din WordPress.com konto. Logg ut / Endre )

Twitter picture

Du kommenterer med bruk av din Twitter konto. Logg ut / Endre )

Facebookbilde

Du kommenterer med bruk av din Facebook konto. Logg ut / Endre )

Google+ photo

Du kommenterer med bruk av din Google+ konto. Logg ut / Endre )

Kobler til %s