Я столкнулся с периодической проблемой: отредактированное сообщение успешно сохраняется, но уже отрендеренное сообщение в DiscourseHub на iOS иногда остаётся устаревшим, пока я не обновлю тему.
Окружение
Продакшен-сайт — это моя собственная самохостинговая установка Discourse, которую я использую в личных целях как личный архив для учёбы.
В момент, когда я воспроизвёл проблему сегодня:
- Клиент: DiscourseHub на iPhone
- iOS: 27.0.1
- Продакшен Discourse:
v2026.10.0-latest +112 - Сайт: самохостинг, личный архив для учёбы
- Браузер по умолчанию на iOS: iCab Mobile
Я сменил браузер по умолчанию на iCab Mobile из-за не связанной с этим проблемы с локальными загрузками. Однако это воспроизведение произошло, когда я использовал сайт Discourse внутри DiscourseHub, а не после открытия внешнего браузера, поэтому на данный момент я не считаю, что выбор браузера по умолчанию имеет значение.
Реальный рабочий процесс
Тема, где я заметил это, содержала примерно 50 сообщений, представляющих собой слайды лекций.
Мой обычный рабочий процесс:
- создать сообщение с изображением слайда лекции;
- позже последовательно пройти по теме;
- отредактировать каждое существующее сообщение;
- добавить транскрипт OCR / заметки под уже опубликованным изображением слайда;
- нажать Сохранить редактирование и перейти к следующему слайду.
Так что это не синтетические быстрые правки: это нормальный учебный рабочий процесс, в котором я последовательно добавляю транскрипты OCR к сообщениям с изображениями слайдов лекций.
Для более ранних сообщений в теме нажатие Сохранить редактирование сразу заменяло отображаемое сообщение на новый отредактированный контент, как и ожидалось.
Позже в той же теме я столкнулся с случаями, когда:
- Я отредактировал сообщение и добавил текст OCR.
- Нажал Сохранить редактирование.
- Редактирование успешно сохранилось.
- Сообщение, отображаемое в DiscourseHub, осталось со старым контентом.
- Обновление страницы сразу показало уже сохранённое редактирование.
Таким образом, само редактирование, похоже, прошло успешно. Устаревшая часть, похоже, связана с уже загруженным клиентским представлением сообщения.
Тест в среде разработки
Затем я создал полностью чистый экземпляр разработки из текущего upstream main:
833e1576d47 DEV: Update README.md note on self-hosting (#44320)
Я сгенерировал тему с 60 сообщениями, в каждом из которых было изображение, чтобы имитировать структуру продакшен-темы.
Затем я повторил рабочий процесс в Firefox на Linux, редактируя текст в существующих сообщениях с изображениями.
Сначала я заметил возможное устаревшее обновление около сообщения 19 в первом тесте. Однако, после более тщательного повторения эксперимента — включая создание новой темы с 60 сообщениями и последовательное редактирование сообщений — мне не удалось воспроизвести продакшен-поведение в Firefox/Linux на текущем main.
Там редактирования сразу перерисовывали сообщение после нажатия «Сохранить редактирование», включая случаи далеко за пределами первой группы сообщений в теме.
Это снижает мою уверенность в том, что пагинация темы или обычный поток из 20 сообщений является самой причиной.
Следующий тест
Продакшен-воспроизведение было в DiscourseHub на iOS, а не в PWA на домашнем экране.
Поэтому моим следующим запланированным сравнением будет:
- текущий экземпляр разработки Discourse из upstream;
- та же тема с 60 изображениями;
- тот же iPhone с iOS 27.0.1;
- сначала DiscourseHub;
- Safari на том же iPhone в качестве контроля;
- опционально веб-приложение на домашнем экране как ещё одно сравнение;
- последовательное редактирование сообщений с использованием того же рабочего процесса в стиле OCR.
В данный момент мой ноутбук для разработки находится в сети eduroam, поэтому прямое подключение его локального сервера разработки к iPhone не является простым делом.
Является ли запуск экземпляра разработки с текущим main на том же iPhone в DiscourseHub правильным следующим шагом для сужения области поиска?
Если да, то есть ли предпочтительный способ, который команда Discourse использует для подключения локального экземпляра разработки к iPhone / DiscourseHub для тестирования, желательно по HTTPS?
При следующем возникновении проблемы я также могу оставить устаревшее сообщение без обновления и сделать видеозапись экрана, чтобы можно было напрямую сравнить успешное сохранение/состояние сервера с тем, что отображает уже открытый клиент DiscourseHub.
Возможно, связанное наблюдение
Это поведение на высоком уровне напоминает проблему с устаревшим состоянием клиента, с которой я столкнулся, работая над
PR #43285, «Обновление дат событий в списках тем».
Там был другой путь кода, и я не утверждаю, что это та же ошибка.
Однако наблюдаемый сбой был похож: состояние на стороне сервера могло быть правильным, в то время как уже загруженный клиент продолжал отображать устаревшее состояние, пока не произошло соответствующее обновление/повторное гидратирование.
С проблемой с датами событий мне удалось наблюдать ситуацию A/B на разных уже открытых клиентах в зависимости от времени.
Это заставляет меня задуматься, не находится ли эта проблема с редактированием где-то в цепочке уведомлений / обновления модели / рендеринга, а не в самом сбое редактирования.