Co się stało
Potrzebowaliśmy oznaczyć, które wpisy w pewnej sekcji są jeszcze robocze. Naturalny odruch: dołożyć do rekordu pole logiczne i nie renderować go nigdzie. Sprawdziliśmy w przeglądarce zawartość sekcji — pola nie było. Wydaliśmy.
Po wydaniu przeczytaliśmy źródło strony na żywym adresie. Pole siedziało w nim obok każdego rekordu, którego dotyczyło. Strona publikowała własną listę wpisów roboczych — dokładne przeciwieństwo tego, po co ta flaga powstała.
Sonda po drzewie dokumentu nie orzeka o tym, czego na stronie NIE MA. Orzeka o tym dopiero kod, który serwer naprawdę wysyła.
Dlaczego tak działa nowoczesny framework
Współczesne frameworki dzielą komponenty na serwerowe i przeglądarkowe. Gdy komponent serwerowy przekazuje dane do przeglądarkowego, framework musi je przesłać — więc zapisuje je w kodzie strony jako gotowy pakiet do odtworzenia. Trafia tam CAŁY przekazany obiekt, nie tylko te pola, które ktoś wyświetla.
Pakiet leży w znacznikach skryptu, poza drzewem treści. Dlatego sonda pytająca „czy w tej sekcji jest taki tekst” odpowiada uczciwie „nie ma” — bo w sekcji faktycznie go nie ma. Jest w tym samym pliku, tyle że w znacznikach skryptu — w praktyce w jednej długiej linii, której nikt nie przewija wzrokiem.
Reguła, która z tego wyszła
Wszystko, co wejdzie do słownika treści strony, jest treścią PUBLICZNĄ — także pola, których żaden komponent nie wyświetla. Metadane o treści (status roboczy, notatka redakcyjna, cokolwiek wewnętrznego) trzymamy poza katalogiem źródeł strony. U nas mieszkają w narzędziu kontrolnym, które w ogóle nie wchodzi do wydania.
Druga połowa reguły dotyczy sprawdzania: żeby orzec, że czegoś na stronie NIE MA, nie wystarczy spojrzeć na to, co widać. Trzeba przeszukać to, co serwer naprawdę wysyła — cały wynik budowania i pobrany kod żywej strony. Od tego incydentu robimy to przy każdym wydaniu dotykającym danych; na razie z listy kontrolnej, bo automat, który odmówi publikacji, dopiero powstanie.
Ta sama zasada ma prostszy wariant, wart sprawdzenia na każdej stronie: jeśli w danych sklepu siedzi cena hurtowa, a wyświetlana jest detaliczna, to obie są publiczne — o ile te dane trafiają do przeglądarki. Odfiltrowane po stronie serwera publiczne nie są. Różnica jest w tym, co serwer wysyła, nie w tym, co rysuje.