← Wszystkie wpisy

Dlaczego Safari 27 wprowadza 525 poprawek: notatki z laboratorium WebKit

Najbardziej odkrywcza rzecz, jaką zespół Safari powiedział na WWDC 2026, nie dotyczyła żadnej funkcji. Przez godzinę spędzoną w laboratorium grupy Safari and Web Technologies inżynierowie WebKit raz po raz wracali do jednego pytania: jak zespół przeglądarki decyduje, co budować, i dlaczego z zewnątrz tak często wygląda to na powolne? Odpowiedź, do której wciąż wracali, sparafrazowana z laboratorium, brzmiała tak: naprawdę im na tym zależy, a stoi za tym liczba, którą można sprawdzić. Safari 27 wprowadza 58 nowych funkcji i 525 poprawek, co WebKit nazywa „największym stosem poprawek w jakimkolwiek wydaniu Safari w ostatnich latach”.1 Ten wpis dotyczy rozumowania kryjącego się za tą liczbą, zaczerpniętego z laboratorium i ugruntowanego we własnych informacjach o wydaniu WebKit.

Obejrzyj: Safari and Web Technologies Group Lab (WWDC26)

Laboratorium grupy Safari & Web Technologies na WWDC 2026.

W skrócie

  • Safari 27 wprowadza 58 nowych funkcji i 525 poprawek, czyli największą liczbę poprawek w jakimkolwiek wydaniu Safari.1 Laboratorium ujęło ten rok jako kampanię przeciw drobnym niedoróbkom: tropienie małych błędów poprawności, które czynią platformę godną zaufania, a nie tylko nagłówkowych funkcji.
  • Najwyraźniejszym przykładem jest przepisanie loadera modułów JavaScript. Notatki WebKit opisują naprawienie „wielu błędów poprawności top-level await poprzez przepisanie ES module loader pod kątem zgodności ze standardami”, zastępując implementację opartą na porzuconej propozycji z 2016 roku, która powstała na długo przed top-level await.1
  • Laboratorium posłużyło się selektorem :has() jako studium przypadku tego, jak standardy faktycznie ruszają z miejsca: funkcja, którą inżynierowie przez lata uważali za niemożliwą, dopóki inżynieria Igalia nie sprawiła, że stała się wystarczająco szybka, a teraz działa w każdym dużym silniku.23
  • Historia kontrolek formularzy dojrzała: appearance: base-select usuwa natywne stylowanie <select>, dzięki czemu zaczyna się od czystej karty, przy czym szerszy kierunek „stylowania każdej kontrolki formularza” pozostaje nieustaloną specyfikacją, co do której panel otwarcie się różnił.12
  • WebKit i JavaScriptCore działają w każdym systemie operacyjnym Apple, w tym watchOS, a SwiftUI ma teraz pełnoprawny WebView, więc „silnik sieciowy” jest bliższy usłudze systemowej niż pojedynczej aplikacji.24

Ta liczba i co oznacza

Sposób, w jaki WebKit ujmuje Safari 27, jest niezwykle ilościowy. Poza nowymi funkcjami wydanie niesie ze sobą 525 poprawek, „największy stos poprawek w jakimkolwiek wydaniu Safari”.1 W laboratorium zespół powiązał tę liczbę z postawą, a nie kamieniem milowym: sparafrazowana myśl brzmiała tak, że programiści internetowi czasami odczytują wybory przeglądarki jako brak troski o ich codzienne doświadczenie, a odpowiedź zespołu była dokładnie odwrotna, że nie ma żadnej korzyści w pogarszaniu sieci w Safari.2 Nie trzeba przyjmować tego na wiarę, ponieważ liczba poprawek jest dowodem, a sam opis informacji o wydaniu w laboratorium brzmiał tak, że ciągną się na tyle długo, by przewijać je przez dłuższą chwilę.2

Najlepszym pojedynczym przykładem jest element instalacji, którego większość programistów nigdy nie widzi. WebKit przepisał loader modułów JavaScript. Notatki o wydaniu są precyzyjne: zespół „naprawił wiele błędów poprawności top-level await poprzez przepisanie ES module loader pod kątem zgodności ze standardami”, ponieważ wcześniejsza implementacja była „oparta na porzuconej propozycji WHATWG Loader z 2016 roku, która powstała na długo przed top-level await” i mogła pozwalać importom na dostęp do eksportów, zanim te zostały w pełni zainicjowane.1 Przepisanie loadera modułów po to, by naprawić całą klasę błędów kolejności await, to ogromny wysiłek włożony w coś, czego — gdy zrobione poprawnie — nikt nie zauważa. Oto kampania przeciw drobnym niedoróbkom w jednym commicie.

Jak standard faktycznie rusza z miejsca: historia :has()

Najbardziej pożyteczną narracją laboratorium była opowieść o selektorze CSS :has(), od dawna upragnionym selektorze rodzica. Sparafrazowana wersja z panelu: inżynierowie przeglądarek mówili „nie” przez większą część dwóch dekad, na tej podstawie, że układy scalone nie były wystarczająco szybkie, by go oceniać bez rujnowania wydajności strony, dopóki praca potrzebna do uczynienia go wykonalnym wreszcie się nie wydarzyła i nie trafił on do przeglądarek.2 Sprawdzalny szkielet pod tą historią jest prawdziwy. WebKit wprowadził :has() w Safari 15.4, Chromium poszedł w jego ślady w Chrome 105, z inżynierią prowadzoną przez open source’ową firmę konsultingową Igalia, a Firefox dopełnił komplet w wersji 121, więc selektor, który przez lata był „niemożliwy”, działa teraz w każdym dużym silniku.3

Laboratorium powiązało to z zasadą projektową, której warto znać nazwę. „Priorytet interesariuszy” (priority of constituencies) projektu HTML porządkuje, czyje potrzeby wygrywają, gdy są ze sobą w konflikcie: użytkownicy ponad autorami, autorzy ponad implementatorami, implementatorzy ponad twórcami specyfikacji, a wszyscy oni ponad czystością teoretyczną.5 To reguła, która wyjaśnia, dlaczego przeglądarka będzie wiecznie nosić brzydki obejściowy hack zgodności, zamiast popsuć stronę, i dlaczego funkcja pomagająca autorom wciąż może czekać latami, jeśli jej implementacja zaszkodziłaby użytkownikom poprzez wydajność. :has() to ta reguła rozstrzygająca się w zwolnionym tempie: użyteczna dla autorów, zablokowana na koszcie po stronie użytkownika związanym z uczynieniem jej szybką, wdrożona dopiero, gdy ten koszt spadł.

Projekt kontrolek formularzy i niezgoda na oczach publiczności

Najczęściej wyczekiwana zdolność CSS ostatniej dekady wreszcie nadchodzi: stylowanie natywnych kontrolek formularzy bez odbudowywania ich od zera z <div>-ów. Safari 27 wprowadza appearance: base-select, które — słowami WebKit — pozwala „usunąć natywne stylowanie i zacząć od czystej palety”, a następnie nakładać własne CSS, zachowując jednocześnie prawdziwą semantykę kontrolki, obsługę klawiatury i dostępność.1 Łączy się to z ::picker(select), ::picker-icon, ::checkmark oraz elementem <selectedcontent>, czyli powierzchnią konfigurowalnego select, omówioną w stylowaniu prawdziwego elementu select.

Tym, co dodało laboratorium, była szczerość co do tego, jak niedokończona jest ta szersza wizja. Rozszerzenie appearance: base na każdą kontrolkę formularza to deklarowany kierunek, a nie wdrożona specyfikacja, a panel nie zgadzał się sam ze sobą na kamerze w najtrudniejszej kwestii: jak w ogóle ma wyglądać niestylowana linia bazowa. Parafrazując tę wymianę zdań, jedno stanowisko głosiło, że niestylowana kontrolka powinna wyglądać jak zwykła nowoczesna kontrolka; ripostą było to, że „nowoczesność” to ruchomy cel mody, a nie coś, co specyfikacja może przyszpilić, więc linia bazowa powinna dziedziczyć możliwie najwięcej ze strony, a poza tym mieć możliwie najmniej własnego zdania.2 Ograniczenie inżynieryjne, co do którego się zgodzili, to ta naprawdę trudna część: funkcja działa tylko wtedy, gdy domyślne renderowanie i struktura DOM są identyczne we wszystkich przeglądarkach, ponieważ autorzy będą stylować przeciw obu.2 Oto dlaczego 30-letni problem wciąż jest pracą w toku, a nie odhaczonym polem.

Silnik sieciowy jako usługa systemowa

Pożyteczne przeformułowanie z laboratorium: WebKit to znacznie więcej niż Safari. WebKit i JavaScriptCore są dostarczane w każdym systemie operacyjnym Apple, w tym watchOS, który w ogóle nie ma przeglądarki, a każda aplikacja uruchamiająca JavaScript opiera się na JavaScriptCore.2 Własne materiały WWDC autorstwa WebKit stawiają tę samą tezę, opisując interfejsy aplikacji „napędzane przez HTML, CSS i JavaScript renderowane przez WebKit i JavaScriptCore, te same silniki, które są wewnątrz Safari”, na wszystkich platformach.1 Praktyczny wniosek dla programistów pojawił się w 2025 roku, gdy SwiftUI zyskał natywny WebView i model WebPage, czyniąc z WebKit pełnoprawny widok SwiftUI zamiast WKWebView opakowanego w UIViewRepresentable.4 Gdy silnik sieciowy jest tak głęboko w systemie operacyjnym, pytanie „czy to powinno być natywne, czy sieciowe” przestaje być binarne.

Co WebKit wprowadza jako pierwszy i co buduje dalej

Dwa mniejsze wątki zasługują na uwagę programisty. Po pierwsze, Safari wciąż wprowadza funkcje CSS przed innymi silnikami: hanging-punctuation od lat jest dostępna wyłącznie w Safari, funkcja CSS filter() (odrębna od szeroko wspieranej właściwości filter) pozostaje tylko w WebKit, a Safari niedawno wprowadziło funkcję random(), wraz z towarzyszącą random-item() do wybierania spośród dyskretnych wartości zdefiniowanych w szkicu CSS Values.67 Odruch „Safari jest w tyle” pomija to, jak często jest pierwsze.

Po drugie, historia rozszerzeń sieciowych ulega konsolidacji. Międzyprzeglądarkowy wysiłek WebExtensions przechodzi z wieloletniej grupy społecznościowej w stronę formalnej grupy roboczej W3C, a szkic statutu z 2025 roku celuje w prawdziwą specyfikację interoperacyjności.8 Apple ogłosiło natomiast zwrot zorientowany na konsumenta podczas keynote’u WWDC 2026: „Describe an Extension”, które wykorzystuje Apple Intelligence do generowania i instalowania niestandardowego rozszerzenia Safari z opisu w prostym języku, bez Xcode i bez okrężnej drogi przez App Store.9 Należy traktować to jako zapowiedź z keynote’u, a nie API dla programistów, ale kierunek jest jasny: powierzchnia rozszerzeń poszerza się jednocześnie na warstwie standardów i na warstwie użytkownika końcowego.

Co z tego wynieść

Laboratorium to okno na kompromis, który większość relacji o funkcjach pomija. Zespół przeglądarki może gonić za nagłówkowymi funkcjami albo gonić za poprawnością, a WebKit w tym wydaniu w widoczny sposób wybrał to drugie: 525 poprawek, loader modułów przepisany pod kątem całej klasy błędów await, selektor rodzica, który dwie dekady czekał, aż sprzęt go dogoni. Lekcja dla każdego, kto buduje na tej platformie, jest taka, by czytać informacje o wydaniu, a nie keynote, gdy chce się wiedzieć, co naprawdę się poprawiło. Funkcje są w konfigurowalnym select, pasach CSS Grid i elemencie HTML model; rozumowanie stojące za tempem jest w laboratorium.

FAQ

Ile poprawek jest w Safari 27?

525 poprawek obok 58 nowych funkcji, co WebKit opisuje jako największą liczbę poprawek w jakimkolwiek wydaniu Safari.1 Laboratorium ujęło ten rok wokół poprawności i „drobnych niedoróbek” zamiast nagłówkowych funkcji.

Czym jest przepisanie loadera modułów?

WebKit przepisał ES module loader Safari pod kątem zgodności ze standardami, naprawiając wiele błędów poprawności top-level await. Wcześniejsza implementacja była oparta na porzuconej propozycji WHATWG Loader z 2016 roku, która powstała na długo przed top-level await, i mogła pozwalać importom na dostęp do eksportów, zanim te zostały w pełni zainicjowane.1

Czy appearance: base jest wdrażane?

appearance: base-select trafia do Safari 27 dla elementu <select>, usuwając natywne stylowanie, dzięki czemu można zastosować własne CSS, zachowując semantykę kontrolki.1 Rozszerzenie appearance: base na wszystkie kontrolki formularzy to deklarowany kierunek, ale nieustalona specyfikacja, a panel laboratorium otwarcie się różnił co do tego, jak powinna wyglądać niestylowana wartość domyślna.2

Czy Apple naprawdę dodało rozszerzenia Safari generowane przez AI?

Tak. Apple ogłosiło „Describe an Extension” podczas keynote’u WWDC 2026: wykorzystuje ono Apple Intelligence do generowania i instalowania niestandardowego rozszerzenia Safari z opisu w języku naturalnym, bez Xcode i App Store.9 To funkcja konsumencka, a nie API dla programistów.


Wpisy o funkcjach Safari opisują co: stylowanie prawdziwego <select>, pasy CSS Grid dla natywnego masonry i element HTML <model>. Ten opisuje dlaczego kryjące się za tempem. Centralnym węzłem całej serii jest seria Apple Ecosystem.

Bibliografia


  1. WebKit, News from WWDC26: WebKit in Safari 27 beta. Źródło dla 58 nowych funkcji i 525 poprawek („the largest pile of fixes in any Safari release”), przepisania ES module loader („Fixed multiple top-level await correctness bugs with a rewrite of the ES module loader for standards compliance”, zastępującego implementację „based on an abandoned 2016 WHATWG Loader proposal that predated top-level await entirely”), opisu appearance: base-select („clear the native styling and start with a clean palette”) wraz z ::picker(select)/::picker-icon/::checkmark/<selectedcontent> oraz ujęcia WebKit i JavaScriptCore jako silników stojących za interfejsami aplikacji na platformach Apple. 

  2. Apple, sesja WWDC 2026 8015, Safari and Web Technologies Group Lab. Sparafrazowane z lokalnie transkrybowanego nagrania; Apple nie publikuje oficjalnych napisów do laboratoriów, więc sformułowania tutaj są parafrazą, a nie cytatem, a dokładne brzmienie jest niezweryfikowane. Źródło dla ujęcia troski zespołu o platformę powiązanej z długością informacji o wydaniu, narracji :has(), że inżynierowie opierali się jej przez mniej więcej dwie dekady ze względu na wydajność, niezgody na żywo co do niestylowanej linii bazowej appearance: base (nowoczesna kontrolka kontra dziedziczenie ze strony) oraz międzyprzeglądarkowego ograniczenia identycznego renderowania i struktury DOM, a także tezy, że WebKit/JavaScriptCore działają w każdym systemie operacyjnym Apple, w tym watchOS. 

  3. WebKit, Using :has() as a CSS Parent Selector and much more, oraz historia wdrożeń międzysilnikowych: Safari 15.4, Chrome 105 (inżynieria prowadzona przez Igalia), Firefox 121. Źródło dla wprowadzenia :has() we wszystkich dużych silnikach przeglądarek po latach uznawania go za niewykonalne. 

  4. Apple, WebKit for SwiftUI oraz sesja WWDC 2025 231, Meet WebKit for SwiftUI. Źródło dla natywnego WebView SwiftUI i modelu WebPage wprowadzonych w wydaniach z 2025 roku, czyniących z WebKit pełnoprawny widok SwiftUI. 

  5. W3C, HTML Design Principles: Priority of Constituencies. Źródło dla porządku „users over authors over implementors over specifiers over theoretical purity”. 

  6. MDN / caniuse, hanging-punctuation oraz funkcja CSS filter(). Źródło dla tego, że obie są wspierane w Safari/WebKit, a nie w Chrome ani Firefox w chwili pisania (funkcja filter() jest odrębna od szeroko wspieranej właściwości filter). 

  7. W3C, CSS Values and Units Module Level 5, która definiuje random() i random-item(). Safari wprowadziło funkcję random(); random-item() wybiera spośród dyskretnych wartości słów kluczowych lub właściwości. 

  8. W3C, WebExtensions Community Group oraz szkic statutu WebExtensions Working Group z 2025 roku. Źródło dla międzyprzeglądarkowego wysiłku WebExtensions przechodzącego z grupy społecznościowej w stronę formalnej grupy roboczej. 

  9. Apple ogłosiło „Describe an Extension” podczas keynote’u WWDC 2026, generując i instalując niestandardowe rozszerzenie Safari z opisu w języku naturalnym za pomocą Apple Intelligence, bez Xcode i App Store. Opisane przez MacRumors, 8 czerwca 2026. Opisane tutaj jako zapowiedź z keynote’u i funkcja konsumencka, a nie API dla programistów. 

Powiązane artykuły

CSS Grid Lanes: natywny układ masonry w Safari

CSS Grid Lanes wnosi natywny układ masonry do Safari 26.4 w trzech liniach CSS, a regulator `flow-tolerance` rozwiązuje …

8 min czytania

Customizable select: nareszcie stylizacja prawdziwego elementu <select>

Safari 27 i Chrome 135 pozwalają stylizować prawdziwy element select: appearance: base-select, ::picker(select), bogaty …

9 min czytania

Manifest bez bundlera: produkcja bez narzędzi budowania

FastAPI + HTMX + czysty CSS bez żadnych narzędzi budowania i perfekcyjne wyniki Lighthouse. Prawdziwe dane produkcyjne, …

8 min czytania