Из коробки crm используем "виджет на сайт", который пару месяцев как стал конфликтовать с парой сайтов, оба joomla, но версии разные, с разным набором модулей. Поддержка просто говорит о конфликте скриптов. Но все-таки провели расследование и ситуация такая вырисовывается.
Виджет коробки видимо пару месяцев как перешел на полный полифил видимо в свете упоминания в документации, что с 2019 года везде будут новые скрипты только ES6. Но если бы это была проблема страниц, показываемых коробкой, то и ладно, но включенный в конец body скрипт по сути перехватывает все, что только можно и начинает следовать стандарту ES6, как для своего кода, так и остального кода страницы.
Что в итоге. Оказалось, что в случае обоих сайтов, проблема как минимум возникла вокруг Array.from, если ему передан undefined. Судя по всем, это функция, которую изобрели в mootools, и ее в итоге перетащили в стандарт ES6. Но в mootools он по undefined всегда возвращал []. В битриксе этот полифил взят из библиотеки core-js, он сразу на параметр вызывает toObject, что предсказуемо по стандарту генерирует exception. Но не сомневаюсь, что за все время существования Array.from в mootools с таким поведением накопилось немало кода, который не расчитывает, что ему по undefined дадут в глаз, при этом часть этого кода находится внутри mootools. Из того, что я увидел у нас на сайтах, например, если используются классы в понимании mootools (... new Class ()...) и у класса не будет определена переименная Binds, то она пройдет через внутренний код mootools с вызовом Array.from(undefined)
Mootools 1.6, на фоне перехода Array.from в стандарт заменили на Array.convert вызовы. В принципе мы можем на сайтах попробовать на него заменить, но необдуманный upgrade крупной библиотеки может породить новые проблемы.
Другой вариант - мы можем попробовать подкорректировать все места, где может вызваться Array.from(undefined), но их может быть много и неявных. Поэтому вопросы такие возникают:
Виджет коробки видимо пару месяцев как перешел на полный полифил видимо в свете упоминания в документации, что с 2019 года везде будут новые скрипты только ES6. Но если бы это была проблема страниц, показываемых коробкой, то и ладно, но включенный в конец body скрипт по сути перехватывает все, что только можно и начинает следовать стандарту ES6, как для своего кода, так и остального кода страницы.
Что в итоге. Оказалось, что в случае обоих сайтов, проблема как минимум возникла вокруг Array.from, если ему передан undefined. Судя по всем, это функция, которую изобрели в mootools, и ее в итоге перетащили в стандарт ES6. Но в mootools он по undefined всегда возвращал []. В битриксе этот полифил взят из библиотеки core-js, он сразу на параметр вызывает toObject, что предсказуемо по стандарту генерирует exception. Но не сомневаюсь, что за все время существования Array.from в mootools с таким поведением накопилось немало кода, который не расчитывает, что ему по undefined дадут в глаз, при этом часть этого кода находится внутри mootools. Из того, что я увидел у нас на сайтах, например, если используются классы в понимании mootools (... new Class ()...) и у класса не будет определена переименная Binds, то она пройдет через внутренний код mootools с вызовом Array.from(undefined)
Mootools 1.6, на фоне перехода Array.from в стандарт заменили на Array.convert вызовы. В принципе мы можем на сайтах попробовать на него заменить, но необдуманный upgrade крупной библиотеки может породить новые проблемы.
Другой вариант - мы можем попробовать подкорректировать все места, где может вызваться Array.from(undefined), но их может быть много и неявных. Поэтому вопросы такие возникают:
- Прав ли автор core-js в том, что он Array.from(undefined) не приводит к []. Я честно говоря не нашел однозначного ответа про ES6. Я вижу, что в битриксе коробке используется версия core-js 2.5.*, сейчас на github у автора 3.0.0, но кажется код Array.from не изменился.
- Может ли битрикс реализовать на полную, а условную отдачу полифила, например основываясь на User-Agent. Я подозреваю, что генерить script.js на лету никто не будет, но можно хотя бы капитально отсекать всех, кто сидит на свежем браузере и не передавать им полифил совсем. Я сильно подозреваю, что если полифил к коробке был добавлен в последние месяцы, то число сайтов со вставками виджета, где что-то не так стало работать, будет разрастаться.
- Может быть есть какая-то хитрость еще, чтобы избежать массового срабатывания полифила на родительской странице?