Обновить
16K+
2
Karen Khachatryan@k_khachatryan

Пользователь

11
Рейтинг
Отправить сообщение

Хороший вопрос, пришлось даже перечитать код шеринга внимательнее, чем во время самого инцидента:))

Да, в доках этот акцент есть, и singleton у нас в итоге стоит, правда появился он уже после разбора. Сама же ситуация сложилась буднично — shared‑конфиг писался, когда локатор vue в lockfile был один. Второй появился позже вместе со свежим диапазоном в одном из workspace‑пакетов, а вложенными копии легли потому, что хойстингу в корень мешает пин Vue 2 у легаси‑хоста. Подсветить дубль при этом некому, установка и сборка на него не жалуются, вот он и дожил тихо до первого инцидента.

Singleton же и в теории не про эту засаду, потому что весь его вклад ограничен выбором версии, которую share scope отдаст потребителю. По‑настоящему singleton влияет лишь на случай, когда в scope к моменту резолва уже лежит загруженная версия — тогда он возьмёт её даже при несовпадении диапазона и ограничится предупреждением в консоли, поэтому страница не повиснет, зато приложение получит чужую мажорную версию и вероятно, тихо сломается позже.

От самой засады лечит только отсутствие второй копии, а singleton у нас стоит скорее как страховка, а не как решение.

Я примерно то же самое сказал, когда увидел в отладчике, как два consume-модуля vue зовут друг друга по кругу, только другими словами 🙂

Да, всё так. Страница на Symfony + jQuery, ей много лет, она рабочая и никто её не останавливает. Vue 3 монтируется отдельными блоками в размеченные точки внутри неё: форма остаётся легаси и уходит в обычный сабмит, новые куски интерфейса рисует Vue.

Vue 2 из прошлой волны миграции с той же страницы тоже никуда не делся. Три поколения в одном DOM, живут по соседству.

Звучит больно, согласен. Но работать приходится с тем, что есть: продукт живой, фичи не ждут, а роскоши остановиться и всё переписать никто не даёт. Мне кажется, такой зоопарк - судьба любого продукта старше десяти лет. Вопрос только в том, управляемый он или стихийный.

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

Сам мост - 57 строк: разобрать имя поля, положить значение в состояние, промолчать, если значение не изменилось. Всё остальное - это предохранители от циклов, и каждый из них появился после того, как цикл уже случился. Поэтому выглядит это довольно просто и разобраться не так сложно, как кажется.

Ещё уточнение, раз уж речь про соотношение цены и результата: под заказ там ничего не захардкожено. Состояние формы лежит в том же реестре, что и состояние обычных Vue 3-страниц, с той же подпиской и тем же трекингом изменений. Разбор имени поля работает с любой Symfony-формой, обратная запись - с любым путём.

Островки сейчас живут на трёх легаси страницах. Заказ был первым и остаётся самым тяжёлым: там легаси-код правит те же поля, что и Vue, поэтому нужен полный двусторонний контур. Механизм один и тот же, просто заказу от него нужно больше всех.

Про "можно было проще" - мне правда интересно, что бы вы сделали. Вводные: страницу переписать нельзя (считали, это год работы против двух месяцев на мост), новые блоки по бизнес-требованию видит только один сегмент клиентов, и часть легаси функционала остаётся хозяином некоторых полей - он продолжает их править, пока Vue рисует своё и работает с другой частью. Если при этих условиях есть решение короче, это будет лучший комментарий, который я мог бы получить =D

Информация

В рейтинге
768-й
Откуда
Липецк, Липецкая обл., Россия
Дата рождения
Зарегистрирован
Активность

Специализация

Фронтенд разработчик, Веб-разработчик
Средний
JavaScript
TypeScript
React
SOLID
Vue.js
Vite
GraphQL
Next.js
Webpack
Jest