Запуск Raygun.io с Angular Universal - PullRequest
       44

Запуск Raygun.io с Angular Universal

0 голосов
/ 15 октября 2019

Я добавляю Raygun.io APM в наше приложение Angular 8 с Angular Universal.

Известно, что raygun.io имеет библиотеку JavaScript на стороне клиента и добавляет ее в Angular with Universal, DOMAPI окна должен быть создан. Это можно сделать с помощью domino npm, используя следующий код:

Существует также руководство по установке Angular через npm под названием raygun4js, однако проблема все еще существует.

// Domino for defining Windows API in SSR 
(found @ https://www.npmjs.com/package/domino )

const domino = require('domino');
const fs = require('fs');
const path = require('path');
const template = fs.readFileSync(index.html).toString();
const win = domino.createWindow(template);

global['window'] = win; // will be used for NodeJS to read Window API
global['document'] = win.document;

* domino создаетокно API и устанавливает его в глобальный с именем win. После добавления этой строки в проект NPM server.ts, выполните команду build and run - найдено исключение:

  Raygun.Utilities = raygunUtilityFactory(window, Raygun);
  ^

ReferenceError: raygunUtilityFactory is not defined

Это означает, что функция raygunUtilityFactory не определена в оконном API. Заглянув внутрь raygun.js в Github

window.raygunUtilityFactory = function(window, Raygun) {
  var rg = {
    getUuid: function() {
      function _p8(s) {
        var p = (Math.random().toString(16) + '000000000').substr(2, 8);
        return s ? '-' + p.substr(0, 4) + '-' + p.substr(4, 4) : p;
      }

 // more code.....

Вопрос в том, как NodeJS может читать raygunUtilityFactory функцию во время сборки, если она не может найти ее в оконном API?

ОБНОВЛЕНИЕ: Я пыталсячтобы сделать это в меньшем проекте, но кажется, что даже его документ для установки raygun.io не содержит процедур для Angular Universal. Он в основном не может обнаружить оконный API, используя domino

  Raygun.Utilities = raygunUtilityFactory(window, Raygun);
  ^

ReferenceError: raygunUtilityFactory is not defined

1 Ответ

0 голосов
/ 28 октября 2019

Ответ: Установка Raygun js в качестве глобального объекта и привязка его к объявленной переменной внутри службы.

Ссылка: https://hackernoon.com/how-to-use-javascript-libraries-in-angular-2-apps-ff274ba601af

declare var rg4js: any;

* поместите это внутри вашегослужбы или вашего основного компонента ts.

<script type="text/javascript">
  !function(a,b,c,d,e,f,g,h){a.RaygunObject=e,a[e]=a[e]||function(){
  (a[e].o=a[e].o||[]).push(arguments)},f=b.createElement(c),g=b.getElementsByTagName(c)[0],
  f.async=1,f.src=d,g.parentNode.insertBefore(f,g),h=a.onerror,a.onerror=function(b,c,d,f,g){
  h&&h(b,c,d,f,g),g||(g=new Error(b)),a[e].q=a[e].q||[],a[e].q.push({
  e:g})}}(window,document,"script","//cdn.raygun.io/raygun4js/raygun.min.js","rg4js");
</script>

* добавьте это в ваш index.html или загрузите и добавьте в свой проект.

Обратите внимание, что сценарий raygun должен бытьупоминается как rg4js. Angular автоматически узнает, что rg4js внутри вашего файла TS является ссылкой на ваш тег сценария raygun.

- теперь я могу видеть отчеты о сбоях и мониторинг импульсов на нашей клиентской панели. Однако я заметил, что все журналы ошибок на стороне клиента не перехватываются. Я все еще исследую способ отправки этих необработанных ошибок - начиная с windows.onerror.

...