Я давеча написал комментарий о том, что компании Майкрософт давно пора перестать издеваться над веб-разработчиками и перейти на движок Gecko. Многие, видимо, посчитали это неуместной шуткой; тем не менее, это таки вовсе не шутка, а констатация факта. Те, кто с этим не согласен, видимо не пытались ещё разрабатывать под этот замечательный браузер.
Давайте я расскажу вам, какой это замечательный процесс.
Сколько браузеров вы поддерживаете, дорогие разработчики? Не так давно, пять лет назад, этот список был довольно прост: IE6, IE7, Opera, Firefox, Chrome. Пять браузеров, плюс кое-какие минорные вариации между 2 и 3 Firefox и 9 и 10 Оперой.
Сколько браузеров мы поддерживаем теперь?
Firefox, Chrome и Opera никуда не делись. Файрфокс и Хром давно перешли на короткий релизный цикл, последний артефакт неавтоматического обновления (Firefox 3.6) не так давно наконец-то потерялся с приборов. Опера должна перейти на тот же цикл в ближайшее время — да и последние версии Оперы/Престо особой головной боли не добавляли. Добавился Яндекс.Браузер, который внутре тот же Хромиум, хоть и обновляется реже.
Ну и, наконец, к вопросу про IE: сколько версий IE мы вынуждены поддерживать? В октябре по li.ru доли разных версий Internet Explorer в рунете были такими: IE10 — 4%, IE8 — 2.3%, IE9 — 1.7%, IE7 — 0.7% плюс невидимый на приборах IE11, который с выходом Windows 8.1 должен отбить у IE10 какую-то долю. Т.е. нам кажется, что это одна-две версии браузера, если вы готовы пожертвовать 4.7% аудитории, или три-пять — если не готовы или вдруг вы пишете продукт для страны с более высокой долей IE.
Как бы не так! Слушайте внимательно.
Internet Explorer, начиная с, прости господи, восьмой версии поставляется с набором движков от предыдущих версий. IE8 умеет работать в режиме IE7 и в режиме Quirks Mode (фактически, IE5.5!). IE9 умеет работать в режимах 9, 8, 7 и Quirks. IE10 умеет работать в режимах 10, 9, 8, 7 и Quirks. IE11 умеет работать в режимах 11, 10, 9, 8, 7 и Quirks. И это, внимание, РАЗНЫЕ движки! Не знаю, чем они там упарывались, когда принимали это решение, но режим IE10 в IE11 — вовсе не IE10! Вот, например, в IE9-10 есть баг с неправильный позиционированием канваса по z-index, который решался выставлением ему background-color: rgba(255, 255, 255, 0). В IE11 в режиме IE10 этот баг был тщательно портирован прекрасными разработчиками из Редмонда, а вот workaround портировать позабыли, и теперь канвас с абсолютным позиционированием там как бэ использовать нельзя. Совсем.
Итого, если вы, совершенно случайно, пишете какую-нибудь библиотеку или просто хотите реюзать код на разных доменах — то вам вот прям сейчас нужно поддерживать (сколько-сколько?) ДВАДЦАТЬ разных версий Internet Explorer! Двадцать версий браузера, который использует менее 10% аудитории! На секундочку, у файрфокса за всё время его существования было 28 мажорных релизов, у Хрома — 32.
И это только начало, ребята. Дух старой школы невероятно силён в Редмонде: все эти версии Internet Explorer будут поддерживаться Майкрософтом (сколько-сколько?) 10 лет! Занимательная задачка на устный счет: посчитать, сколько версий IE нам придётся поддерживать через 5 лет.
Пол Айриш написал про это прекрасную статью ещё в 2011: www.paulirish.com/2011/browser-market-pollution-iex-is-the-new-ie6. Но даже он не смог предсказать всю упоротость разработчиков Майкрософта.
Шо?! Это ещё не всё?!
Это ещё далеко не всё, мои маленькие красноглазики. В IE10-11 Майкрософт презентовал ещё маленькую тележку свежих и революционных идей.
Начнём с того, что IE11 поставляется вот с таким юзер-агентом:
Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko
Что в нём прекрасно? В нём НЕТ ВЕРСИИ самого Internet Explorer-а! Вообще слов «MSIE» больше нет. Знаете, почему? Потому что Майкрософт считает, что их браузер, внимание, не нужно детектить по юзер-агенту, поскольку он поддерживает все новейшие стандарты и его не надо отличать от других новых браузеров.
Давайте я повторю ещё раз: разработчики браузера, который поставляется с 6 разными движками, эмулирующими баги предыдущих версий этого браузера, начиная с 1999 года, заявляют, что его не нужно определять по юзер-агенту.
При этом абсолютно те же люди между последним Developer Preview IE11 и финальным RTM релизом берут и отрывают вендорские префиксы и ломают ещё пару десятков обратных совместимостей, о чём любезно сообщают в своём msdn-е: msdn.microsoft.com/en-us/library/ie/dn304886%28v=vs.85%29.aspx
Да-да. Если ваш код отлично работает в Developer Preview, это совершенно не значит, что он заработает в релизной версии, которая внезапно одномоментно раскатится паре десятков миллионов человек по всему миру. Но вы ни в коем случае не занимайтесь детектом версии по юзер-агенту!
Фиг с ним, с Developer Preview. В их прекрасной поделке нужно отличать версию оси, под которой она работает! Я серьёзно.
Вот сидят люди. В трудовой у них, наверняка, написано что-то типа Senior Software Architect. Придумывают стандарт PointerEvents, в котором, чин чинарём, всё по-взрослому — специальный флаг navigator.pointerEventsEnabled показывает, поддерживает ли браузер пойнтер-события или нет. Чтобы, понимаешь, никто ничего по юзер-агенту не детектил, а всё как в нормальных браузерах.
А потом внезапно выясняется, что у тех же людей обработка жестов падает в IE10/Win7. Вот прям в msdn-е так и написано:
Note The APIs we discuss in this section aren't supported in Windows 7 or earlier.
msdn.microsoft.com/en-us/library/ie/dn433243%28v=vs.85%29.aspx
Так что помимо 20 разных версий IE у вас есть как минимум две разных версии ОСи — Win7 и Win8. На самом деле, их больше — есть ещё Windows Phone и Windows RT, а в Windows 8 ещё есть два режима браузера — метро и десктоп. Они все отличаются. Нам повезло, мы не нашли прям заметных багов, чтобы держать отдельные ветки кода ещё и под эти оси — не факт, что вы окажетесь столь же удачливыми. Ну что, сколько там версий IE получилось? Я уже запутался, но, наверное, под сотню.
А теперь — десерт! Вот допустим вы просто пишете веб-странички, вам плевать на режимы браузера и вы вообще недоумеваете, чего париться — сайт ведь не может сам перейти в какой-нибудь режим совместимости, правда?
У меня есть для вас плохие новости, ребята. Заходите вот сюда:
iecvlist.microsoft.com/ie10/201206/iecompatviewlist.xml
И ищите там свой сайт.
Знаете, что это? Это глобальный Compatibility List, в который заносятся сайты, которые, по мнению Майкрософт, нужно показывать в каком-нибудь из режимов совместимости.
Нет, серьёзно, они отсматривают весь Интернет и составляют реестр сайтов, которые плохо себя вели!
Знаете, как сайты попадают в этот список? Майкрософт выпускает превью-версии своих браузеров. В них есть специальная кнопочка в адресной строке — показать этот сайт в режиме совместимости. Майкрософт собирает анонимную статистику — если в эту кнопку часто тыкают, сайт попадает в реестр.
Серьёзно, они этого даже не скрывают. Похоже, даже немножечко гордятся.
msdn.microsoft.com/ru-ru/library/gg699485%28v=vs.85%29.aspx
Выбраться из этого списка очень просто — написать в саппорт Майкрософт, ага.
Ну и вишенка на торте: допустим я вас убедил и вы регулируете, в каком режиме показывать страницу, с помощью специальной меты, дабы избежать ненужных проблем. Так вот, в IE11 (по крайней мере в RTM-версии, сейчас лень проверять) она не работает — факт нахождения в списке совместимости приоритетнее заданного вебмастером X-UA-Compatible!
Дорогая Microsoft! Прекрати, пожалуйста, над нами издеваться и вкрути движок Gecko в свой так сказать продукт.