Auto-prefix URL — sitnica koja štedi minute
cutty.dev prepoznaje kada nalepite adresu bez https:// i sam je dodaje. Zvuči banalno. U praksi, to je razlika između dve sekunde i klika na „pokušaj ponovo“.
Unosiš u formular allegro.pl. Klikneš. I šta?
U većini skraćivača u ovom trenutku dobijate poruku o grešci. Nešto u stilu "ovo nije ispravan URL". Jer nema https:// na početku. Pa se vratite, dopišete protokol, kliknete još jednom, i tek sada imate svoj kratki link.
cutty.dev to ne radi. Jednostavno sam dodaje https:// i nastavlja dalje, kao da se ništa nije dogodilo.
Znam kako to zvuči. Kao funkcija koja jedva zaslužuje svoj pasus, a da ne govorimo o celom tekstu. Ipak, sedim i pišem o tome, jer je upravo ta sitnica za mene mali manifest toga kako uopšte razmišljam o izgradnji alata za auto-prefix URL i ostatka svih tih nevidljivih olakšica.
Dve sekunde protiv dvadeset
Izbrojimo. Zaista, na brojevima, jer inače je to samo pričanje.
Prvi put: nalepiš, imaš link, zatvoriš prozor. Dve sekunde. Možda tri.
Druga staza: nalepiš, greška, pročitaš poruku (sekunda ili dve da razumeš o čemu se radi), dopišeš protokol, klikneš još jednom, tek sada link. Petnaest, dvadeset sekundi. Plus onaj mali trenutak iritacije, ono tiho „a da, protokol“, što pojedinačno ne košta ništa, ali se gomila.
A sada pomnožite sa onim koliko puta mesečno nalepite neku adresu. Kod mene je to desetine. Kod nekoga ko profesionalno upravlja linkovima — stotine. Odjednom, ova sitnica koja je "jedva vredna pomena" akumulira se u minutima mesečno. Po osobi.
To je upravo ta aritmetika koju većina ljudi zaobilazi, jer svaki pojedinačni slučaj deluje previše sitno da bi se o njemu brinula.
Šta se zapravo nalazi ispod toga
Mehanizam je banalno jednostavan i to uopšte ne krijem. Nalepite tekst u polje. Pre nego što bilo šta ode na server, deo JavaScript-a proverava da li ono što ste uneli počinje nekim protokolom — http://, https://, ftp://, mailto:, bilo šta. Ako ne počinje, sistem pretpostavlja da mislite na običan domen i dodaje https:// na početak.
U praksi:
allegro.plse menja uhttps://allegro.plgithub.com/twoj-profil/projektuhttps://github.com/twoj-profil/projektwww.gazeta.pluhttps://www.gazeta.pl
A ako je protokol već tamo, čak i ako je čudan, sistem ga ne prepisuje. Ostavlja ga i nastavlja da proverava šta dalje da uradi sa tim. http://example.com prolazi (dozvoljeno). ftp://example.com ide u smeće, jer prihvatamo samo http i https. A javascript:alert(1) izbacuje se odmah, jer to nije adresa, već pokušaj ubrizgavanja nečeg gadnog (klasičan XSS, hvala, ne).
Zašto ja ovo imam, a polovina tržišta ne
Ovde postaje zanimljivo, jer je odgovor malo smešan.
Standardni način validacije adrese u pretraživaču je konstruktor new URL(string). I taj konstruktor je tvrdoglav. Bez kompromisa. Nema protokola — izbacuje grešku. new URL("allegro.pl") vraća ti jednostavno TypeError i to je to.
A znaš šta? To je ispravno ponašanje. Za ogromnu većinu aplikacija to je upravo ono što želiš. Ali u formi za skraćivanje linkova, gde čovek kopira adresu iz adresne trake pretraživača ili iz nečije poruke, ta strogoća se pretvara iz prednosti u prepreku. Odjednom alat koji treba da ti štedi vreme, primorava te da ispravljaš nešto što on zapravo savršeno razume.
Zaobilaženje ovoga je bukvalno nekoliko linija:
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 linija. Nekoliko sekundi manje trenja, dnevno, za svakoga ko lepi adrese. Iskreno ne znam zašto ovo nije standard svuda. Sumnjam da je stvar u tome što "URL konstruktor jednostavno tako radi" i nikome se nije dalo do toga da ga dira. Inercija, a ne loša volja.
Mala digresija o tome šta znači "standardno"
Ova priča sa new URL() je odličan primer nečeg šireg. Mnogo stvari u softveru koje se smatraju "tako se to radi" su zapravo "tako je ispalo zbog podrazumevanih podešavanja neke biblioteke koju niko nije osporio". Konstruktor u strict modu nije odluka dizajnera cutty-ja niti konkurencije — to je odluka autora URL specifikacije, doneta u potpuno drugačijem kontekstu, za potpuno druge primene.
A potom celo tržište nasleđuje taj podrazumevani izbor i naziva ga "standardom". Imam utisak da se najbolji proizvodi rađaju upravo na onim mestima gde se neko zaustavio i zapitao: čekaj, da li ovo ponašanje služi mom korisniku ili samo mojoj biblioteci? Najčešće odgovor glasi: biblioteci. I tada vredi sa pet redova koda preći na stranu čoveka.
Ovih sitnica ima više nego što se vidi
Auto-prefix je samo jedan od mnogih takvih elemenata koje nećete pronaći ni na jednom spisku funkcija. Jer da ih tamo upišu, svaki pojedinačno bi izgledao smešno malo:
- uklanjanje razmaka pre validacije, kako slučajni razmak na kraju nalijepljene adrese ne bi pokvario sve
- očuvanje sidra, odnosno
#sectionuhttps://example.com/page#sectionne nestaje nakon skraćivanja - parametri upita (
?utm_source=test) prolaze u celosti, ništa se ne skraćuje usput - domeni sa poljskim znakovima,
źdźbło.pl, automatski prelaze u punycode - poljska slova u sopstvenom nastavku se menjaju u ASCII (
różowy-linkpostajerozowy-link) - opasni protokoli —
javascript:,data:,file:— odbijaju se sa konkretnom, razumljivom porukom
(Još uvek je planirano automatsko podizanje http:// na https://, kada ciljni server podržava enkripciju. To trenutno još uvek ne radi uživo, pa neću da se pravim.)
Svaki od ovih detalja štedi nekome pet, deset, trideset sekundi i jedan uzdah. Pojedinačno ništa. Zajedno to je razlika između „radi OK“ i „volim da ovo koristim“.
Šta bih još želeo da dodam
Lista želja za budućnost, jer mi samo razmišljanje o tome pruža zadovoljstvo:
- inteligentno lepljenje — detektovanje adrese skrivene unutar rečenice i izvlačenje samog URL-a između reči
- masovno lepljenje — lista adresa, jedna po liniji, i automatsko kreiranje posebnog kratkog linka za svaku
- predlozi nastavaka — na osnovu naslova odredišne stranice predložiti tri brendirana sluga (slug) na izbor
- Open Graph pregled odmah nakon lepljenja, još pre nego što kliknete na "skrati"
Svako od ovoga je ponovo "funkcija od pet linija koja ne izgleda kao ništa". A sve zajedno? To je upravo ona granica između alata koji je u redu i onog koji koristiš svakodnevno bez razmišljanja. Ako želiš da vidiš kako to radi sada, nalepi u cutty.dev bilo šta bez protokola — allegro.pl, github.com, news.ycombinator.com — i videćeš da ti ništa ne staje na put.
Na kraju, malo lično
Dugo sam mislio da proizvodi pobeđuju velikim funkcijama. Tom jednom efektnom nečim što se može pokazati na slajdu i o čemu će ljudi pisati. I zaista, ponekad je tako.
Što duže gradim cutty, to jače osećam da se lojalnost korisnika rađa na drugom mestu — u onih stotinu mikrosekundi koje niko svesno ne primećuje. Ne sećaš se da je alat sam dodao https://. Sećaš se samo opšteg utiska da se "nekako dobro koristi", da "ne nervira". Taj utisak ne dolazi niotkuda. Sastoji se od desetina petolinijskih odluka koje pojedinačno niko ne bi odbranio pred samim sobom kao "vredne vremena".
Možda se upravo u tome sastoji zanat. Ne u tom jednom velikom pokretu, već u upornosti da se iznova i iznova stane na strani čoveka kod formulara — čak i ako se radi o jadna dva sekunda. A ti? Šta te je poslednje iznerviralo u nekom alatu toliko sitno da je čak i neprijatno priznati? Jer obično upravo tamo leži najbolji posao koji treba uraditi.