{"id":83,"date":"2010-07-19T22:16:10","date_gmt":"2010-07-19T20:16:10","guid":{"rendered":"https:\/\/alistapart.com\/it\/article\/prefisso-o-post-hack\/"},"modified":"2010-07-19T22:16:10","modified_gmt":"2010-07-19T20:16:10","slug":"prefisso-o-post-hack","status":"publish","type":"article","link":"https:\/\/alistapart.com\/it\/article\/prefisso-o-post-hack\/","title":{"rendered":"Prefisso o Post-Hack"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2010\/07\/n10a1.jpg\" border=\"0\" width=\"271\" height=\"183\" style=\"float: right;\" \/>Man mano che il supporto dei browser per i CSS aumenta, inclusi i notevoli progressi del team di IE9, sempre pi\u00f9 autori si stanno immergendo in CSS3. E sul loro cammino stanno incontrando i <em>vendor prefixes<\/em> [prefissi per i produttori, <em>ndr<\/em>]\u2014le propriet\u00e0 precedute da <code>-*-<\/code> come <code>-moz-border-radius<\/code>, <code>-webkit-animation<\/code> e cos\u00ec via.<\/p>\n<p>Forse inevitabilmente, ci sono state un po&#8217; di lamentele rispetto a questi prefissi. Ci sono stati inviti a lasciarli perdere o a riunire tutti i prefissi specifici per ciascun vendor in un singolo prefisso come <code>-beta-<\/code>. La principale riserva nei confronti dei vendor prefix \u00e8 che nessuno in realt\u00e0 vuole scrivere la stessa cosa quattro o cinque volte in fila per ottenere, ad esempio, gli angoli arrotondati su un elemento.<\/p>\n<p>Mentre tale lamentela \u00e8 comprensibile, \u00e8 esattamente l&#8217;opposto di quel dovrebbe accadere. Dovremmo encomiare i produttori che usano i prefissi e realmente incoraggiarli a continuare su questa strada. Oltre a ci\u00f2, ritengo che i prefissi debbano diventare una parte centrale del processo di standardizzazione dei CSS. Sostengo questo non per amore della ripetizione, ma per il desiderio di vedere i CSS evolversi consistentemente. Credo che i prefissi possano effettivamente accelerare l&#8217;avanzamento ed il miglioramento della specifica CSS.<\/p>\n<div class=\"paragrafo\">\n<h2>Guardare al passato con orrore<\/h2>\n<p>Per capire come mai esistano i vendor prefix, \u00e8 istruttivo guardare indietro al <a href=\"http:\/\/www.w3.org\/TR\/CSS2\/box.html\">box model<\/a>, che aveva quasi ucciso i CSS prima del cambio di millennio. Le inconsistenti implementazioni del box model avevano creato una crisi. Per salvarsi dal pericolo, abbiamo dovuto creare un comportamento completamente nuovo in cima ad una caratteristica del markup <em>e<\/em> inventare una nuova classe di hack.<\/p>\n<p>Per i giovincelli presenti tra pubblico e che si sono persi tutto il divertimento, ecco quello che accadde: nella prima tornata di browser che supportavano CSS, Netscape implement\u00f2 il box model che si trova nella specifica CSS. Questo significa che <code>width<\/code> e <code>height<\/code> facevano riferimento alla larghezza e all&#8217;altezza dell&#8217;area del contenuto. Ma Internet Explorer implement\u00f2 il box model intuitivo: il che significa che <code>width<\/code> e <code>height<\/code> dichiaravano le dimensioni del bordo pi\u00f9 esterno della box.<\/p>\n<p>Quale che fosse il vostro preferito tra i due, rimase il fatto che c&#8217;erano due tra i maggiori browser con un&#8217;ampia base di utenti che erano totalmente incompatibili tra loro. Era la fine degli anni &#8217;90 e noi stavamo combattendo a pi\u00f9 non posso per lasciarci alle spalle il pantano dei badge \u201csito ottimizzato per\u202f\u201d e ci trovavamo in una situazione in cui un layout che andava bene in un browser era completamente sfasciato in un altro.<\/p>\n<p>Ad aggravare il problema c&#8217;era il fatto che nessun browser potesse cambiare il suo comportamento per rispecchiare quello dell&#8217;altro. Assumiamo per un momento che il team IE decidesse di cambiare il loro supporto per CSS per riflettere la specifica. Fare ci\u00f2 vorrebbe dire che decine, perfino centinaia di migliaia di siti che fino a quel momento funzionavano in IE si sarebbero rotti.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Immaginate un risultato diverso<\/h2>\n<p>Supponiamo che invece di implementare <code>clip<\/code>, il team di IE avesse implementato <code>-ms-clip<\/code>. In quel caso, un cambio nel comportamento in una successiva specifica non sarebbe stato cos\u00ec difficile da superare. Dal momento che un vendor prefix segnala una propriet\u00e0 come &#8220;in progress&#8221; \u00e8 molto pi\u00f9 facile per un produttore tornare sui suoi passi e cambiarla. Cos\u00ec, il team di IE avrebbe potuto cambiare il modo in cui <code>-ms-clip<\/code> funzionava nella loro release successiva, spiegando agli sviluppatori di aver aggiornato la loro implementazione sperimentale per adattarsi ai cambiamenti nella specifica.<\/p>\n<p>Anche se avevano deciso che ci\u00f2 fosse impossibile da realizzare, il danno della &#8220;cattiva&#8221; implementazione avrebbe messo in quarantena la versione con la propriet\u00e0 con il prefisso. Altri produttori avrebbero implementato la nuova versione di <code>clip<\/code> (usando il loro prefisso), senza essere influenzati da quello che il team IE aveva fatto. Un singolo produttore non avrebbe potuto inchiodare l&#8217;evoluzione della specifica CSS e gli altri produttori a causa delle sue azioni.<\/p>\n<p>Questa \u00e8 la promessa che fanno i prefissi: un modo per segnalare le propriet\u00e0 come &#8220;in progress,&#8221; e, quindi, non \u00e8 necessariamente garantito che funzionino sempre allo stesso modo nelle release future: una scappatoia per i produttori che devono fare quei cambiamenti ed infine una difesa nei confronti delle implementazioni pessime o premature che capitano quando si va per la prima volta in produzione. Aggiungono l&#8217;estremamente necessaria flessibilit\u00e0 di cui si ha  bisogno affinch\u00e9 CSS possa avanzare.<\/p>\n<p>Di sicuro, potremmo semplicemente dire: &#8220;Quando un browser sbaglia rispetto alla specifica, allora va cambiato, anche se rompe il layout dei siti web esistenti.&#8221; Con i prefissi questo diventa molto pi\u00f9 semplice da raggiungere, grazie agli allarmi che i prefissi impersonano. Senza i prefissi diventa molto pi\u00f9 difficile, perfino impossibile. Microsoft non ha mai cambiato il modo in cui gestisce <code>width<\/code> e <code>height<\/code> nelle pagine legacy&#8212;al contrario, ha usato il DOCTYPE switching per comportarsi in maniera differente sulle nuove (in teoria pi\u00f9 &#8220;standards compliant&#8221;) pagine. Era un trucco utile e necessario, ma quel tipo di trucco ha funzionato una sola volta.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Soffriamo ancora adesso<\/h2>\n<p>Affinch\u00e9 non pensiate che tutta questa pazzia sia un artefatto storico, eccovi due esempi di inconsistenze che accadono <em>al giorno d&#8217;oggi<\/em>:<\/p>\n<ul>\n<li>\n<p>I browser Mozilla e WebKit rendono il blurring del <code>box-shadow<\/code> in modi molto diversi e nessuno dei due \u00e8 completamente conforme alla specifica. Mentre sto scrivendo questo paragrafo, c&#8217;\u00e8 in corso un lungo ed accalorato dibattito sulla mailing list <a href=\"http:\/\/lists.w3.org\/Archives\/Public\/www-style\/\" title=\"www-style mailing list al W3C\">www-style<\/a>. Almeno una, e forse entrambe, le implementazioni dovranno cambiare il modo in cui gestiscono il blurring dell&#8217;ombreggiatura per ottenere l&#8217;interoperabilit\u00e0. La stessa cosa vale per qualsiasi implementazione Microsoft o Opera.<\/p>\n<\/li>\n<li>\n<p>I browser Mozilla e WebKit supportano entrambe i gradienti, ma usano sintassi <strong>radicalmente<\/strong> diverse per ottenere lo stesso risultato base. Ora, immaginate un mondo in cui i produttori avessero implementato i gradienti senza i prefissi. Avreste tre scelte:<\/p>\n<ol>\n<li>Selezionare quale browser mostra un gradiente e quale non lo fa.<\/li>\n<li>Usare i CSS hacks o il browser sniffing per mandare diversi stili a diversi browser.<\/li>\n<li>Decidere di non usare affatto i gradienti.<\/li>\n<\/ol>\n<p>E ci sono <em>tre<\/em> scelte qui solo perch\u00e9 i gradienti utilizzano sintassi per i valori estremamente differenti, aprendo cos\u00ec la porta ad all&#8217;opzione numero uno. In un caso in cui le implementazioni usano la stessa sintassi per i valori ma si hanno diversi effetti &#8212;cos\u00ec come succedeva con <code>clip<\/code>&#8212; allora sono possibili solo le due ultime opzioni: hack e sniff per mandare stili totalmente differenti o semplicemente per non usarlo.<\/p>\n<\/li>\n<\/ul>\n<p>Abbiamo gi\u00e0 visto questo film tante volte nel corso della storia di CSS. Non ci sono motivi per volerlo riguardare. Era gi\u00e0 abbastanza brutto la prima dozzina di volte.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Prefisso o post-hack<\/h2>\n<p>Ma i prefissi sono migliori? Dopo tutto, si \u00e8 detto che i vendor prefixes sono i nuovi CSS hacks. Come ha evidenziato Aaron Gustafson in un <a href=\"http:\/\/www.alistapart.com\/articles\/stop-forking-with-css3\/\">recente articolo<\/a>, questo:<\/p>\n<pre><code>\n\t-moz-border-radius: 10px 5px;\n\t-webkit-border-top-left-radius: 10px;\n\t-webkit-border-top-right-radius: 5px;\n\t-webkit-border-bottom-right-radius: 10px;\n\t-webkit-border-bottom-left-radius: 5px;\n \tborder-radius: 10px 5px;\n     <\/code>\n  <\/pre>\n<p>ricorda molto da vicino questo:<\/p>\n<pre>\n\t<code>\n\t  padding: 10px;\n\t  width: 200px;\n\t  w\\idth: 180px;\n\t  height: 200px;\n\t  heigh\\t: 180px;\n\t<\/code>\n  <\/pre>\n<p>In termini di ripetizione e seccatura, s\u00ec, i due sono molto simili. Ma sono fondamentalmente diversi in questo: i prefissi ci danno controllo sul nostro destino di hacking. In passato, abbiamo dovuto inventare un insieme di prodezze del parser solo per ottenere implementazioni inconsistenti che agissero allo stesso modo una volta che avevamo scoperto la loro inconsistenti. Era un approccio totalmente reattivo. I prefissi sono un approccio proattivo.<\/p>\n<p>Inoltre, i prefissi sono un hack temporaneo. Man mano che il tempo passa e che le implementazioni diventano consistenti, i browser abbandoneranno i prefissi. Da l\u00ec in poi, gli autori saranno in grado di scrivere una riga per <code>border-radius<\/code> invece di pi\u00f9 di sei righe di CSS. Senza di essi, stiamo solo aspettando la prossima implementazioni scombinata che ci obblighi a supportarlo attraverso gli hack per anni e anni.<\/p>\n<p>Ecco perch\u00e9 la creazione di un prefisso unificato, come <code>-beta-<\/code> o <code>-w3c-<\/code>, \u00e8 almeno mezzo passo indietro: preserverebbe l&#8217;abilit\u00e0 dei produttori di segnare le propriet\u00e0 come &#8220;in progress&#8221; e apportare i cambiamenti necessari ma sfortunatamente, priverebbe completamente gli autori dell&#8217;abilit\u00e0 di omettere, o perfino dare un valore differente ad un particolare browser se ha un&#8217;implementazione inconsistente. Dal punto di vista di un autore, un prefisso unificato non \u00e8 migliore di un mondo senza prefissi.<\/p>\n<p>A volte, mi sento allo stesso modo nei confronti dei metodi di pre-processing per gestire i prefissi, sia lato server (usando tool come Less) sia lato client (uno qualsiasi dei framework JS). Quando si usano questi tool, \u00e8 possibile semplicemente scrivere dichiarazioni <code>border-radius<\/code> e far s\u00ec che il tool lo espanda nella lista richiesta di dichiarazioni con prefisso. Da un lato, sono un modo veramente utile di ridurre il numero di cose da scrivere e mantengono l&#8217;authoring bello e pulito. Dall&#8217;altro, sono una sorta di prefissi unificati o assenza di prefissi: \u00e8 sufficiente un&#8217;implementazione brutta da parte di un browser per rompere le pagine.<\/p>\n<p>Il vantaggio \u00e8 che se qualcosa viene fatto un po&#8217; alla carlona, ciascun autore pu\u00f2 tornare indietro, disabilitare il pre-processor e scrivere a mano i prefissi. In alternativa, il pre-processor pu\u00f2 essere aggiornato per gestire il problema. Comunque sia, si tratta di un piccolo overhead cognitivo in aggiunta per l&#8217;autore, ma non \u00e8 troppo.<\/p>\n<p>Lo svantaggio \u00e8 soprattutto filosofico, ma non \u00e8 per questo meno importante: nascondendo le propriet\u00e0 con prefisso dietro ad un processor, gli autori potrebbero dimenticarsi che quello che stanno usando \u00e8 sperimentale e soggetto a cambiamenti. Cognitivamente, potrebbero cominciare a trattare quello che stanno usando come radicato e stabile, quando in realt\u00e0 potrebbe non essere cos\u00ec.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Fare in modo che i prefissi siano davvero importanti<\/h2>\n<p>Credo cos\u00ec fermamente che i vendor prefixes siano una buona cosa che mi sono preparato per fare il prossimo passo logico: i vendor prefixes dovrebbero essere resi pi\u00f9 centrali nel processo degli standard. Dovrebbero essere <em>richiesti<\/em> tra le nuove propriet\u00e0 implementate e dovrebbero essere il meccanismo attraverso il quale viene dichiarata l&#8217;interoperabilit\u00e0.<\/p>\n<p>Ecco cosa intendo: supponete che qualcuno inventi una nuova propriet\u00e0 chiamata <code>text-curl<\/code>. Immediatamente, tre produttori la implementano. A ciascuno di essi dovrebbe essere <em>richiesto<\/em> di aggiungere un vendor prefix alla loro implementazione. In questo modo vedremmo cose cos\u00ec:<\/p>\n<pre>\n    <code>\n\th1 {\n\t  -webkit-text-curl: minor;\n\t  -moz-text-curl: minor;\n\t  -o-text-curl: minor;\n\t  text-curl: minor;\n\t}\n    <\/code>\n  <\/pre>\n<p>Nel tempo, i produttori rifiniscono le loro implementazioni in risposta ai bug report e ai chiarimenti del Working Group. Alla fine, il Working Group decide che due delle tre implementazioni sono completamente interoperabili. Queste implementazioni poi supportano il puro <code>text-curl<\/code>. Il terzo no.<\/p>\n<p>A questo punto, gli autori potrebbero decidere di semplificare i loro stili cos\u00ec:<\/p>\n<pre>\n    <code>\n\th1 {\n\t    -webkit-text-curl: minor;\n\t    text-curl: minor;\n\t}\n    <\/code>\n  <\/pre>\n<p>Invece che far proliferare gli hack nel tempo, li faranno sparire. Alla fine, avremo bisogno di una singola riga <code>text-curl<\/code>.<\/p\n  \n\n<p>Quindi, cosa accade quando una nuova implementazione fa il suo debutto? Usa il prefisso nella sua prima realizzazione, non importa quante implementazioni gi\u00e0 interoperabili ci sono. Questo potrebbe voler dire che dovremmo tornare indietro e cambiare il CSS perch\u00e9 dica:<\/p>\n<pre>\n    <code>\n      h1 {\n\t-ms-text-curl: minor;\n\ttext-curl: minor;\n\t}\n    <\/code>\n  <\/pre>\n<p>Poi, non appena il Working Group giudica interoperabile l&#8217;implementazione di <code>-ms-text-curl<\/code>, il prefisso pu\u00f2 essere messo da parte nella nuova release di IE. A questo punto il CSS pu\u00f2 essere ridotto ad una singola riga senza prefisso. Di nuovo, il numero di hack diminuisce nel tempo.<\/p>\n<p>Ovviamente, ciascuno di questi produttori continuer\u00e0 a supportare le propriet\u00e0 con i prefissi, cos\u00ec anche se non togliamo le linee con i prefissi, ciascun browser che li supporta riconoscer\u00e0 la propriet\u00e0 senza prefisso ed user\u00e0 quella (dal momento che viene dopo la dichiarazione con il prefisso). Per ogni browser che implementa la versione con i prefissi che non riesce ad avere un proprio stato senza prefisso, la sua propriet\u00e0 con il prefisso funzioner\u00e0 ancora. Anche se il CSS non verr\u00e0 mai pi\u00f9 toccato, continuer\u00e0 a funzionare.<\/p>\n<p>Detto ci\u00f2, tornate per un momento all&#8217;epoca in cui il Working Group ha detto che due implementazioni erano interoperabili e potevano cos\u00ec eliminare i prefissi. Questa cosa ha un duplice scopo: primo, come ho detto prima, segnala che una propriet\u00e0 ha sufficiente interoperabilit\u00e0 per permettere il progresso nel processo degli standard.<\/p>\n<p>Ma l&#8217;altra cosa &#8212;e questo \u00e8 intuitivamente pi\u00f9 importante&#8212; \u00e8 che costringe i produttori ed il Working Group a lavorare insieme per inventare test necessari a determinare l&#8217;interoperabilit\u00e0. Questi test possono poi guidare quelli che seguiranno, aiutandoli a raggiungere uno stato di interoperabilit\u00e0 molto pi\u00f9 velocemente. Potrebbero letteralmente rilasciare l&#8217;implementazione con i prefissi in una public beta ed eliminare i prefissi nella successiva release.<\/p>\n<p>Questo capovolge il modo in cui si fanno le cose adesso. Cos\u00ec com&#8217;\u00e8, il processo \u00e8 impostato in maniera tale che quando un qualunque modulo CSS raggiunge lo stage di Candidate Recommendation, i produttori possono eliminare i prefissi dalle propriet\u00e0 in quel modulo. Ma questo apre di nuovo la possibilit\u00e0 di un&#8217;altra implementazione scombinata e di un futuro di hack per aggirare l&#8217;errore.<\/p>\n<p>Come proposto qui, ad un modulo sarebbe permesso di raggiungere la Candidate Recommendation una volta che tutte le sue propriet\u00e0 abbiano avuto almento due implementazioni senza prefisso nelle release pubbliche. Qualsiasi implementazione che venga dopo comincer\u00e0 con i prefissi e li eliminer\u00e0 una volta che avranno provato, nelle release pubbliche, che le loro implementazioni con prefisso siano compatibili con quelle esistenti senza prefisso. Invece di essere un azzardo minore, le propriet\u00e0 senza prefisso saranno tanto simili ad una garanzia come non abbiamo mai visto finora.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Conclusioni<\/h2>\n<p>Se la storia dei web standard ci ha mai insegnato qualcosa \u00e8 che gli hack sono necessari. Caricando dal davanti gli hack usando i vendor prefixes e conservandoli come reliquie nel processo degli standard, possiamo effettivamente sistemare alcuni dei potenziali problemi con il processo e possibilmente accelerare lo sviluppo CSS.<\/p>\n<p>Quindi, la prossima volta che vi troverete a lamentarvi riguardo la quadruplicazione di una stessa cosa all&#8217;interno di una dichiarazione, una volta per ciascun browser, ricordatevi che la sofferenza \u00e8 solo temporanea. E&#8217; un po&#8217; come un vaccino&#8212; la puntura fa mal al momento, \u00e8 vero, ma \u00e8 un male molto minore rispetto a quello che previene. E in questo caso, vi state vaccinando contro un brutto caso di parser hacking e browser sniffing che durer\u00e0 per anni. Abbiamo gi\u00e0 sofferto questa lunga piaga una volta. I prefissi, se usati propriamente, scanseranno un&#8217;altra epidemia per molto tempo.<\/p>\n<p>Illustrazioni dell&#8217;articolo: {carlok}<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Vendor prefixes: segno premonitore o minaccia? Man mano che il supporto dei browser (incluso IE9) ci spinge a tuffarci in CSS3, i vendor prefixes come -moz-border-radius e -webkit-animation possono mettere alla prova le nostre coscienze e la nostra pazienza. Ma mentre a nessuno piace particolarmente scrivere la stessa cosa quattro o cinque volte di fila, i prefissi possono effettivamente accelerare l&#8217;avanzamento ed il perfezionamento di CSS. Il re dei CSS Eric Meyer ci spiega perch\u00e9.<\/p>\n","protected":false},"author":818,"featured_media":7000583,"comment_status":"open","ping_status":"open","template":"","categories":[242,244,23],"tags":[],"coauthors":[304],"class_list":["post-83","article","type-article","status-publish","has-post-thumbnail","hentry","category-browser","category-css","category-numero-10-20-luglio-2010"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/article\/83","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/article"}],"about":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/types\/article"}],"author":[{"embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/users\/818"}],"replies":[{"embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/comments?post=83"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/media\/7000583"}],"wp:attachment":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/media?parent=83"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/categories?post=83"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/tags?post=83"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/coauthors?post=83"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}