"Moduli CSS" non ha nulla a che fare con il W3C, piuttosto parte di un processo di costruzione suggerito. Compila il tuo progetto, rinominando i selettori e le classi in modo che diventino unici, mirati ai singoli componenti. Gli stili sono bloccati in quei componenti e non possono essere usati altrove a meno che tu non lo dica esplicitamente!
Al giorno d'oggi siamo abbastanza abituati all'idea che le tecnologie web siano la forza trainante delle app; app Web, app mobili e desktop. Ma a differenza dei semplici siti web statici, le app sono in genere più dinamiche, complesse e spesso sono costituite da componenti anche al di là di ciò che offre Bootstrap o ZURB Foundation. Con l'aumentare della complessità dell'app, la gestione dei CSS può essere un compito infernale.
Nel corso del tempo, sono state sviluppate una miriade di strategie, come OOCSS, ITCSS, BEM, Atomic CSS, ecc. Per mantenere i CSS organizzati, riutilizzabili e (in modo cruciale) scalabile. Queste strategie richiedono che tu e tutti i membri del team seguiate diligentemente le convenzioni.
Tuttavia, prima o poi, la complessità si insinuerà di nuovo e incontrerai regole di stile come le seguenti:
html.progressive-image.js [data-progressive-image], html.progressive-image.js [data-progressive-image] * background-image: none! important; immagine-maschera: nessuna! importante; opacità: 0 .main # section-enhanced-gallery-heroes.homepage-section.enhanced-gallery .with-single-item transform: translate (0, 0)! important
Il problema con i CSS su molti siti Web e app su larga scala è che è così difficile mantenere la specificità bassa che, ad un certo punto, aggiungendo !importante
non può essere evitato. Inoltre, il refactoring dei CSS su una base di codice estesa è complicato in quanto la rimozione di stili potrebbe danneggiare altri componenti.
In questo tutorial, esamineremo i "Moduli CSS" e come può aiutarci a ridurre questi famigerati problemi CSS.
Nota: controlla il repository su Github per supportare esempi di codice.
In breve, "Moduli CSS" è uno strumento che rinomina le classi CSS e gli ID in selettori unici, consentendo di isolare le regole di stile localmente agli elementi o ai componenti assegnati. Supponendo che abbiamo un pulsante, potremmo in genere scrivere le sue regole di stile come segue:
.button background-color: # 9b4dca; border: 0.1rem solid # 9b4dca; border-radius: .4rem; colore: #fff; cursore: puntatore; display: blocco in linea; .button: focus, .button: hover background-color: # 606c76; border-color: # 606c76; colore: #fff; contorni: 0;
Con i moduli CSS queste regole di stile verranno rinominate in qualcosa di simile:
._12We30_button background-color: # 9b4dca; border: 0.1rem solid # 9b4dca; border-radius: .4rem; colore: #fff; cursore: puntatore; display: blocco in linea; ._12We30_button: focus, ._12We30_button: hover background-color: # 606c76; border-color: # 606c76; colore: #fff; contorni: 0;
Se dai siti di grandi dimensioni come Facebook, Instagram o Airbnb tramite DevTools del tuo browser, scoprirai che le classi CSS e gli ID sono nominati proprio con questo tipo di pattern. Ecco un esempio dalla homepage di Airbnb:
Chi ha chiamato la classe con numeri apparentemente casuali?Usare i moduli CSS non ha molto senso se abbiamo un solo componente, quindi espandiamo il nostro esempio a tre componenti e vediamo come configurare il nostro progetto per implementare i moduli CSS.
In questo secondo esempio, costruiremo tre componenti; un pulsante con tre stili diversi. Li chiameremo "pulsante principale", "pulsante di contorno" (noto anche come "pulsante fantasma") e "pulsante di cancellazione". Inseriremo questi pulsanti in una directory separata. Ogni directory conterrà index.css
e index.js
.
Nel index.js
, creiamo l'elemento e assegniamo le classi all'elemento, come segue:
// 1. Importa gli stili dal file index.css. importare stili da './index.css'; / ** * 2. Creazione di un elemento del pulsante e aggiunta della classe da index.css. * @type String * / const button = ''; // 3. Esportare il pulsante da utilizzare negli altri file. esporta pulsante predefinito;
Usando il nuovo importare
direttiva in ES6, importiamo il foglio di stile e leggiamo le classi e gli ID come oggetto JavaScript. Quindi creiamo un elemento e aggiungiamo la classe chiamata .pulsante
utilizzando il JavaScript Templating nativo che è stato introdotto anche in ES6. Infine, esportiamo il nostro elemento in modo che l'elemento possa anche essere importato e riutilizzato negli altri file JavaScript.
Al momento della stesura di questo documento, non tutti i browser hanno implementato le funzionalità JavaScript e la sintassi più recenti dalle specifiche ES6. Pertanto, avremo bisogno di Babel per trasformare quei frammenti in sintassi JavaScript che è compatibile nella maggior parte dei browser.
Il nostro foglio di stile, index.css
, è semplice CSS. Contiene un numero di selettori per lo stile dell'elemento del pulsante.
/ * 1. Pulsante principale * / .button background-color: # 9b4dca; border: 0.1rem solid # 9b4dca; border-radius: .4rem; colore: #fff; cursore: puntatore; display: blocco in linea; font-size: 1.1rem; font-weight: 700; altezza: 3.8rem; letter-spacing: .1rem; line-height: 3.8rem; riempimento: 0 3.0rem; allineamento del testo: centro; decorazione del testo: nessuna; text-transform: maiuscolo; white-space: nowrap; / * Altri stili del pulsante principale qui * /
Uno dei vantaggi dell'utilizzo dei moduli CSS è che non dobbiamo preoccuparci delle convenzioni di denominazione. Puoi ancora utilizzare le tue metodologie CSS preferite come BEM o OOCSS, ma nulla viene applicato; puoi scrivere le regole di stile nel modo più pratico per il componente poiché il nome della classe sarà alla fine namespace.
In questo esempio, chiamiamo tutte le classi del nostro componente pulsante .pulsante
invece di .button-primaria
o .button-outline
.
Lavorando con i CSS all'interno di Shadow DOM ho ancora la vecchia abitudine di usare la notazione BEM anche se non ho * bisogno * di. Incapsulamento di stile FTW!
- Razvan Caliman (@razvancaliman) 31 luglio 2017
Quando carichiamo il index.js
su una pagina HTML, nulla apparirà nel browser. In questo caso, dovremo compilare il codice per renderlo funzionale. Avremo bisogno di installare Babel, Babel Preset per ES2015 (ES6) e Webpack insieme ai seguenti cosiddetti "caricatori" per consentire a Webpack di elaborare i nostri file sorgente.
.js
file e trasformare il codice sorgente con il modulo principale Babel..css
File.css-loader
nella nostra pagina HTML usando il
.Installiamo questi pacchetti con NPM e li salviamo in package.json
file come le nostre dipendenze di sviluppo.
Allo stesso modo di Grunt con il suo gruntfile.js
o Gulp con il suo gulpfile.js
, ora abbiamo bisogno di configurare Webpack usando un file chiamato webpack.config.js
. Di seguito è riportata la configurazione completa del Webpack nel nostro progetto:
var path = require ('percorso'); module.exports = entry: './src/main.js', // 1. output: percorso: path.resolve (__ dirname, 'dist / js'), nome file: 'main.js', modulo: loader: [// 4. test: /\.css$/, utilizzare: [loader: 'style-loader', loader: 'css-loader', opzioni: modules: true, localIdentName: ' [hash: base64: 5] __ [local] '], test: /\.js$/, exclude: / node_modules /, usa: [loader:' babel-loader ', opzioni: preimpostazioni: ['es2015']]
La configurazione dice a Webpack di compilare il nostro file JavaScript principale, main.js, in / dist / js
directory. Abbiamo anche abilitato il moduli
opzione in css-loader
oltre a impostare il modello di denominazione di classe e ID su [Hash: Base64: 5] __ [locale]
. Noi impieghiamo babel-loader
per compilare i nostri file JavaScript ES6.
Una volta installate le dipendenze e configurata la configurazione, importiamo tutti e tre i nostri pulsanti nel file main.js.
// Importa gli elementi del pulsante; import ButtonPrimary da './button-primary'; import ButtonOutline da './button-outline'; import ButtonClear da './button-clear'; // Aggiungi l'elemento al contenuto; document.getElementById ('content'). innerHTML = '$ ButtonPrimary $ ButtonOutline $ ButtonClear';
Quindi eseguire il webpack
comando, come segue:
./node_modules/.bin/webpack
Quando carichiamo /dist/js/main.js
nel browser, dovremmo vedere i nostri pulsanti sono aggiunti con le classi denominate seguendo il modello che abbiamo impostato nel css-loader
. Possiamo anche trovare gli stili aggiunti alla pagina con il stili
elemento.
I pre-processori CSS come LESS e Sass ci permettono di riutilizzare gli stili estendendo altre classi o ID da altri fogli di stile. Con i moduli CSS, possiamo usare il comporre
direttiva per fare la stessa cosa In questo esempio, ho messo le regole di stile comuni che sono condivise tra i nostri tre pulsanti in un altro file e importato la classe dal nuovo file, come segue:
.button / * Estendi la classe .button per applicare gli stili di pulsante di base * / compone: pulsante da "./button.css"; colore: #fff; background-color: # 9b4dca; border: 0.1rem solid # 9b4dca;
Una volta che il codice è stato ricompilato e caricato nel browser, possiamo trovare il pulsante è reso con due classi. Adesso ci sono anche quattro stile
elementi iniettati nella pagina che includono il _3f6Pb__button
classe che contiene le regole di stile comuni dei nostri componenti.
In un progetto reale, probabilmente non utilizzeremmo moduli CSS usando JavaScript semplice. Dovremmo invece utilizzare un framework JavaScript come Vue. Fortunatamente, i moduli CSS sono stati integrati in Vue attraverso il vue-loader
; un caricatore di Webpack che compilerà il .vue
. Di seguito è riportato un esempio di come porteremmo il nostro pulsante principale in a .vue
componente.
In Vue, aggiungiamo il modulo
attributo al stile
elemento, come mostrato sopra, per abilitare i moduli CSS. Quando compileremo questo codice otterremo praticamente lo stesso risultato.
Per alcuni di voi, questo sarà qualcosa di completamente nuovo. È perfettamente comprensibile se il concetto di moduli CSS è un po 'un grattacapo a prima vista. Ricapitoliamo cosa abbiamo imparato sui moduli CSS in questo articolo.
namespacing
i nomi delle classi, riducendo al minimo lo scontro sulla specificità del selettore man mano che la codebase cresce.In questo articolo, abbiamo appena scalfito la superficie dei moduli CSS e di altri strumenti moderni di sviluppo web come Babel, Webpack e Vue. Quindi qui ho messo insieme alcuni riferimenti per approfondire questi strumenti.