Warum verschiebt das Segment.io Loader-Skript die Namen / Argumente der Methode in eine Warteschlange, die scheinbar überschrieben wird?

8

Ich habe das folgende Code-Snippet analysiert, mit dem das Analyse-Wrapper-Skript Segment.io asynchron geladen wird:

%Vor%

Es ist gut kommentiert und ich kann sehen, was es tut, aber ich bin verwirrt, wenn es um die Funktion methodFactory geht, die Details (Methodenname und Argumente) von Methodenaufrufen vor dem Haupt-Skript analytics.js schiebt wurde in das globale analytics -Array geladen.

Das ist alles gut und gut, aber wenn / wenn das Hauptscript geladen wird, überschreibt es anscheinend nur die globale Variable analytics (siehe letzte Zeile hier ), so dass alle Daten verloren gehen.

Ich sehe, wie dies Skriptfehler in einer Webseite verhindert, indem Methoden herausgedrückt werden, die noch nicht existieren, aber ich verstehe nicht, warum die Stubs nicht einfach eine leere Funktion zurückgeben können:

%Vor%

Was vermisse ich? Bitte, hilf mir zu verstehen!

    
Mark Bell 13.02.2013, 17:11
quelle

1 Antwort

22

Ich bin hier, Mitbegründer von Segment.io - Ich habe diesen Code eigentlich nicht geschrieben, Calvin, aber ich kann Ihnen sagen, was er tut.

Sie haben Recht, methodFactory stempelt die Methoden aus, so dass sie verfügbar sind, bevor das Skript geladen wird. Das bedeutet, dass Leute analytics.track aufrufen können, ohne diese Aufrufe in einen if oder ready() -Aufruf zu verpacken.

Aber die Methoden sind eigentlich besser als "dumme" Stubs, da sie die Methode speichern, die aufgerufen wurde, damit wir die Aktionen später wieder abspielen können. Das ist dieser Teil:

%Vor%

Um das besser lesbar zu machen:

%Vor%

Es wird der Name der Methode, die aufgerufen wurde, angeheftet, was bedeutet, dass, wenn ich analytics.identify('userId') , unsere Warteschlange tatsächlich ein Array wie folgt aussieht:

%Vor%

Wenn unsere Bibliothek dann geladen wird, werden alle in der Warteschlange befindlichen Aufrufe entladen und in die realen Methoden (die jetzt verfügbar sind) übertragen, so dass alle vor dem Laden aufgezeichneten Daten noch erhalten bleiben. Das ist der Schlüssel, denn wir wollen keine Anrufe einfach wegwerfen, bevor unsere Bibliothek geladen werden kann. Das sieht so aus:

%Vor%

analytics ist eine lokale Variable an diesem Punkt, und nachdem wir die Wiedergabe beendet haben, ersetzen wir das globale durch das lokale analytics (was der wahre Deal ist).

Ich hoffe, das macht Sinn. Wir werden in unserem Blog eine Reihe von kleinen Tricks für Javascript von Drittanbietern veröffentlichen, also könntest du das bald herausfinden!

    
Ian Storm Taylor 19.02.2013, 19:09
quelle