Грядущие изменения 'use strict' в компонентах тем — темы ломаются после обновления Discourse

Я сейчас нахожусь на последней версии коммита (105634435f). Я обновляю Discourse примерно раз в неделю. Обычно никаких проблем не возникает. Но теперь несколько компонентов тем перестали загружаться. Под «не загрузились» я имею в виду, что компоненты больше не отображаются. Функция просмотра логов в панели администратора не показывает ничего необычного, что можно было бы связать с этой проблемой. Многие из этих ошибок кажутся случайными и наблюдаются уже в течение длительного времени. Например, редкие ошибки MimeType и таймауты при запросах DNS к Google — они тоже возникают редко.

Эти плагины перестали загружаться после обновления:

  • DiscoTOC
  • discourse gifs
  • Discourse Jitsi
  • Hamburger Theme Selector
  • Nav Links Component
  • Tag Icons

Работают только следующие:

  • Discourse Kanban
  • Easy Footer

Если потребуется дополнительная информация (я полагаю, что потребуется), я с радостью предоставлю её. Пожалуйста, дайте инструкции. Этот пост скорее служит сигналом о том, что что-то пошло не так, и проблема, вероятно, связана с недавними изменениями. Извините за недостаток информации…

Кроме того, объявления переменных в JavaScript без строгого режима, например:

xxx = 330;

вместо

var xxx = 330;

приводят к ошибкам JS «неопределённая переменная». Нам пришлось изменить все такие случаи в наших скриптах.

Да, в некоторых компонентах темы есть проблема, мы работаем над исправлением.

@pmusaraj Большое спасибо. Удачи!

Знаете ли вы, почему возникают ошибки для переменных JS, объявленных без строгого режима в компонентах? Это ошибка постобработки? Что-то изменилось здесь?

Изменение, вызвавшее эти проблемы, было отменено час назад. Если ваш сайт затронут, пожалуйста, обновитесь до последней версии.

Дополняя сказанное Фалько, изменение будет возвращено в ближайшие несколько дней, но перед этим я удостоверюсь, что все наши официальные темы и компоненты совместимы с этим изменением. Поэтому, если вы снова столкнётесь с проблемой в официальных темах или компонентах, её решение должно быть в их обновлении.

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

Приношу извинения за доставленные сегодня неудобства.

Одна из наших тем (баннерная тема) была полностью перезаписана до её исходного формата, и все внесённые нами изменения были утеряны. Обновлений для этой темы не было с 2018 года. Сможем ли мы вернуть изменения?

Хм, это действительно странно. Вы обновили свой инстанс, чтобы включить Revert "FEATURE: Introduce theme/component QUnit tests (#12517)" (#12… · discourse/discourse@2b9ab3a · GitHub? Можете немного подробнее объяснить, что вы имеете в виду под «начальным форматом»? Вы имеете в виду, что у вас были локальные изменения в JS/CSS темы, но теперь все эти изменения исчезли?

Объясняет ли это также проблему с определениями переменных в JavaScript? Если да, то как?

Я не думаю, что эта проблема связана с отменённой функцией. У меня был похожий случай с компонентом несколько недель назад, вероятно, в период, когда внедрялась функция индикатора форка (хотя это касается плагинов, так что, вероятно, тоже не имеет значения, но мне всё равно пришлось форкнуть компонент, чтобы внести изменения).

Это действительно странно, у нас никогда не было такой проблемы. Она появилась только с последней версией. И я хочу понять, что именно здесь происходит.

Это было сложное изменение, которое также затронуло «встроенный» (inline) JS в темах. Оно было отменено и будет переработано в ближайшие дни перед повторным внедрением. Подробную информацию можно найти по адресу: FEATURE: Introduce theme/component QUnit tests by OsamaSayegh · Pull Request #12517 · discourse/discourse · GitHub

Да, именно это изменение вызвало проблему, которую вы заметили в своей теме. Мне нужно немного подробнее рассказать о системе тем, чтобы объяснить, что произошло. Есть два способа добавить JavaScript в тему или компонент Discourse: первый использует теги <script type="text/discourse-plugin"> внутри файлов head_tag.html, а второй — отдельные файлы JavaScript, расположенные в директории javascripts вашей темы или компонента.

До моего сегодняшнего изменения JavaScript внутри этих специальных тегов обрабатывался с опорой на глобальную переменную Discourse, которая недоступна при разработке в Discourse с использованием Ember CLI. В изменении, которое я внес сегодня, я настроил Discourse так, чтобы он обрабатывал JavaScript внутри этих тегов так же, как и код из отдельных файлов. Это позволило нам отказаться от использования глобальной переменной Discourse.

Теперь одним из «побочных эффектов» такой обработки тегов JavaScript как файлов является то, что код внутри них теперь содержит директиву "use strict", которой раньше не было. Именно эта директива вызвала ошибки, которые вы увидели:

Я рекомендую вам сохранить все внесённые сегодня изменения в вашей теме, поскольку после того, как я верну своё изменение, теги JavaScript снова будут обрабатываться как отдельные файлы.

Да, это были просто ленивые определения в нашем коде, и после того как мы сделали их строгими, всё заработало как надо.

В любом случае, спасибо за подробное объяснение. Это, вероятно, будет полезно и другим.

Да, все изменения исчезли: от правок в CSS и JS до изменений текста :sweat: То есть моя тема вернулась к своему начальному формату с текстами вроде «Lorem ipsum dolor sit amet…». В любом случае я воспользуюсь резервной копией, но это странно, что такое произошло после обновления.

Привет @Pad_Pors,

Думаю, ваша проблема связана с этим. :slightly_smiling_face:

Что касается другой темы, о которой вы писали:

Похоже, вы давно не обновляли свой Discourse.