Хороший вопрос, пришлось даже перечитать код шеринга внимательнее, чем во время самого инцидента:))
Да, в доках этот акцент есть, и singleton у нас в итоге стоит, правда появился он уже после разбора. Сама же ситуация сложилась буднично — shared‑конфиг писался, когда локатор vue в lockfile был один. Второй появился позже вместе со свежим диапазоном в одном из workspace‑пакетов, а вложенными копии легли потому, что хойстингу в корень мешает пин Vue 2 у легаси‑хоста. Подсветить дубль при этом некому, установка и сборка на него не жалуются, вот он и дожил тихо до первого инцидента.
Singleton же и в теории не про эту засаду, потому что весь его вклад ограничен выбором версии, которую share scope отдаст потребителю. По‑настоящему singleton влияет лишь на случай, когда в scope к моменту резолва уже лежит загруженная версия — тогда он возьмёт её даже при несовпадении диапазона и ограничится предупреждением в консоли, поэтому страница не повиснет, зато приложение получит чужую мажорную версию и вероятно, тихо сломается позже.
От самой засады лечит только отсутствие второй копии, а singleton у нас стоит скорее как страховка, а не как решение.
Да, всё так. Страница на Symfony + jQuery, ей много лет, она рабочая и никто её не останавливает. Vue 3 монтируется отдельными блоками в размеченные точки внутри неё: форма остаётся легаси и уходит в обычный сабмит, новые куски интерфейса рисует Vue.
Vue 2 из прошлой волны миграции с той же страницы тоже никуда не делся. Три поколения в одном DOM, живут по соседству.
Звучит больно, согласен. Но работать приходится с тем, что есть: продукт живой, фичи не ждут, а роскоши остановиться и всё переписать никто не даёт. Мне кажется, такой зоопарк - судьба любого продукта старше десяти лет. Вопрос только в том, управляемый он или стихийный.
Ощущение справедливое, у меня самого оно было, когда я начинал работу над механизмом.
Сам мост - 57 строк: разобрать имя поля, положить значение в состояние, промолчать, если значение не изменилось. Всё остальное - это предохранители от циклов, и каждый из них появился после того, как цикл уже случился. Поэтому выглядит это довольно просто и разобраться не так сложно, как кажется.
Ещё уточнение, раз уж речь про соотношение цены и результата: под заказ там ничего не захардкожено. Состояние формы лежит в том же реестре, что и состояние обычных Vue 3-страниц, с той же подпиской и тем же трекингом изменений. Разбор имени поля работает с любой Symfony-формой, обратная запись - с любым путём.
Островки сейчас живут на трёх легаси страницах. Заказ был первым и остаётся самым тяжёлым: там легаси-код правит те же поля, что и Vue, поэтому нужен полный двусторонний контур. Механизм один и тот же, просто заказу от него нужно больше всех.
Про "можно было проще" - мне правда интересно, что бы вы сделали. Вводные: страницу переписать нельзя (считали, это год работы против двух месяцев на мост), новые блоки по бизнес-требованию видит только один сегмент клиентов, и часть легаси функционала остаётся хозяином некоторых полей - он продолжает их править, пока Vue рисует своё и работает с другой частью. Если при этих условиях есть решение короче, это будет лучший комментарий, который я мог бы получить =D
Хороший вопрос, пришлось даже перечитать код шеринга внимательнее, чем во время самого инцидента:))
Да, в доках этот акцент есть, и 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