50 votes

Quel est le nom du modèle de conception async de Google Analytics et où est-il utilisé?

Google Analytics async code utilise une conception très distincte de modèle pour l'exécution de code javascript.

Le code dépend d'une bibliothèque et il ne sait pas si la bibliothèque est chargé ou non. Si la bibliothèque ne se charge pas et pourtant il vient de files d'attente de toutes les commandes dans un Tableau d'objet. Lorsque la bibliothèque charge, il crée simplement le _gaq objet et exécute toutes les commandes dans la séquence, il a été inclus. Il remplace ensuite la fonction push aussi, les futures commandes sont exécutées immédiatement.

L'idée est de rendre l'exécution des commandes très rapide quand ils sont mis en file d'attente. Le code n'est vraiment évalué plus tard, lorsque la bibliothèque est chargé.

Ils ont également la charge de la bibliothèque avec les paramètres async=true. Cela provoque presque pas d'impact réel sur la page de chargement.

Les commandes sont semblables à la synchronisation des versions, mais la première chaîne est le nom d'une fonction et les paramètres suivants sont les paramètres de la fonction. Vous pouvez également pousser des fonctions dans ce tableau et les fonctions seront exécutées dans l'ordre, aussi bien avec une valeur null contexte. Donc, si vous avez besoin de faire quelque chose synchrone avec la bibliothèque, vous pouvez pousser une fonction pour faire cela à l'intérieur de _gaq.

Je pense que c'est un très habile solution mais je ne l'ai jamais vu avant. Personne ne sait le nom de ce modèle de conception ou lorsqu'il est utilisé en outre le code de suivi Google Analytics?

49voto

Yahel Points 21516

J'ai réfère à elle comme "asynchrone fonction file d'attente", mais ce n'est pas tout à fait un nom accrocheur, et certainement pas le nom officiel de modèle de conception.

Ce qui est intéressant, c'est que, si je n'avais pas vu ce modèle avant, depuis que Google l'a adopté pour Google Analytics, il a été largement adopté par les différentes plates-formes de recherche pour choper la asynchrones jus (Disqus vient à l'esprit.)

Ce blog est le plus examen en profondeur de l'asynchrone de Google Analytics syntaxe que j'ai lu, et inclut une très explication détaillée de la façon dont l'on peut reproduire le schéma:

Depuis le post de blog:

var GoogleAnalyticsQueue = function () {

    this.push = function () {
        for (var i = 0; i < arguments.length; i++) try {
            if (typeof arguments[i] === "function") arguments[i]();
            else {
                // get tracker function from arguments[i][0]
                // get tracker function arguments from arguments[i].slice(1)
                // call it!  trackers[arguments[i][0]].apply(trackers, arguments[i].slice(1));
            }
        } catch (e) {}
    }

    // more code here…
};

// get the existing _gaq array
var _old_gaq = window._gaq;

// create a new _gaq object
window._gaq = new GoogleAnalyticsQueue();

// execute all of the queued up events - apply() turns the array entries into individual arguments
window._gaq.push.apply(window._gaq, _old_gaq);

Il note également que, même si pas beaucoup de navigateurs prennent en charge l' async d'attribut, la méthode d'injection utilisé rend le script de charger de manière asynchrone dans la plupart des navigateurs, et comprend un utile tableau:

enter image description here

3voto

Raynos Points 82706

Ca fais pousser des données dans un tableau global

var _qaq = _qaq || [];
_qaq.push(stuff);

Il permet essentiellement de mettre en tampon les données pour les traiter avant de la bibliothèque est chargé.

La raison principale de ce modèle n'est pas beaucoup utilisé, c'est que d'autres bibliothèques en général ont besoin de ressources pour charger avant de pouvoir faire quoi que ce soit. Il n'aurait pas de sens pour commencer la mise en mémoire tampon jQuery commandes.

Ce n'est pas un modèle, il est tout simplement de stocker des données dans la portée globale et de dire que c'est quelqu'un elses d'emploi de ce processus, je n'aime pas quand vous le traiter.

Cependant c'est une façon intelligente de faire face avec le fait que vous ne savez pas quand quelque chose est chargé ou de prêt, l'alternative est un DOMReady bloc.

3voto

Open SEO Points 1059

Un bon writeup javascript au chargement de stratgies est disponible ici http://friendlybit.com/js/lazy-loading-asyncronous-javascript/

Et autant que je me souvienne, ga.js async syntaxe a été inspiré par Steve Souders. Vous pouvez regarder ControlJS , l'un de ses projets

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X