Forstå flytende APIer i JavaScript

Mens du designer Babylon.js v2.0(et bibliotek for å bygge 3D på nettet), fant jeg nylig at jeg ønsket at flere APIer var flytende-det vil si, at samfunnet lettere kunne lese, forstå og bygge på arbeidet mens du bruker mindre tid i teknisk doktorgrad. 

I denne opplæringen går jeg gjennom flytende APIer: hva du skal vurdere, hvordan du skriver dem, og implikasjoner for nettleserens ytelse. 

Hva er en flytende API?

EN flytende API, som nevnt av denne Wikipedia-artikkelen, er en implementering av en objektorientert API som har som mål å gi mer lesbar kode. JQuery er et godt eksempel på hva en flytende API lar deg gjøre:

 $ ('
') .html ("Fluent API er kult!") .addClass ("header") .appendTo ("body");

Den flytende API lar deg kjedefunksjonssamtaler ved å returnere dette objektet.

Vi kan enkelt lage en flytende API slik:

var MyClass = funksjon (a) this.a = a;  MyClass.prototype.foo = funksjon (b) // Gjør noe komplekst arbeid this.a + = Math.cos (b); returnere dette; 

Som du kan se, handler det bare om å returnere dette objekt (referanse til gjeldende forekomst i dette tilfellet) for å tillate kjeden fortsette.

Hvis du ikke er klar over hvordan "dette" søkeordet fungerer i JavaScript, anbefaler jeg å lese denne flotte artikkelen av Mike West.

Vi kan da ringe anrop:

var obj = ny MyClass (5); obj.foo (1) .foo (2) .foo (3);

Før jeg prøvde å gjøre det samme med Babylon.js, ønsket jeg å være sikker på at dette ikke ville generere noen ytelsesproblemer.

Hva om ytelse?

Så jeg gjorde et referanseindeks!

var teller = 10000000; var MyClass = funksjon (a) this.a = a;  MyClass.prototype.foo = funksjon (b) // Gjør noe komplekst arbeid this.a + = Math.cos (b); returnere dette;  MyClass.prototype.foo2 = funksjon (b) // Gjør noe komplekst arbeid this.a + = Math.cos (b);  var start = ny dato (). getTime (); var obj = ny MyClass (5); obj.foo (1) .foo (2) .foo (3); for (var indeks = 0; indeks < count; index++)  obj.foo(1).foo(2).foo(3);  var end = new Date().getTime(); var start2 = new Date().getTime(); var obj2 = new MyClass(5); for (var index = 0; index < count; index++)  obj2.foo2(1); obj2.foo2(2); obj2.foo2(3);  var end2 = new Date().getTime(); var div = document.getElementById("results"); div.innerHTML += obj.a + ": With return this: " + (end - start) + "ms
"; div.innerHTML + = obj2.a +": Uten returnere dette: "+ (end2 - start2) +" ms ";

Som du kan se, foo og foo2 gjør akkurat det samme. Den eneste forskjellen er det foo kan kjedes mens foo2 kan ikke.

Åpenbart er anropskjeden forskjellig mellom:

obj.foo (1) .foo (2) .foo (3);

og

obj2.foo2 (1); obj2.foo2 (2); obj2.foo2 (3);

Gitt denne koden, kjørte jeg den på Chrome, Firefox og IE for å avgjøre om jeg må bekymre meg om ytelse.

Og her er resultatene jeg fikk:

  • Chrome, den vanlige API er 6% tregere enn flytende API.
  • Firefox, begge APIene kjører i nesten samme hastighet (flytende API er 1% langsommere).
  • DVS, begge APIene kjører i nesten samme hastighet (flytende API er 2% langsommere).

Saken er at jeg la til en operasjon i funksjonen (Math.cos) for å simulere noen form for behandling utført av funksjonen.

Hvis jeg fjerner alt og bare beholder komme tilbake uttalelse, på alle nettlesere er det ingen forskjell (faktisk bare en eller to millisekunder for 10.000.000 prøver). Du kan teste dette selv over nettleserne. Og hvis du ikke har enhetene hendige, er det nok av gratis verktøy på dev.modern.IE. Bare ikke prestasjon test en virtuell maskin mot en ekte enhet. 

Så min konklusjon er: Det er en tur!

En flytende API er flott. Den produserer mer lesbar kode, og du kan bruke den uten problem eller ytelsestap! 

Flere hands-on med JavaScript

Det kan kanskje overraske deg litt, men Microsoft har en mengde gratis læring på mange JavaScript-temaer med åpen kildekode, og vi har et oppdrag å skape mye mer med Microsoft Edge. Sjekk ut min egen:

  • Introduksjon til WebGL 3D med HTML5 og Babylon.JS
  • Bygg en enkeltside applikasjon med ASP.NET og AngularJS
  • Skjærekantgrafikk i HTML

Eller vårt lags læringsserie:

  • Praktiske ytelsestips for å gjøre HTML / JavaScript raskere (en syvdelte serie fra lydhør design til uformelle spill til ytelsesoptimalisering)
  • Den moderne webplattformen Jump Start (grunnleggende for HTML, CSS og JavaScript)
  • Utvikle Universal Windows App med HTML og JavaScript Jump Start (bruk JS du allerede har opprettet for å bygge en app)

Og noen gratis verktøy: Visual Studio Community, Azure Trial, og tverrbrowser testing verktøy for Mac, Linux eller Windows.

Denne artikkelen er en del av web dev-teknologiserien fra Microsoft. Vi er glade for å dele Microsoft Edge og den nye EdgeHTML rendering motor med deg. Få gratis virtuelle maskiner eller test eksternt på Mac, IOS, Android eller Windows-enheten @ http://dev.modern.ie/.