Что такое полифил?

Перевод статьи:  What is a polyfill?
Автор:  Remy Sharp.

Полифил (англ. "polyfill") или полифилер (англ. "polyfiller") — это фрагмент кода (либо плагин), предоставляющий функционал необходимой технологии, которая (вы, как разработчик надеетесь) будет нативным образом представлена браузером. Другими словами, код будет работать в точности так, как технология, которую он, собственно, и предназначен представлять. Подделка архитектуры API интерфейса, если вам угодно.

Откуда взялся полифил и как формировался термин?

Это произошло ранее, в 2009 году, когда я был занят написанием книги "Introducing HTML5" («Знакомство с HTML5»). Сидя в кофейне (как и вы, наверно, сейчас) я пытался подыскать подходящее слово, с которым можно ассоциировать «моделирование API интерфейса с использованием JavaScript (или Flash, либо чего-нибудь другого), для браузера, у которого не предусмотрен таковой изначально».

В моем понимании «шим» (*Shim — прослойка. Унифицирующий работу браузера код, который реализует отсутствующую или нормализует уже имеющуюся поддержку.) означает добавляемый в необходимое место фрагмент кода («прослойку»), который способен реализовать отдельную функциональность, однако в этом случае мы, как правило, имеем дело с собственным API. Я же подразумевал что-нибудь, что вы можете просто подключить, и оно будет спокойно выполнять свою работу. (Помните старый знакомый "shim.gif", требовавший от вас вставки изображения, необходимого для заполнения пустых табличных ячеек td? Так вот мне хотелось, что-то вроде этого, но работающее автоматически, не требующее моего участия.)

Я прекрасно понимал, что крутящийся в голове образ нового термина не имел ничего общего с уже существующим выражением «прогрессирующее улучшение», поскольку исходный уровень моих наработок требовал наличия JavaScript и эмитируемой с его помощью новой технологии, то есть «улучшения» JavaScript как такового здесь нет и близко.

Я также отбросил вариант с термином «плавная деградация», так как при отсутствии, самого исходного функционала браузера, который должен, так сказать, «деградировать», а также без JavaScript (предполагая, что в вашем полифиле использован JavaScript) это тоже не работало.

То есть идея была отыскать легкое в произношении слово, которое ассоциировалось бы с достаточно широкой концепцией того, что эта штука, собственно, должна делать. «Полифил» (англ. "Polyfill") — вот что мне просто пришло на ум, тем не менее это слово вполне удовлетворяло моим требованиям. Первая его часть "Poly-" (*от греческого "Polloi" — значит много) говорит о привлечении любого числа технологий, то есть с поставленной задачей можно справиться не только посредством JavaScript, а вторая часть "-fill" (*наполнять, заполнять) подразумевает заполнение той дыры браузера, в которой и должна находиться реализуемая таким образом технология. Здесь, к тому же отсутствует такое понятие как «устаревший браузер», поскольку нам понадобится «полифилировать» и новые браузеры.

Насколько я знаю, существует такой продукт как "Polyfilla" (шпаклевка в США), представляющий собой наносимую на стены пасту с целью замазывания дыр и трещин. И мне на самом деле по-душе эта идея визуализации того, как мы, так сказать, «ремонтируем» браузер. Поскольку стена сама по себе плоская значит, вы можете нарисовать на ней что угодно или наклеить обои на ваш вкус.

В свое время я получил отзыв, в котором выражалось мнение, что «данное слово необходимо сменить», однако на тот момент сообщество как никогда нуждалось в подходящем слове, так, как когда-то мы нуждались в терминах подобных Ajax, HTML5, Web 2.0 — в чем-нибудь, чем можно обозначить наши идеи. И неважно, что слово не идеально, оно твердо стоит на ногах, принято сообществом разработчиков и дизайнеров и все прекрасно понимают его смысл.

На самом деле я никогда намеренно не навязывал этот термин, а просто применил его в некоторых ключевых местах (по большей части в книге) и на сколько я помню спустя пару (или достаточно много) месяцев, именно после презентации Пола Айриша (Paul Irish), в которой им напрямую было отражено слово «полифил», данный термин получил широкое распространение. (Мне кажется, что немалую роль сыграло добавление в эту презентацию страницы "Modernizr HTML5 shims & polyfill".)

Определения.

На мой взгляд, все вышесказанное прекрасно подытожил Алекс Сэкстон (Alex Sexton), классифицируя «полифилинг» как форму регрессивного усовершенствования.

Пол (Айриш) тоже характеризует это как:

Шим, который имитирует новый, не реализованный в старых браузерах API, предоставляя им обратную функциональность.

Несколько примеров.

Вот вам пример: интерфейс sessionStorage доступен во всех последних версиях браузеров (IE8 и выше), но отсутствует в IE7 и ниже.

Для того, чтобы включить такую поддержку в старых, не обеспечивающих интерфейс sessionStorage браузерах, можно использовать полифил.

Теперь, имея в наличии полифилер, я, как веб-разработчик могу полностью рассчитывать на использование сессионного интерфейса Web Storage API и более не нуждаюсь в дальнейшем тестировании своего кода либо его форкинге для обработки различных ситуаций.

Еще один пример, обеспечивающий поддержку канвы (интерфейса canvas) в IE. Здесь имеет место как раз тот случай, который реально оправдывает выбор термина, а точнее его первую половину — "poly-". В случае, когда исходная поддержка канвы отсутствует, вы можете реализовать ее задействованием технологии Silverlight. Если Silverlight недоступен, мы можем снизиться до уровня VML, используя excanvas (однако, имейте в виду, что на самом деле в состав excanvas входит также Silverlight bridge, который, как я полагаю, будет опробован в первую очередь). Применение этих двух скриптов предоставляет разработчикам достаточно устойчивую основу для интерфейса canvas в браузерах, в которых отсутствует его нативная поддержка.

Заключение.

Не так давно Пол Айриш опубликовал список доступных полифилов и шимов — отличный ресурс, содержащий впечатляющий список средств от головной боли, вызываемой у нас разработчиков старыми версиями браузеров.

По всей видимости, использование полифилов отлично зарекомендовало себя, и неплохо было бы и вам начать применять этот подход в тех случаях, когда необходимо повысить функциональность старых (а иногда и новых) браузеров до желаемого уровня.

* Примечание переводчика.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *