Проблема с использованием Google Analytics с Require.js

Я использую require.js (http://requirejs.org/) для ряда функций на своем сайте и пока вроде работает хорошо. Однако я столкнулся с проблемой при попытке включить код Google Analytics. Код, похоже, отказывается добавлять utm.gif и не отправляет маяк в Google. Мне интересно, если это вещь масштаба.

define(function() {
    var Analytics = {};
    Analytics.Apply = function() {
    var _gaq = _gaq || [];
    _gaq.push(['_setAccount', 'UA-XXXXX-X']);
    _gaq.push(['_trackPageview']);

    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
}
return Analytics;
});

ga.debug не выдает ошибок, а utm.gif не появляется. Если я перемещаю код за пределы require.js (под этим я подразумеваю модульный javascript, использующий require.js, поэтому просто добавляю его на страницу), utm.gif успешно добавляется на страницу, и ga.debug отправляет свой маяк.

Я нашел этот сайт, который, кажется, успешно его использует, но я не уверен, что этот сайт делает по-другому: http://paceyourself.net/2011/05/14/managing-client-side-javascript-with-requirejs/

Кто-нибудь еще сталкивался с проблемами при объединении require.js и GA?


person boolean    schedule 25.07.2011    source источник
comment
Так что, похоже, это проблема масштаба. При использовании кода:   -  person boolean    schedule 26.07.2011
comment
(Бах, я действительно хотел бы, чтобы ввод дал новую строку, а Shift + ввод опубликовал, а не наоборот ... и поле комментариев съело все мои разрывы строк!) Так что это, кажется, проблема области. При использовании кода: require([jquery], function ($) { var foo = require('bar'); }); console.log(foo); Я не могу получить доступ к 'foo'. Я думаю, что с точки зрения javascript это имеет смысл, поскольку foo существует только в рамках требования. Однако я подозреваю, что при создании ga.js он ищет _gaq, который не может быть найден, поскольку он требуется. Какие-нибудь мысли?   -  person boolean    schedule 26.07.2011
comment
Ну, я почти уверен, что это невозможно прочитать.   -  person boolean    schedule 26.07.2011


Ответы (5)


Ни один из других ответов мне не помог, но мне удалось найти то, что действительно работает, после прочтения Google Analytics документация.

в вашем основном app.js

requirejs.config({
    paths: {
        ga: '//www.google-analytics.com/analytics'
    }
});

requirejs(['analytics'], function () {
    ...
});

в своем собственном файле analytics.js:

define(['ga'], function () {
    window.ga('create', 'UA-XXXXXX-1');
    window.ga('send', 'pageview');
});

Это работает, потому что requirejs гарантирует, что к моменту выполнения функции analytics.js завершит загрузку. Это означает, что функция window.ga готова принимать команды.

person murrayju    schedule 12.07.2013
comment
Скажите, пожалуйста, почему именно window.ga, а не только ga? - person Vedavyas Bhat; 24.06.2015
comment
На самом деле, просто чтобы было ясно, что мы используем глобальный. Аналитический код Google не регистрируется как модуль AMD, поэтому у нас нет другого способа сослаться на него. Возможно, можно использовать прокладку RequireJS, я не могу вспомнить, пробовал ли я это или нет. - person murrayju; 25.06.2015

Просмотрите эту тему группы requirejs, чтобы обсудить эту проблему.

person jrburke    schedule 26.07.2011

Для последней версии Google Analytics фрагмент кода, который я использую с RequireJS, выглядит так:

<script>
  window.GoogleAnalyticsObject = 'ga';
  window.ga = { q: [['create', 'UA-40327700-1', 'jspm.io'], ['send', 'pageview']], l: Date.now() };
  require(['http://www.google-analytics.com/analytics.js']);
</script>
person guybedford    schedule 21.04.2013

Вот так:

define([ 'http://www.google-analytics.com/ga.js' ], function ( ga ) {
    ga = { q: [['create', 'UA-18710277-1', 'jspm.io'], ['send', 'pageview']], l: Date.now() };
});

Это модуль, который я сейчас использую, совет @user2305274

person DigitalDesignDj    schedule 30.05.2013

Другие решения не работали для меня при использовании более новой версии analytics.js. Непосредственное указание URL-адреса в качестве зависимости не сработало, потому что requirejs не смог определить, когда скрипт завершил загрузку. У меня тоже не работает асинхронный плагин для requirejs (хотя я использую его для API карт Google).

У меня сработал следующий подход:

define(function (require) {

  var module;

  // Setup temporary Google Analytics objects.
  window.GoogleAnalyticsObject = "ga";
  window.ga = function () { (window.ga.q = window.ga.q || []).push(arguments); };
  window.ga.l = 1 * new Date();

  // Immediately add a pageview event to the queue.
  window.ga("create", "{{TrackingID}}", "{{Domain}}");
  window.ga("send", "pageview");

  // Create a function that wraps `window.ga`.
  // This allows dependant modules to use `window.ga` without knowingly
  // programming against a global object.
  module = function () { window.ga.apply(this, arguments); };

  // Asynchronously load Google Analytics, letting it take over our `window.ga`
  // object after it loads. This allows us to add events to `window.ga` even
  // before the library has fully loaded.
  require(["http://www.google-analytics.com/analytics.js"]);

  return module;

});
person Ishmael Smyrnow    schedule 16.08.2013