Shim
Коротко
Прослойка кода, которая перехватывает вызовы к API или окружению и подгоняет их под ожидаемый интерфейс, сглаживая различия между версиями и платформами.
Что такое «Shim»
Слово пришло из столярного дела: shim — тонкая подкладка, которой выравнивают перекошенную деталь. В программировании смысл тот же. Есть код, рассчитанный на определённый интерфейс, и есть среда, где этот интерфейс выглядит иначе или устроен по-старому. Шим встаёт между ними и делает так, чтобы код работал без переписывания.
В веб-разработке шимы особенно часто писали в эпоху старых Internet Explorer. Известный пример — html5shiv: небольшой скрипт, без которого IE 8 не умел стилизовать новые теги вроде header и section. Встречаются шимы и вне браузера: в Node.js подставляют браузерные API, в сборщиках подменяют модули для другой платформы.
Пример шима
window.requestAnimationFrame =
window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
function (callback) {
return setTimeout(function () {
callback(Date.now());
}, 16);
};
Код сначала берёт стандартную функцию, затем вариант с вендорным префиксом, а если нет ни того ни другого — подставляет упрощённую замену на таймере. Остальной код вызывает requestAnimationFrame и не думает о различиях браузеров.
Чем отличается от полифила
Границу проводят по-разному, но обычно так. Полифил реализует стандартную возможность там, где её нет, и повторяет её поведение по спецификации. Шим шире: он может переименовывать вызовы, менять порядок аргументов, оборачивать старое API в новое или наоборот, и при этом не обязан строго следовать какому-либо стандарту. Можно сказать, что любой полифил — разновидность шима, но не любой шим — полифил.
Когда шим становится обузой
Шимы пишут под конкретные устаревшие окружения, и со временем эти окружения исчезают. Если в проекте до сих пор подключены прослойки для IE, они только увеличивают объём скриптов. При ревизии кода стоит проверять, для каких браузеров собирается проект, и убирать то, что больше не нужно. Подобные подкладки часто прячутся в вендорных файлах старых тем и плагинов.

