Auto-prefix URL — un detaliu care economisește minute
cutty.dev recunoaște când lipești o adresă fără https:// și o adaugă singur. Sună banal. În practică, este diferența dintre două secunde și un click pe 'încearcă din nou'.
Introduci în formular allegro.pl. Dai click. Și ce?
În majoritatea scurtatoarelor primești în acest moment un mesaj de eroare. Ceva de genul „aceasta nu este o adresă URL validă”. Pentru că lipsește https:// de la început. Așa că te întorci, adaugi protocolul, dai click încă o dată și abia acum ai link-ul tău scurt.
cutty.dev nu face asta. Pur și simplu adaugă singur https:// și continuă mai departe, ca și cum nimic nu s-ar fi întâmplat.
Știu cum sună. Ca o funcționalitate care abia merită un paragraf, fără a vorbi despre întregul articol. Și totuși, stau și scriu despre asta, deoarece tocmai acest detaliu este pentru mine un mic manifest despre modul în care gândesc, în general, construirea instrumentului auto-prefix URL și a tuturor celorlalte facilități invizibile.
Două secunde contra douăzeci
Să numărăm. Într-adevăr, să folosim cifrele, pentru că altfel este doar vorbărie.
Prima cale: lipești, ai link-ul, închizi fereastra. Două secunde. Poate trei.
Calea a doua: dai paste, eroare, citești mesajul (o secundă sau două pentru a înțelege despre ce este vorba), adaugi protocolul, dai click încă o dată, abia acum link-ul. Paisprezece, douăzeci de secunde. Plus acel mic moment de iritare, acel „ah, da, protocolul” spus în șoaptă, care nu costă nimic individual, dar se acumulează.
Acum înmulțește cu numărul de ori în luna în care lipești o anumită adresă. La mine este vorba despre zeci. Pentru cineva care gestionează link-uri profesional — sute. Deodată, acest detaliu „abia demereită de menționat” se acumulează în minute pe lună. Per persoană.
Aceasta este exact aritmetica pe care majoritatea oamenilor o ignoră, deoarece fiecare caz individual pare prea mic pentru a fi luat în considerare.
Ce se află de fapt acolo, la bază
Mecanismul este banal și nu ascund deloc acest lucru. Lipsești textul în câmp. Înainte ca orice să fie trimis pe server, o bucată de JavaScript verifică dacă ceea ce ai scris începe cu un anumit protocol — http://, https://, ftp://, mailto:, orice. Dacă nu începe astfel, sistemul presupune că te referi la un domeniu obișnuit și adaugă https:// în față.
În practică:
allegro.plse transformă înhttps://allegro.plgithub.com/twoj-profil/projektînhttps://github.com/twoj-profil/projektwww.gazeta.plînhttps://www.gazeta.pl
Iar dacă protocolul este deja acolo, oricât de ciudat ar fi, sistemul nu îl suprascrie. Îl lasă și verifică mai departe ce să facă cu acesta. http://example.com trece (permis). ftp://example.com merge la gunoi, deoarece acceptăm doar http și https. Iar javascript:alert(1) este eliminat imediat, deoarece acesta nu este un adresă, ci o încercare de injecție a ceva urât (XSS clasic, mulțumim, nu).
De ce am eu asta, iar jumătate din piață nu
Aici lucrurile devin interesante, deoarece răspunsul este puțin amuzant.
Metoda standard de validare a adresei în browser este constructorul new URL(string). Și acest constructor este rigid. Neînduplecat. Dacă lipsește protocolul — aruncă o eroare. new URL("allegro.pl") îți returnează pur și simplu un TypeError și atât.
Și știi ceva? Aceasta este o comportament corect. Pentru marea majoritate a aplicațiilor, exact asta dorești. Dar într-un formular de scurtare a linkurilor, unde omul copiază adresa din bara de navigare sau dintr-un mesaj al cuiva, această rigoare se transformă dintr-un avantaj într-un obstacol. Deodată, un instrument care ar trebui să îți economisească timpul, te obligă să corectezi ceva ce, totuși, înțelege perfect.
Ocolirea acestui lucru este literalmente câteva linii:
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)
}
Cinci rânduri. Câteva secunde mai puțin de frecare, pe zi, pentru oricine lipește adrese. Sincer nu știu de ce nu este standard peste tot. Suspectez că este vorba despre faptul că „URL constructor funcționează pur și simplu așa” și nimănui nu i-a venit să se atingă de asta. Inerție, nu rea intenție.
O mic digreție despre ce înseamnă „standard”
Această poveste cu new URL() este un exemplu excelent pentru ceva mai larg. Multe lucruri care în software sunt considerate „așa se face”, sunt de fapt „așa a ieșit din setările implicite ale unei anumite biblioteci pe care nimeni nu a contestat-o”. Strict mode-ul constructorului nu este o decizie a designerilor cutty sau a competiției — este o decizie a autorilor specificației URL, luată într-un context complet diferit, pentru utilizări complet diferite.
Apoi întreaga piață moștenește această alegere implicită și o numește „standard”. Am impresia că cele mai bune produse se nasc exact în acele locuri unde cineva s-a oprit și s-a întrebat: stai puțin, acest comportament îi servește utilizatorului meu sau doar bibliotecii mele? De cele mai multe ori, răspunsul este: bibliotecii. Și atunci merită să treci, cu cinci linii de cod, de partea omului.
Aceste detalii sunt mai multe decât se vede
Auto-prefix este doar unul dintre multele astfel de elemente pe care nu le vei găsi în nicio listă de funcționalități. Pentru că, dacă ele ar fi incluse acolo, fiecare în parte ar părea amuzitor de mic:
- eliminarea spațiilor înainte de validare, pentru ca un spațiu accidental la sfârșitul adresei lipite să nu strice totul
- păstrarea ancorelor, adică
#sectionînhttps://example.com/page#sectionnu dispare după scurtare - parametrii de interogare (
?utm_source=test) trec integral, nimic nu este tăiat pe parcurs - domenii cu caractere poloneze,
źdźbło.pl, sunt convertite automat în punycode - literele poloneze din slug-ul propriu sunt înlocuite cu ASCII (
różowy-linkdevinerozowy-link) - protocoale periculoase —
javascript:,data:,file:— sunt respinse cu un mesaj specific și ușor de înțeles
(Este încă planată upgrade-ul automat de la http:// la https://, atunci când serverul de destinație suportă criptarea. Acest lucru încă nu funcționează în direct, așa că nu voi pretinde altfel.)
Fiecare dintre aceste detalii îi economisește cuiva cinci, zece, treizeci de secunde și un oftat. Individual, nimic. Împreună, reprezintă diferența dintre „funcționează OK” și „îmi place să folosesc asta”.
Ce aș mai dori să adaug
Listă de dorințe pentru viitor, deoarece gândul la asta pur și simplu mă bucură:
- lipire inteligentă — detectarea unei adrese ascunse în interiorul unei fraze și extragerea doar a URL-ului dintre cuvinte
- lipire în masă — o listă de adrese, una pe rând, și pentru fiecare un link scurt separat imediat
- sugestii de finaluri — pe baza titlului paginii destinație, propunerea a trei slug-uri branduite pentru alegere
- previzualizare Open Graph imediat după lipire, chiar înainte de a apăsa pe "scurtează"
Fiecare dintre acestea este din nou o „funcție de cinci rânduri care pare să nu fie nimic”. Iar toate împreună? Aceasta este exact granița dintre un instrument care este în regulă și unul la care apelezi în fiecare zi fără să te gândești. Dacă vrei să vezi cum funcționează acum, lipește în cutty.dev orice fără protocol — allegro.pl, github.com, news.ycombinator.com — și vei vedea că nimic nu îți pune piedici.
În final, puțin personal
Am crezut mult timp că produsele câștigă prin funcții spectaculoase. Prin acel lucru impresionant care poate fi arătat pe un slide și despre care vor scrie oamenii. Și, într-adevăr, uneori este așa.
Cu cât construiesc mai mult cutty, cu atât simt mai puternic că loialitatea utilizatorului se naște în altă parte — în acele sute de microsecunde pe care nimeni nu le observă conștient. Nu îți amintești că instrumentul a adăugat singur https://. Îți amintești doar impresia generală că „se folosește destul de bine”, „nu te enervează”. Această impresie nu apare de nicăieri. Este compusă din zeci de decizii de cinci rânduri, pe care nimeni nu le ar apăra individual ca fiind „meritante de timp”.
Poate tocmai în asta constă meseria. Nu într-o singură mișcare mare, ci în perseverența de a te opri, lần după lần, de partea omului la un formular — chiar dacă este vorba despre doar două secunde nesemnificative. Dar tu? Ce te-a enervat recent la vreun instrument, atât de puțin încât ți-ar fi rușine să recunoști? Pentru că, de obicei, tocmai acolo stă cea mai bună muncă de făcut.