Polyfill - kod, który sprawia że wszystko działa

Jest coś magicznego w programowaniu. Szkoda, że nowe aplikacje nie zadziałają na starych przeglądarkach. Zaraz, zaraz... a polyfille?

Peanuts PAGES.POST.COVER_THUMBNAIL.BY_WHOM undefined

Z tego artykułu dowiesz się:

  • Co to jest Polyfill?

  • Co wspólnego mają polyfille i shim.gif?

  • Jak zbudowany jest Polyfill?

Nasz świat jest dość stary. Wiek Ziemii szacuje się na około 4,5 miliarda lat. Pomimo to następujące po sobie wydarzenia dość mocno się zazębiają, tworząc piękną i długą, a przede wszystkim spójną historię. Jest wielce prawdopodobne, że nie wszystkie współczesne organizmy poradziłyby sobie w atmosferze ziemskiej sprzed miliardów lat. Możesz pomyśleć, że wyczarowałem nawiązanie z kapelusza - co to ma wspólnego z dzisiejszym tematem?

Tak jak człowiek nie dałby rady żyć na Ziemii 3,5 mld lat temu, tak napisany dziś program nie zadziałałby na przeglądarce z lat 90. Niby to samo środowisko, a jednak pewne jego aspekty uległy totalnym zmianom. Z czego to wynika? Przede wszystkim z rozwoju. Ekosystem i atmosfera naszej planety się zmienia. Tak samo zmieniają się języki programowania i ich specyficzne implementacje w przeglądarkach. Ba, same przeglądarki z tego samego okresu mogły mieć różne podejścia do tych samych tematów.

Co to jest polyfill?

Wejdźmy w ten temat głębiej. Przeglądarki wydawane na przestrzeni lat dość luźno opierały implementowane standardy języków o najnowsze wytyczne. Problem nie dotyczył tylko Javascriptu - chociaż jego najczęściej. Przykładowo w IE7 nie było dostępnej właściwości css `text-shadow`. Podobny efekt można było jednak osiągnąć wykorzystując odpowiednie filtry dostępne w IE.

Zabieg, który został tutaj wykorzystany to tak zwany Polyfilling, czyli użycie kodu, pozwalającego na wykorzystanie danej funkcjonalności, nawet gdy nie została ona zaimplementowana.

Spotkać się z taką sytuacją możemy w dwóch przypadkach: w starych przeglądarkach, które nie są już rozwijane, a także w nowych, gdy producenci nie są w stanie nadążyć z wprowadzaniem nowości ze standardów języków (lub świadomie tego nie robią). O ile pierwszy przypadek jest ważny z perspektywy biznesowej, to drugi poprawia tzw. developer experience - dając więcej możliwości pisania - w nowszy sposób i z wykorzystaniem nowych możliwości technicznych.

Polyfill (w polskiej literaturze możemy się spotkać ze słowem uzupełniacz) to kod, który ma za zadanie zaimplementować nową funkcję, która nie istnieje lub nie jest obsługiwana. Taki kod zapewnić powinien kompatybilność wsteczną dla starych przeglądarek. Co ciekawe w języku angielskim nie istnieje takie słowo - jest to neologizm, który został użyty pierwszy raz w 2009 roku w książce Remy’ego Sharpa „Wprowadzenie do HTML5”.

Shim i Shiv

Warto wspomnieć, że w 2009 istniał już termin shim, który mógł z powodzeniem zastąpić nowy termin ukuty przez Sharpa. Sharp stwierdził jednak, że potrzebuje narzędzia, które będzie działało bardziej automatycznie. Shim to kawałek kodu, którego zadaniem jest naprawienie niedziałającej funkcjonalności - poniekąd osiąga to, ale wymaga określonego nakładu pracy. Rezultat nie jest automatyczny, a tego oczekiwał Sharpe.

Aby zrozumieć czym jest shim należy się cofnąć troszkę w czasie do momentu, kiedy tworzyliśmy layouty oparte o tabelki. Aby zachować pustą komórkę, która reprezentuje odpowiednią przerwę, należało ją czymś wypełnić - białe znaki nie wchodziły w grę, w związku z czym dodawało się przezroczyste gify o wymiarach 1 piksel na 1 piksel. Takie pliki często nazywały się właśnie shim.gif - zapewniało to oczywiście wsparcie wsteczne, ale nie działo się automatycznie - wymagało ręcznego dodania takiego pliku. Swoją drogą na podobnym mechanizmie opiera się narzędzie do zbierania danych: Facebook Pixel.

Shiv działa w oparciu o podobne założenia, natomiast jest to najczęściej plik javascriptowy, który ma zadanie nadpisać istniejący interfejs. Najbardziej znanym kodem Shiv jest HTML5shiv, który swojego czasu nadpisywał interfejs html w przeglądarkach Internet Explorer, tak aby można było korzystać z nowej składni w starszych przeglądarkach.

Jak zbudowany jest Polyfill?

Dobry polyfill powinien działać tylko wtedy, gdy nie istnieje dana funkcjonalność w przeglądarce. Na pewno nie powinien zostać wczytany, gdy przeglądarka obsługuje to, co dodaje polyfill. Zatem pierwsze co powinien zrobić to zacząć od warunku. Sprawdzenie bezpośrednio czy dana funkcjonalność (w szczególności istniejąca w globalnej przestrzeni) istnieje jest dość ryzykowne, ponieważ może zwrócić błąd - jeśli jej nie ma. Spróbujmy stworzyć polyfill’a dla funkcji confirm.

Tak postawiony warunek zwróci błąd na starszych przeglądarkach. Przydaje się do ogarnięcia tego problemu operator typeof.

To samo możemy osiągnąć odwołując się do obiektu z poziomu obiektu globalnego. Przykładowo:

Warto zwrócić uwagę, że obiekt window nie zawsze będzie dostępny, na przykład na środowiskach innych niż przeglądarki. Z tego powodu zaleca się unikanie takiego bezpośredniego odwołania.

Inaczej sprawa ma się z funkcjami, które przypisane są do specyficznego prototypu. Spójrzmy na najpopularniejszą funkcję w prototypie tablicowym: map.

Kod, który znajdzie się wewnątrz takiego polyfill’a nie powinien tworzyć żadnych efektów ubocznych, ponieważ dodanie takiego kodu do aplikacji niesie spore i przykre konsekwencje. Co więcej, funkcja, która ma zostać uzupełniona powinna dokładnie odzwierciedlać działanie pierwowzoru, przyjmować dokładnie takie same argumenty. W przeciwnym wypadku może prowadzić to do wielu nieprzyjemnych i trudnych do wychwycenia błędów.

Adresy?

Polyfill od 2009 roku zagościły na naszym środowisku na dobre. Nie musimy ich tworzyć za każdym razem od początku. Jest bardzo dużo bibliotek, które od lat tworzą polyfille wszystkiego. Pierwszym przykładowym zbiorem polyfilli było JQuery, które pośrednio dodawało obsługę wielu funkcjonalności, tak aby strony mogły działać wszędzie tak samo.

Dzisiaj zestawy polyfilli znajdziemy chociażby w Babelu. Ciekawym projektem jest polyfill.io, który pozwala nam stworzyć plik tylko z tymi polyfillami, których potrzebujemy w swoim projekcie.

Aktualizacja z dnia 01 lipca 2024

Wspomniałem powyżej, że jednym z ciekawych rozwiązań dotyczącym wykorzystywania polyfilli jest biblioteka polyfill.io. Wspomniany projekt był projektem open-source, który został jakiś czas temu sprzedany do chińskiej firmy. Podmiot ten tuż po przejęciu domeny, zmodyfikował plik polyfill.js w ramach nabytej biblioteki, w taki sposób, aby zarówno kod, jak i sama domena przekierowywały użytkowników na złośliwe strony.

Jaka nauka płynie z tego dla nas? Przede wszystkim nie powinniśmy bezkrytycznie ufać zewnętrznym dostawcom, w szczególności takim, którym nie płacimy za dostarczaną jakość.

Od siebie dodałbym jeszcze, że warto rozróżnić samą bibliotekę (wokół, której rozwija się aktualnie afera) od techniki pisania kodu jaką jest polyfill sam w sobie.

Podsumowanie

Ziemia zmienia się dużo wolniej niż świat programowania. Czas adaptacji życia jest wydłużony w stosunku do dość dynamicznie zmieniającego się świata programowania. Koncepcje polyfilli, podobnie jak wcześniejsze shim i shiv, mają zapewnić kompatybilność wsteczną, tak aby nawet stare środowiska były w stanie zapewnić namiastkę nowoczesności i pozwoliły otworzyć to, co bez nich zrzuciło by biały ekran i czerwoną notatkę w narzędziach developerskich.

Udostępnij ten artykuł:

Komentarze (2)

  • Mateusz Jabłoński

    29 czerwca 2024 o 07:45

    Nie poleciłem polyfill.io ;) Napisałem, że jest ciekawym projektem (w zasadzie był jak dotąd) - cały artykuł mówi o koncepcji polyfill'i jako fragmentów kodu. To co się wydarzyło w temacie tej biblioteki to cenna lekcja dla wszystkich. Również dla mnie - powinniśmy być bardziej świadomi tego, co wkładamy do swoich projektów i lepiej szacować ryzyko.

  • hehe

    29 czerwca 2024 o 07:42

    No i masz - już wiesz czemu nie poleca się głupich rzeczy? ;)

Powiązane treści

Jeżeli ten artykuł Cię zainteresował sprawdź inne materiały powiązane z nim tematycznie. Poniżej znajdziesz artykuły i odcinki podcastów mojego autorstwa oraz polecane przeze mnie książki, które rozszerzają ten temat.

Magia Pixel Perfect by kudou
Artykuł
11 sierpnia 2022

Magia Pixel Perfect

W czasach gdy wdzwanialiśmy się do Internetu narodziło się podejście, które zdefiniowało web development na wiele lat. Dzisiaj nie jest ono, aż tak popularne, ale według mnie warto je poznać i zrozumieć. Porozmawiajmy o magii pikseli.

Czytaj więcej
Botox Injections by Jacob Lund
Artykuł
24 lutego 2022

Dependency Injection

W trakcie nauki programowania prędzej czy później spotkamy się z wzorcami projektowymi. Gdy już je poznamy okazuje się, że są wszędzie i stosujemy je nawet nie mając świadomości, że to robimy. Dziś o jednym z wzorców projektowych - Dependency Injection.

Czytaj więcej
Data binding by undefined
Artykuł
27 marca 2023

Co to jest Data Binding?

Często omawiając Angulara lub Reacta wspomina się o data binding'u. Czym ono jest? Dziś chciałbym przybliżyć tę koncepcję, bazując na przykładach.

Czytaj więcej

Zapisz się do newslettera

Bądź na bieżąco z nowymi materiałami, ćwiczeniami i ciekawostkami ze świata IT. Dołącz do mnie.