
Vienas CSS kintamasis, penki peržiūros ratai ir Swift įrankių grandinė, kuri melavo
GeekBye v2.0.7 padarė visą perdangą reguliuojamai permatomą — kas skamba kaip vienos eilutės CSS pakeitimas, tačiau tikrai juo nebuvo. Tikroji istorija yra tai, ką pagavo kodo peržiūra: du paviršiai, kurie atsisakė blukti, įrašų juosta, kuri prie to paties permatomumo atrodė ne taip, ir sukompiliuotas dvejetainis failas, kuris svyravo 672 baitais, nes mūsų pačių dokumentai peržiūrėtojui nurodė neteisingą Swift versiją.
„Padaryk perdangą permatomą" yra tokia užduotis, kuri skamba kaip slankiklis ir CSS opacity savybė. GeekBye v2.0.7 pristatė būtent tokį vartotojui matomą rezultatą — vieną reguliuojamą „šviesų režimą", leidžiantį matyti pro asistento skydelius į tai, kas yra už jų. Bet įdomiausia šio leidimo dalis yra ne funkcija. Tai penki peržiūros ratai, kurių prireikė, kad viskas būtų padaryta teisingai, ir karo istorija apie sukompiliuotą dvejetainį failą, kuris pakeitė dydį, nes mūsų pačių dokumentacija melavo peržiūrėtojui.
Teisingas būdas padaryti visą sąsają permatomą
Naivus šio dalyko variantas — pabarstyti permatomumo reikšmę per kiekvieną skydelio komponentą ir laikyti darbą atliktu. Tai priežiūros spąstai: tuzinas įkoduotų reikšmių, kurios nutolsta viena nuo kitos vos tik kas nors paliečia bent vieną.
Vietoj to v2.0.7 naudoja vieną bendrą CSS pagalbinę klasę ir atskiro paviršiaus žymenį. Yra viena overlay-surface klasė, kuri apskaičiuoja skydelio foną iš dviejų pasirinktinių savybių: bazinio permatomumo, kurį kiekvienas paviršius deklaruoja pats sau (valdymo juosta, pokalbis, transkripto burbulai, kodo blokai ir taip toliau — kiekvienas pasirenka savo), ir globalaus permatomumo daugiklio, kuris keliauja ant perdangos šaknies ir atspindi vartotojo slankiklio nustatymą. Kiekvienas paviršius nuskaito tą patį daugiklį; kiekvienas išlaiko savo charakterį. Svarbiausia — mastelis keičiamas tik skydelio fonui — tekstas, ikonos ir backdrop-blur lieka pilnai atvaizduoti, todėl „permatomas" niekada nereiškia „neįskaitomas".
Du sprendimai tame dizaine verti paminėjimo, nes jie yra skirtumas tarp funkcijos, kuri padeda, ir tokios, kuri generuoja pagalbos užklausas:
- Numatytoji reikšmė yra visiškai neperšviečiama. Permatomumo nustatymas pristatomas ties 100 % — jokio poveikio. Niekieno perdanga staiga netapo peršviečiama po atnaujinimo; permatomumas yra ten, kai jo ranka siekiate, ir nematomas, kol to nepadarote.
- Nustatymas patikrinamas apsaugos požiūriu. Yra vienas tiesos šaltinis min, max, numatytajai reikšmei ir žingsniui, ir normalizatorius, kuris apsaugo tuščią / trūkstamą atvejį. Tai svarbu dėl JavaScript spąstų:
Number(null)yra0, todėl trūkstamas nustatymas, naiviai priverstinai konvertuotas, pastumtų perdangą į labiausiai permatomą būseną vietoj jos numatytosios. Normalizatorius sugauna tai, kol tai neįvyko.
Patempkite slankiklį ir visa perdanga persidažo gyvai, įrašinėjimo metu, nes kiekvienas paviršius yra prenumeruotas tam pačiam nustatymui. Jokio paleidimo iš naujo, jokio perkrovimo.
Ką pagavo peržiūra (ir ko vieno monitoriaus testas niekada nebūtų)
Štai kur „vienas CSS kintamasis" nustojo būti paprastas. Peržiūroje išryškėjo trys klaidos, ir dvi iš jų yra ta pati pamoka su skirtingomis kepurėmis.
Skydelis, kuris nenorėjo blukti. Klaviatūros nuorodų perdanga liko atkakliai vientisa, kol visa kita tapo permatoma. Priežastis: ji atvaizduojama už DOM pomedžio, kuris neša permatomumo kintamąjį, todėl niekada nepaveldėjo reikšmės, sklindančios žemyn nuo perdangos šaknies. CSS pasirinktinės savybės paveldimos per DOM medį — ir jei mazgas iš tikrųjų nėra vietos, kur nustatote kintamąjį, palikuonis, jis tyliai negauna nieko. Sprendimas buvo nustatyti kintamąjį lokaliai ir tame skydelyje.
Užvedimo atspalvis, kuris išnyko. Fn/Assist mygtukai prarado savo žydrą užvedimo švytėjimą. Permatomumo pagalbinė klasė nustatė foną su !important (jis privalo nugalėti prieš paviršiaus numatytąsias reikšmes), ir tai nuvertė hover: fono atspalvį tame pačiame elemente. Specifiškumo susidūrimas. Sprendimas buvo padaryti užvedimo atspalvį lygiai taip pat pabrėžtą, kad jis galėtų atsikovoti užvedimo metu.
Abi tos yra ta pati esminė tiesa: CSS kintamojo kaskada yra tikra korektiškumo riba, o ne stilizavimo detalė. Paveldėjimas ir specifiškumas nusprendžia, ar jūsų reikšmė apskritai pasiekia elementą, ir nei vienas nepasirodo ekrano nuotraukoje, kol nebūna klaidingas.
Tas pats permatomumas, kitoks vaizdas. Subtiliausia iš visų: įrašų juosta ir laukimo juosta buvo nustatytos į identišką bazinį permatomumą, ir vis tiek atrodė aiškiai skirtingai. Kodėl? Įrašinėjimo piliulė naudojo sunkesnį backdrop-blur, o stiprus suliejimas virš tamsaus fono vidutiniškai artėja link tamsesnio rezultato — todėl vienodas permatomumas sukūrė nevienodą išvaizdą. Ji taip pat turėjo silpną apvadą ten, kur laukimo juosta turėjo ryškų gradientinio žiedo kraštą. Sprendimas suderino suliejimo lygį ir žiedą. Pamoka įsitvirtino: vienodas permatomumas nėra vienoda išvaizda, kai į paveikslą įsijungia suliejimas. Permatomumas yra sąveikaujančių efektų sistema, o ne vienas skaičius.
Dvejetainis failas, kuris pakeitė dydį, nes dokumentai melavo
Dabar karo istorija, ir tai mano mėgstamiausia rūšis — ta, kur įrankiai ir dokumentai nesutaria, o kruopštus peržiūrėtojas pakliūva į kryžminę ugnį.
GeekBye pristato kelis iš anksto sukompiliuotus Swift dvejetainius failus (natyvūs pagalbininkai tokiems dalykams kaip susitikimų aptikimas). Kadangi sukompiliuotas dvejetainis failas yra įrašytas į repozitoriją, kiekvienas kūrėjas privalo jį sukompiliuoti su tiksliai ta pačia Swift versija — skirtingos įrankių grandinės iš identiško šaltinio pagamina skirtingus baitus, o tai reikštų fantominį git konfliktą kaskart, kai kas nors perkompiliuoja. Todėl yra skriptas, kuris užtikrina vieną konkrečią versiją: Swift 6.3.x, tikrinamą kūrimo metu.
Šio leidimo peržiūros metu peržiūrėtojas pažymėjo, kad dvejetainis failas turėtų būti perkompiliuotas, kad atitiktų „repozitorijos privalomą įrankių grandinę". Kūrėjas padarė būtent tai — ir dvejetainio failo dydis pasikeitė nuo 89,184 baitų iki 88,512. Commit'o žinutėje netgi buvo parašyta, kad tai „atkuria baitiškai stabilų rezultatą" perkompiliuojant su Swift 6.2.1, „repozitorijos privaloma įrankių grandine".
Tik 6.2.1 buvo neteisinga versija. Kūrimą užtikrinantis skriptas reikalavo 6.3.x. Problema buvo ta, kad tekstinė dokumentacija — README ir bendradarbiavimo gairės — keliose vietose vis dar sakė 6.2.1. Taigi sąžiningas peržiūrėtojas ir sąžiningas kūrėjas, abu bandydami padaryti teisingą dalyką, sekė dokumentais tiesiai į tai, kad įrašytų būtent tą artefaktą, kurio atmesti egzistuoja vykdymą užtikrinantis skriptas. 6.2.1 dvejetainis failas 6.3.x repozitorijoje yra tikslus nuokrypis, kuris sugriautų kiekvieno kito kūrėjo švarų perkompiliavimą.
Kitas commit'as tai ištaisė — ir tas taisymas yra esmė. Jis ne tik perkompiliavo dvejetainį failą atgal į jo 6.3.x formą (dydis atkurtas iki 89,184, tiksliai ten, kur prasidėjo). Jis taip pat ištaisė pasenusias „6.2.1" nuorodas dokumentuose, kad spąstai nebegalėtų vėl užsitrenkti. Dvejetainis failas svyravo 672 baitais pirmyn ir atgal per du commit'us, ir tikroji klaida niekada nebuvo dvejetainis failas. Tai buvo, kad du tiesos šaltiniai — vykdymą užtikrinantis skriptas ir rašyti dokumentai — nesutarė, o žmogus pasitikėjo neteisingu.
Trys dalykai, kurių išmokė šis leidimas
- CSS kintamojo kaskada yra korektiškumo riba. Dvi iš trijų peržiūros klaidų susivedė į kintamąjį, kuris nebuvo paveldėtas, ir
!important, kuris nuvertė užvedimo būseną. Jei reikšmė turi pasiekti elementą per paveldėjimą arba nugalėti per specifiškumą, tas kelias yra logika — patikrinkite jį kaip logiką, o ne kaip stilizavimą. - Vienodi parametrai gali duoti nevienodus rezultatus. Įrašų juosta ir laukimo juosta dalijosi permatomumu ir vis tiek atrodė skirtingai, nes kitoks suliejimas pakeitė rezultatą. Kai suvienijate vizualinę sistemą ties vienu skaičiumi, patikrinkite, ar kiti kintamieji aplink kiekvieną paviršių tyliai nekeičia to, ką tas skaičius reiškia.
- Kai dokumentai ir vykdymo užtikrinimas nesutaria, taisykite nesutarimą — o ne vien simptomą. Klaida buvo ne blogas dvejetainis failas; tai buvo dokumentas, kuris įvardijo neteisingą įrankių grandinę, ir vykdymą užtikrinantis skriptas, kuris sakė kitaip. Dvejetainio failo perkompiliavimas gydo simptomą. Priversti kiekvieną tiesos šaltinį sutarti yra tikrasis sprendimas, nes kitas peržiūrėtojas irgi pasitikės dokumentais.
GeekBye v2.0.7 pristatė vienodą permatomumą, visi kraštutiniai atvejai peržiūrėti ir įrankių grandinės dokumentai sutvarkyti. Tai paskutinis iš „tylaus meistriškumo" leidimų prieš patikimumo sprintą, kuris po jo sekė. Apie pamatą po juo skaitykite ko iš tikrųjų reikalauja antra versija (v2.0.0); apie giminingą šlifavimo leidimą — rami programinė įranga: mirgėjimo pataisa ir atsakymo režimo žetonas (v2.0.3 + v2.0.5); o apie tai, kaip perdanga lieka paslėpta skambučio metu — kaip likti nematomam ekrano dalijimosi metu.