Auto-prefix URL — malenkost, ki prihrani minute
cutty.dev prepozna, ko prilepiš naslov brez https://, in ga sam doda. Zveni banalno. V praksi je to razlika med dvema sekundama in klikom na 'poskusi znova'.
V obrazec vpišete allegro.pl. Kliknete. In kaj?
Pri večini skrajševalcev dobite v tem trenutku sporočilo o napaki. Nekaj v slogu "to ni veljavna URL naslovnica". Ker ni https:// na začetku. Tako se vrnete nazaj, dopišete protokol, kliknete še enkrat in šele zdaj imate svojo kratko povezavo.
cutty.dev tega ne naredi. Preprosto sam prilepi https:// in nadaljuje dalje, kot da se nič ni zgodilo.
Vem, kako to zveni. Kot funkcija, ki si komaj zasluži odstavek, kaj štejše celotno objavo. Vendar pa sedim in o tem pišem, ker je ta drobnjak prav v tem trenutku moj mali manifest o tem, kako sploh razmišljam o gradnji orodja za auto-prefix URL in vsem ostalem tem nevidnem olajšavanju.
Dve sekundi proti dvajstesetim
Izračunajmo. Resnično, s številkami, ker drugače je to le prazne besede.
Prva pot: prilepiš, imaš povezavo, zapreš okno. Dve sekundi. Morda tri.
Druga pot: prilepiš, napaka, prebereš sporočilo (sekunda ali dve, da razumeš, o čem govorimo), dodaš protokol, klikneš še enkrat, šele zdaj povezava. Petnajst, dvajset sekund. Plus tisti majhen trenutek iritacije, tisto tiho "aha, protokol", ki sam po sebi nič ne stane, a se kopiči.
Zdaj to pomnožite s tem, koliko razy na mesec prilepite nek adres. Pri meni je to desetine. Pri nekem, ki upravlja z povezavami profesionalno — stotice. Ndenжно se ta "tako nepomemben", da ga težko pomenemo, začne kopičiti v minutah na mesec. Na osebo.
To je prav ta aritmetika, ki jo večina ljudi spregleda, ker se zdi vsak posamezen primer pretežen malo, da bi se zanj skrbel.
Kaj dejansko sedi spodaj
Mehanizem je banalno in tega sploh ne skrivam. Besedilo prilepite v polje. Preden karkoli odleti na strežnik, delček JavaScripta preveri, ali se to, kar ste vpisali, začne z določenim protokolom — http://, https://, ftp://, mailto:, karkoli. Če se ne začne, sistem predvide, da imate v mislih navadno domeno, in na začetek doda https://.
V praksi:
allegro.plse spremeni vhttps://allegro.plgithub.com/twoj-profil/projektvhttps://github.com/twoj-profil/projektwww.gazeta.plvhttps://www.gazeta.pl
In če je protokol že tam, čeprav je nenavaden, ga sistem ne prepiše. Ga pusti in nadaljuje s preverjanjem, kaj z njim storiti. http://example.com gre skozi (dovoljeno). ftp://example.com gre v koš, ker sprejemamo le http in https. javascript:alert(1) pa takoj izleti, ker to ni naslov, temveč poskus vstavljanja nekaj umazanega (klasičen XSS, hvala, ne).
Zakaj imam to jaz, polovica trga pa ne
Tukaj postane zanimivo, ker je odgovor somewhat smešen.
Standardni način validacije naslova v brskalniku je konstruktor new URL(string). In ta konstruktor je nepopustljiv. Brez protokola — vrže napako. new URL("allegro.pl") ti vrne preprosto TypeError in nič več.
In ve kaj? To je pravilno vedenje. Za ogromno večino aplikacij si želite prav to. Toda pri obrazcu za skrajšanje povezav, kjer človek kopira naslov iz pasovnika brskalnika ali iz nečijega sporočila, se ta strogość iz prednosti spremeni v ovira. Ndenжно orodje, ki bi vam moralo prihraniti čas, vas prisili, da popravljate nekaj, česar pa vsekakor popolnoma razume.
Obisk tega je dobesedno nekaj linij:
function sanitizeUrl(input) {
const trimmed = input.trim();
const hasProtocol = /^[a-z][a-z0-9+.-]*:/i.test(trimmed);
const normalized = hasProtocol ? trimmed : "https://" + trimmed;
// dalej leci normalna walidacja przez new URL(normalized)
}
Pet vrstic. Nekoliko sekund manj trenja, vsak dan, za vsakogar, ki prilepa naslove. Iskreno ne vem, zakaj to ni standard povsod. Sumim, da gre na to, da "URL konstruktor preprosto tako deluje" in se nihče ni želel dotakniti tega. Trdnost, ne zloradnost.
Kratek odstop od teme o tem, kaj pomeni "standardno"
Ta zgodba z new URL() je odličen primer česa širšega. Veliko stvari v programiranju, ki veljajo za "tako se dela", je v resnici "tako je prišlo zaradi privzetnih nastavitev neke knjižnice, ki je nihče ni okvestioniral". Konstruktor v strogem načinu (strict mode) ni odločitev oblikovalcev cutty ali konkurence — to je odločitev avtorjev specifikacije URL, sprejeta v popolnoma drugačnem kontekstu, za popolnoma druge namene.
In nato cel trg dedira to privzeto izbiro in jo imenuje "standard". Imam občutek, da se najboljši izdelki rodijo prav tam, kjer se nekdo ustavi in vpraša: počasi, ali to vedenje dejansko koristi mojemu uporabniku ali le moji knjižnici? Najpogosteje je odgovor: knjižnici. In takrat je vredno s petimi vrsticami preiti na stran človeka.
Teh drobnost je več, kot je videti
Auto-prefix je le eden izmed številnih takšnih elementov, ki jih ne boste našli na nobenem seznamu funkcij. Ker če bi jih tam izpisali, bi vsak posebej deloval smešno majhen:
- odstranjevanje presledkov pred validacijo, da naključni presledek na koncu prilepljenega naslova ne pokvari vsega
- ohranjanje sidra, torej
#sectionvhttps://example.com/page#sectionne izgine po skrajšanju - parametri poizvedbe (
?utm_source=test) prehodijo v celoti, nič se ne odreže poti - domene s polskimi znaki,
źdźbło.pl, se samodejno pretvorijo v punycode - poljske črke v lastni končnici se zamenjajo v ASCII (
różowy-linkpostanerozowy-link) - nevznečne protokole —
javascript:,data:,file:— zavrne s specifičnim, razumljivim sporočilom
(Še vedno je načrtovano samodejno dodajanje http:// v https://, ko ciljni strežnik podpira šifriranje. To trenutno še ne deluje v živo, zato se ne bom pretvarjal.)
Vsaka od teh podrobnosti nekomu prihrani pet, deset, trideset sekund in en vzdih. Posamezno ničesar. Skupaj to predstavlja razliko med "deluje OK" in "rad uporabljam".
Kaj bi še rad dopolnil
Seznam želja za prihodnost, ker me mislitevanje o tem preprosto veseli:
- inteligentno prileganje — zaznavanje naslova, skritega v snovi stavka, in izvlečenje samega URL-ja med besedami
- masovno prileganje — seznam naslovov, en na vrstico, in za vsakega takoj ločen kratek povezav »link«
- predlagane končnice — na podlagi naslova ciljne strani predlagati tri »brand« slugge po izbiri
- Open Graph predogled takoj po prileganju, še preden kliknete »skrajšaj«
Vsako od tega je znova "petvrstna funkcija, ki ne izgleda za nič". In vse skupaj? To je prav meja med orodjem, ki je v redu, in takim, po katero posežeš vsak dan brez razmišljanja. Če želiš videti, kako to deluje zdaj, prilepi v cutty.dev karkoli brez protokola — allegro.pl, github.com, news.ycombinator.com — in ugotovi, da ti nič ne stoji na poti.
Na koncu, malo osebno
Dolgo sem mislil, da izdelki zmagujejo z velikimi funkcijami. S tem enim efektnim nekajom, ki ga je mogoče pokazati na slajdu in o katerem bodo ljudje pisali. In ja, včasih je tako.
Čim dlje gradim cutty, čim močnejše čutim, da se zvestoba uporabnika rodi drugje — v tistih stotinah mikrosekundah, ki jih nihče zavestno ne zazna. Ne spomniš se, da je orodje samo dodalo https://. Spomniš se le splošni vtis, da se "nekako dobro uporablja", "ne drazi". Ta vtis ne vzide od nikamor. Sestoji z desetimi petlinejskimi odločitvami, ki jih posamezno nihče ne bi lahko obramil pred samim seboj kot "vrednih časa".
Morda prav v tem je bistvo hantstva. Ne v tistem enem velikem koraku, temveč v vztrajnosti, da se čez čez stoji na strani uporabnika pri obrazcu — tudi če gre za bedno dve sekundi. In ti? Kaj te je zadnjič v kakšnem orodju tako razrazničilo, da je tako drobno, da se je celo sram pred priznanjem? Ker običajno ravno tam leži najboljše delo, ki ga je treba opraviti.