Zapytaj barmana: co się dzieje, gdy blokuje zmiany znaczników?

Opublikowany: 2021-02-27

Jestem programistą, który od niedawna zaczyna się rozwijać w firmie Gutenberg. Istnieje wiele niesamowitych korzyści i funkcji, ale jest też mnóstwo wad, niespójności, a także absolutnie okropna i przestarzała dokumentacja.

Jednym z najgorszych aspektów Gutenberga z perspektywy programisty jest walidacja bloków. Rozważ następujący scenariusz. Buduję niestandardowy (niedynamiczny) blok oparty na JavaScript, a edytor CMS dodaje blok do tysięcy stron. Co się stanie, kiedy lub jeśli będę musiał zaktualizować znaczniki bloku?

Domyślnie wszystkie bloki przejdą w stan unieważnienia i nie będą odzwierciedlać interfejsu witryny. Edytor CMS musiałby przejść do tysięcy stron i ręcznie kliknąć przycisk, który umożliwia odzyskanie bloku.

Zasugerowano wycofanie bloków jako sposób rozwiązania tego problemu, ale interfejs API jest słabo udokumentowany, mylący i wydaje się, że w dłuższej perspektywie stałby się niemożliwy do utrzymania w przypadku więcej niż kilku wycofań.

Czy nie powinno istnieć sposób, aby deweloperzy bloków mogli zrezygnować z procesu walidacji lub globalny sposób na odzyskanie bloków?

PJ

Z pewnością niczego nie ukrywasz, PJ. Chociaż wiele z tych spraw jest nieco bardziej technicznych, niż zazwyczaj lubię omawiać tutaj w Tawernie, postanowiłem skontaktować się z Riadem Benguella, jednym z wiodących deweloperów Gutenberga, aby uzyskać lepszy wgląd w sytuację.

Zanim zagłębiłem się w jego odpowiedź, zastanowiłem się nad jednym aspektem twojego pytania. Są chwile, kiedy programiści muszą odrzucić stare znaczniki i przejść na coś nowego. Nie powinno to jednak zdarzać się często. Generalnie jest to oznaką złej architektury, jeśli HTML musi być regularnie przerabiany. Prowadzi to również do innych problemów, takich jak brak możliwości utrzymania zmian stylistycznych przez osobę trzecią.

Tworząc bloki lub dowolny rodzaj aplikacji, która generuje kod front-endowy, musisz pomyśleć o tym, jak to powinno wyglądać dzisiaj i za 10 lat. Co się stanie, jeśli użytkownik doda niestandardowy kod CSS, aby nadać styl Twojemu blokowi, a struktura HTML bloku uległa zmianie? Z ich perspektywy Twoja aktualizacja blokowa zepsuła ich witrynę. To samo można powiedzieć o innej wtyczce, która w jakiś sposób rozszerza twoją wtyczkę.

Zapytaj dowolnego autora motywu, jak frustrujące jest to, gdy Gutenberg/WordPress zmienia swoje wyjście blokowe. Chociaż poprawiło się to w ciągu ostatnich kilku lat, bloki stylizacyjne dla edytora i front-endu często były koszmarem konserwacji.

Jako programista zawsze starałem się przemyśleć wszelkie rzeczywiste konsekwencje wprowadzenia tych zmian z perspektywy użytkownika. Powinno to nastąpić od pierwszego dnia, a nie po wydaniu projektu.

W ten sposób wydłuży się czas na wczesnym etapie projektu, gdy po prostu próbujesz wydobyć go z drzwi i trafić w ręce użytkowników. W tym przypadku pomaga cofnięcie się przed wydaniem. Odejdź od komputera. Iść na spacer. Zastanów się nad architekturą swojego projektu i czy jest idealna na dłuższą metę.

„W przypadku wersjonowania/aktualizacji bloków jest to rzeczywiście jeden z obszarów interfejsów API Gutenberga, w których musieliśmy dokonać kompromisów architektonicznych, i zdecydowaliśmy się faworyzować wrażenia użytkownika nad wrażeniami programisty” — powiedział Benguella.

Niezależnie od metody tworzenia, podążanie za podejściem projektowym, czyli user-first experience, pomoże na dłuższą metę.

„Aby właściwie zrozumieć problem, trzeba zrozumieć, jak działają i są edytowane bloki”, powiedział Benguella. „Instancje bloków są obiektami JSON, a interfejs użytkownika edytora manipuluje tym JSON, ale aby zachować kompatybilność wsteczną, zapewnić zachowanie treści użytkownika w najbardziej czytelnym formacie i w jak największym stopniu uwzględnić standardy sieciowe, edytor bloków nie przechowuje obiektu JSON, ale jego serializację HTML w post_content ”.

Ta serializacja jest analizowana i konwertowana do formatu JSON, gdy edytor ponownie ładuje zawartość w celu ponownej edycji. Na końcowych etapach parsowania to od autora bloku zależy, jak zapisać i przeanalizować obiekt.

„A teraz wyobraź sobie, że użytkownik zmienił zapisany kod HTML (serializację) i po prostu umieścił tam dowolną losową zawartość” — powiedział Benguella. „Blok może nie być w stanie poprawnie przeanalizować kodu HTML, ponieważ nie spełnia jego oczekiwań (co zostało zdefiniowane przez autora bloku), co oznacza, że ​​odtworzenie tego obiektu JSON w celu manipulacji nie będzie w tym momencie możliwe ”.

W takim przypadku edytor bloków udostępnia użytkownikowi interfejs umożliwiający podjęcie świadomej decyzji. Mogą próbować „wymusić analizę” bloku JSON lub przekonwertować go na blok HTML lub klasyczny.

Nieprawidłowe wyjście bloku w edytorze WordPress.
Nieprawidłowy blok po zmianie znaczników.

Ten sam rodzaj unieważnienia może się zdarzyć, gdy twórca wtyczki zaktualizuje swój blok. Jednak zamiast zmiany zapisanego kodu HTML, programista zmienił „oczekiwania” bloku — zmieniając sposób, w jaki jest on zapisywany i analizowany.

„Dlatego prosimy programistów bloków o udostępnienie przestarzałych bloków reprezentujących stare znaczniki tego samego bloku” — powiedział Benguella. „Wycofanie może być również traktowane jako prawidłowe, alternatywne źródła dla tego samego bloku. Pozwala to edytorowi na przeanalizowanie starego znacznika po załadowaniu i zapisanie nowego znacznika z powrotem, jeśli w bloku zostanie dokonana aktualizacja.”

WordPress posiada dokumentację dotyczącą wycofania bloków. Nie jest to jednak dokładne. Najlepszym źródłem informacji o deprecjacjach w świecie rzeczywistym jest przeglądanie biblioteki bloków Gutenberga. Nieaktualne bloki mają plik deprecated.js .

Benguella powiedział, że ten system może być frustrujący dla autorów bloków. Jest to szczególnie widoczne w środowisku programistycznym podczas wprowadzania zmian. Skłoniło to programistów do zapytania o metodę wyłączania algorytmu walidacji.

„To jest coś, czego nie chcemy w tej chwili udostępniać, ponieważ, jak wyjaśniono powyżej, walidacja jest również ważna, gdy znaczniki zmieniają się z innego powodu (zewnętrzna edycja, inny edytor itp.)” – powiedział. „Więc może to spowodować utratę treści dla użytkowników bez ich świadomości. W tej chwili pierwszeństwo ma świadomość użytkownika”.

Zespół z czasem ulepszył system walidacji, umożliwiając wprowadzanie drobnych zmian, które nie powodują przerwania stanu blokady. Istnieje również otwarty bilet na ulepszenia w przyszłości.