2017-01-23 12 views
4

У меня есть Aurelia CLI приложения, в котором я пытаюсь включить де Google Tag Manager скриптыДиспетчера тегов Google, requirejs и Аурелия C

<head> 
    <!-- Google Tag Manager --> 
    <!--<script> 
     var dataLayer = []; 
     dataLayer.push({ 'event': 'hixo' }); 
    </script> 
    <script> 
     (function (w, d, s, l, i) { 
      w[l] = w[l] || []; w[l].push({ 
       'gtm.start': 
        new Date().getTime(), event: 'gtm.js' 
      }); var f = d.getElementsByTagName(s)[0], 
        j = d.createElement(s), dl = l != 'dataLayer' ? '&l=' + l : ''; j.async = true; j.src = 
      'https://www.googletagmanager.com/gtm.js?id=' + i + dl; f.parentNode.insertBefore(j, f); 
     })(window, document, 'script', 'dataLayer', 'GTM-PLSZRC'); 
    </script>--> 
    <!-- End Google Tag Manager --> 
</head> 

Но как только я запустить приложение, я получаю следующую ошибку requirejs:

"Mismatched anonymous define() modules" 

Aurelia CLI использует requirejs, но она полностью абстрагируется так, где и как я должен определить сценарий диспетчера тегов Google, так что она не обрабатывается как анонимный модуль?

ответ

2

Когда вы используете dataLayer.push() в первый раз после загрузки скрипта менеджера тегов google, GTM загрузит дополнительные скрипты. Эти скрипты загружаются асинхронно, поэтому эти скрипты завершат загрузку после загружен пакет aurelia-cli (и requirejs, который находится внутри этого пакета). Вот почему RequireJS жалуется на анонимную ошибку определения, даже если тег GTM-скрипта включен до пакет aurelia-cli.

Один из сценариев, загружаемых Диспетчером тегов Google, - Fingerprint2 от this URL. В настоящее время это версия 1.4.1 Fingerprint2, а в репозитории GitHub есть this issue, в котором упоминается одна и та же ошибка Mismatched anonymous define(). Кажется, он исправлен this PR, но поскольку Диспетчер тегов Google загружает Fingerprint2 (и мы не можем переопределить это поведение), нам нужно обходное решение, чтобы заставить его работать.

Обойти это загрузить Fingerprint2 себя синхронно с помощью тега сценария, а затем сказать RequireJS игнорировать ошибку Mismatched anonymous define() происходящий от Google загрузки Диспетчера тегов Fingerprint2 во второй раз:

<script src="http://www.clickcease.com/monitor/stat.js"></script> 
<script src="scripts/vendor-bundle.js" data-main="aurelia-bootstrapper"></script> 
<script> 
    requirejs.onError = function (err) { 
    if (err.message.indexOf('Fingerprint2') === -1) { 
     throw err; 
    } 
    }; 
</script> 

Надеюсь Clickcease обновит свою версию Fingerprint2 скоро, чтобы это обходное решение больше не понадобилось.