@Renhor

Как полностью уничтожить сложный объект из памяти (онлайн чат Tawk.to + Nuxt)?

Я использую Nuxt с SSR и встроил на сайт онлайн чат поддержки Tawk.to, который по дефолту не обладает API для обновления текущего местоположения пользователя на сайте (то есть, на не SPA сайтах все прекрасно будет работать, так как при каждой загрузке страницы объект чата заного создается).

То есть, на обычных сайтах при смене страницы, в дешборде чата отображается страница, на которую перешел пользователь в лайв режиме, а при SSR чат инициализируется единожды и не обновляет текущий роут пользователя.

Пока я пришел к выводу, что при смене роута, раз нет официального метода .desctroy() или .update(), необходимо собственноручно уничтожить объект чата.

methods: {
  startTawk() {
    var Tawk_API = Tawk_API || {}, Tawk_LoadStart = new Date();
    let el = this.$el;

    (function () {
      var s1 = document.createElement("script"),
        s0 = document.createElement("div"),
        body = document.querySelector("body");

      s0.classList.add("TAWK_SCRIPT_CONTAINER");
      s0.appendChild(s1);
      s1.async = true;
      s1.src = 'https://embed.tawk.to/XXXXXXXXXXXX/default';
      s1.charset = 'UTF-8';
      s1.setAttribute('crossorigin', '*');
      body.appendChild(s0);
    })();
  },
  destroyTawk() {
    let tawk = document.querySelector("body div > iframe");
    let script = document.querySelector(".TAWK_SCRIPT_CONTAINER");

    if (!tawk || !script) {
      console.log('Tawk not found');
    } else {
      tawk = tawk.parentNode;

      script.parentNode.removeChild(script);
      tawk.parentNode.removeChild(tawk);

      delete window.$_Tawk;
      delete window.$_Tawk_AccountKey;
      delete window.$_Tawk_Unstable;
      delete window.$_Tawk_WidgetId;
      delete window.$__TawkEngine;
      delete window.$__TawkSocket;
      delete window.TawkClass;
      delete window.Tawk_API;
    }
  }
},
watch: {
  '$route.path': function () {
    this.destroyTawk();
    this.startTawk();
  }
}


При таком раскладе все начинает работать, но естественно начинает забиваться память (примерно по 20мб за смену роута). Насколько я помню, что бы уничтожить объект из памяти, необходимо, что бы были потеряны все ссылки на объект, а таким удалением я явно не удаляю ссылки.

Что можно сделать? Есть решение, кроме того, что надо стучать в поддержку (что сделано, но они не отвечают, а реализация - горит)?
  • Вопрос задан
  • 57 просмотров
Пригласить эксперта
Ответы на вопрос 2
locky_yotun
@locky_yotun Куратор тега JavaScript
Я видел некоторый джаваскрипт
По идее ваш delete должен делать то же, что и присвоение null (я имею в виду — с точки зрения памяти) — но это не точно.
Вот тут больше информации: https://learn.javascript.ru/memory-management

А вообще — зачем каждый раз при смене роута что-то вообще пересоздавать — разве нельзя использовать единожды созданный объект на всех роутах?
Ответ написан
Robur
@Robur
Знаю больше чем это необходимо
если где-то сохранится ссылка на один из этих объектов то delete не поможет.
даже если её и нет - то при delete память не освободится сразу, а в какой-то рандомный момент времени
В целом - вы не контролируете распределение памяти и единственный способ точно убедиться что объект удален - это попрофилировать руками, запуская сборщик мусора и убедившись что объекты этой либы реально удаляются.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы