È possibile importare un'intera directory in sass usando @import?


209

Sto modularizzando i miei fogli di stile con i parziali SASS in questo modo:

@import partials/header
@import partials/viewport
@import partials/footer
@import partials/forms
@import partials/list_container
@import partials/info_container
@import partials/notifications
@import partials/queues

c'è un modo per includere l'intera directory dei parziali (è una directory piena di SASS-parziali) come @import compass o qualcosa del genere?


3
Non la risposta ma utile: SASS può importare più file in un'unica importazione, come @import 'partials/header', 'partials/viewport', 'partials/footer';.
llobet

Risposte:


201

Se si utilizza Sass in un progetto Rails, la gemma sass-rails, https://github.com/rails/sass-rails , presenta l'importazione globale.

@import "foo/*"     // import all the files in the foo folder
@import "bar/**/*"  // import all the files in the bar tree

Per rispondere alla domanda in un'altra risposta "Se importi una directory, come puoi determinare l'ordine di importazione? Non c'è modo che non introduca un nuovo livello di complessità."

Alcuni sosterrebbero che l'organizzazione dei file in directory può RIDURRE la complessità.

Il progetto della mia organizzazione è un'app piuttosto complessa. Ci sono 119 file Sass in 17 directory. Questi corrispondono approssimativamente ai nostri punti di vista e sono utilizzati principalmente per le regolazioni, con il sollevamento pesante gestito dalla nostra struttura personalizzata. Per me, alcune righe di directory importate sono un po 'meno complesse di 119 righe di nomi di file importati.

Per indirizzare l'ordine di caricamento, inseriamo i file che devono essere caricati per primi (mixin, variabili, ecc.) In una directory a caricamento anticipato. Altrimenti, l'ordine di caricamento è e dovrebbe essere irrilevante ... se stiamo facendo le cose correttamente.


7
oppure aggiungi @import "*"(in application.css.scss) se i tuoi file css / scss del controller si trovano nella cartella "app / assets / stylesheets" insieme a application.css.scss.
Magne,

questa "gemma" è buggy e non funziona su Windows, vedi questo problema che è stato aperto per molto tempo e sostanzialmente significa che è completamente rotto github.com/chriseppstein/sass-globbing/issues/3
pilavdzice

Stai parlando della gemma sconvolgente di Chris Eppstein. La mia risposta usa la gemma sass-rails, che credo sia diversa. Non sono su Windows, ma non vedo alcun problema relativo alla gemma sass-rails.
Dennis Best,

1
Questo non ha funzionato per me - I globbing sono stati suddivisi in singole linee di vanilla css @import di singoli file. Che brutalmente, ha funzionato in sviluppo, ma non in produzione (poiché c'è solo un percorso di asset radice di application.css in produzione)
Peter Ehrlich,

5
Ha funzionato benissimo per me, grazie per questo suggerimento. Sono piacevolmente sorpreso che dicendo @import "*"in application.scss includa tutti gli altri file presenti nella stessa directory ma non includa application.scss ... Mi aspettavo di ottenere un bug di loop infinito.
Topher Hunt,

94

Questa funzione non farà mai parte di Sass. Uno dei motivi principali è l'ordine di importazione. Nel CSS, i file importati per ultimi possono sovrascrivere gli stili indicati in precedenza. Se importi una directory, come puoi determinare l'ordine di importazione? Non c'è modo che non introduca un nuovo livello di complessità. Mantenendo un elenco di importazioni (come hai fatto nel tuo esempio), sei esplicito con l'ordine di importazione. Questo è essenziale se si desidera poter sovrascrivere con sicurezza gli stili definiti in un altro file o scrivere mixin in un file e utilizzarli in un altro.

Per una discussione più approfondita, visualizza questa richiesta di funzionalità chiusa qui:


260
per i file css ben strutturati, l'ordine di inclusione non dovrebbe importare
Milovan Zogovic,

57
@MilovanZogovic Fare affidamento pesantemente sulle sostituzioni ha un odore di codice, ma non c'è nulla di improprio nell'uso della cascata. È come è stata progettata la lingua.
Brandon Mathis,

34
@BrandonMathis Capisco la purezza teorica qui, ma in un'implementazione (mia e presumo corrosa) puoi scegliere di scrivere il tuo CSS in modo tale che i diversi file non abbiano alcun impatto l'uno sull'altro. Ho una directory chiamata "moduli" con file che contengono ciascuno una diversa regola di classe CSS. Voglio che tutti i file in quella directory siano inclusi, e il loro ordine non è, e in base alla progettazione non sarà mai importante. È difficile dover aggiornare l'elenco ogni volta che ne aggiungo uno nuovo.
Robin Winslow,

5
Se ho una directory che è piena di CSS non applicabili,% regole, funzioni ecc., Non vi è alcun rischio e l'opposto (non permettendo) porta solo a tedium inutili e lunghe "intestazioni di importazione" nei file invece di quello che potrebbe essere solo un riga singola di @import "/functions"o @import "partials/".
srcspider,

3
Un caso d'uso è l'importazione di moduli, in cui l'ordine non è importante e gli stili possono essere spaziati in base al nome ... Vorrei vedere questa funzione - anche se sono d'accordo che dovrebbe essere usato saggiamente ...
Will Hancock

41

Dai un'occhiata al progetto sass-globbing .


1
il mio commento è obsoleto da alcuni anni, ma .... il progetto sass-globbing ha alcuni progressi seriamente lenti, e solo un singolo sviluppatore che non si preoccupa eccessivamente di far funzionare le cose su Windows. Abbiamo appena iniziato a crearne uno nuovo che funziona su Linux, Mac e Windows
Stuart,

33

Creo un file chiamato __partials__.scssnella stessa directory dipartials

|- __partials__.scss
|- /partials
   |- __header__.scss
   |- __viewport__.scss
   |- ....

In __partials__.scss, ho scritto questi:

@import "partials/header";
@import "partials/viewport";
@import "partials/footer";
@import "partials/forms";
....

Quindi, quando voglio importare il tutto partials, basta scrivere @import "partials". Se voglio importarne uno, posso anche scrivere @import "partials/header".


2
Questa è una soluzione abbastanza buona. È ciò che fa la bussola per semplificarne l'inclusione +1
Jethro Larson

8
Questo è fondamentalmente lo stesso della configurazione OP. Vorrebbe importare i file senza aggiungere manualmente le @import 'partials/xyz'istruzioni ogni volta che viene creato un nuovo parziale.
gyo,

1
Downvoter + Upvoters: puoi spiegare in che modo questa risposta è diversa dall'impostazione OP?
gyo,

4
Questo non risolve nulla.
Oligofren,

2
@gyo Non aiuta l'OP se hanno solo una directory di parziali, ma aiuta le persone con più directory di parziali. Se ho directory formse widgets, posso @import "forms"; @import "widgets"nel file CSS principale per una pagina e preoccuparmi solo di tutti i singoli parziali ( @import forms/text; @import forms/button...) all'interno forms.scsse widgets.scss.
ttotherat,

4

Puoi usare un po 'di soluzione alternativa posizionando un file sass nella cartella in cui desideri importare e importare tutti i file in quel file in questo modo:

percorso file: main / current / _current.scss

@import "placeholders"; @import "colors";

e nel prossimo file a livello di dir usi semplicemente import per file cosa importa tutti i file da quella dir:

percorso del file: main / main.scss

@import "EricMeyerResetCSSv20"; @import "clearfix"; @import "current";

In questo modo hai lo stesso numero di file, come se stessi importando l'intera directory. Attenzione all'ordine, il file che arriva per ultimo sovrascriverà i file corrispondenti.


3

Potresti voler mantenere l'ordine dei sorgenti quindi puoi semplicemente usarlo.

@import
  'foo',
  'bar';

Preferisco questo.


2

http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#import

non sembra.

Se uno di questi file richiede sempre gli altri, è necessario importare gli altri file e importare solo quelli di livello superiore. Se sono tutti autonomi, allora penso che dovrai continuare a farlo come sei adesso.


sì, ho visto la documentazione, ho appena controllato se qualcuno sapesse un trucco o sperando che fosse solo lol non documentato. Grazie per il suggerimento
corroso il

2

La risposta accettata da Dennis Best afferma che "Altrimenti, l'ordine di caricamento è e dovrebbe essere irrilevante ... se stiamo facendo le cose correttamente". Questo è semplicemente errato. Se stai facendo le cose correttamente, usi l'ordine css per aiutarti a ridurre la specificità e mantenerti css semplice e pulito.

Quello che faccio per organizzare le importazioni è l'aggiunta di un _all.scssfile in una directory, in cui importare tutti i file rilevanti in esso, nell'ordine corretto. In questo modo, il mio file di importazione principale sarà semplice e pulito, in questo modo:

// Import all scss in the project

// Utilities, mixins and placeholders
@import 'utils/_all';

// Styles
@import 'components/_all';
@import 'modules/_all';
@import 'templates/_all';

Potresti farlo anche per le sottodirectory, se necessario, ma non credo che la struttura dei tuoi file CSS dovrebbe essere troppo profonda.

Sebbene io usi questo approccio, penso ancora che dovrebbe esistere una importazione glob in sass, per situazioni in cui l'ordine non ha importanza, come una directory di mixin o persino animazioni.


Se si utilizza un approccio come RSCSS, la specificità è uguale e ogni componente si applica solo dove è necessario senza conflitti.
RWDJ,

1

Cerco anche una risposta alla tua domanda. Corrisponde alle risposte non esiste la funzione di importazione completa corretta.

Ecco perché ho scritto uno script Python che devi inserire nella cartella principale della cartella scss in questo modo:

- scss
  |- scss-crawler.py
  |- abstract
  |- base
  |- components
  |- layout
  |- themes
  |- vender

Quindi camminerà attraverso l'albero e troverà tutti i file scss. Una volta eseguito, creerà un file scss chiamato main.scss

#python3
import os

valid_file_endings = ["scss"]

with open("main.scss", "w") as scssFile:
    for dirpath, dirs, files in os.walk("."):
        # ignore the current path where the script is placed
        if not dirpath == ".":
            # change the dir seperator
            dirpath = dirpath.replace("\\", "/")

            currentDir = dirpath.split("/")[-1]
            # filter out the valid ending scss
            commentPrinted = False
            for file in files:
                # if there is a file with more dots just focus on the last part
                fileEnding = file.split(".")[-1]
                if fileEnding in valid_file_endings:
                    if not commentPrinted:
                        print("/* {0} */".format(currentDir), file = scssFile)
                        commentPrinted = True
                    print("@import '{0}/{1}';".format(dirpath, file.split(".")[0][1:]), file = scssFile)

un esempio di un file di output:

/* abstract */
@import './abstract/colors';
/* base */
@import './base/base';
/* components */
@import './components/audioPlayer';
@import './components/cardLayouter';
@import './components/content';
@import './components/logo';
@import './components/navbar';
@import './components/songCard';
@import './components/whoami';
/* layout */
@import './layout/body';
@import './layout/header';

0

questo ha funzionato bene per me

@import 'folder/*';

7
Penso che questo sia dovuto alla caratteristica rubino non SASS. Alcuni compilatori hanno problemi con questo modo. Ad esempio, l'ho usato da gulp-ruby-sass e ha funzionato, ma usando gulp-sass ha generato un errore.
Morteza Ziyae,

0

Puoi generare il file SASS che importa tutto automaticamente, io uso questo compito Gulp:

concatFilenames = require('gulp-concat-filenames')

let concatFilenamesOptions = {
    root: './',
    prepend: "@import '",
    append: "'"
}
gulp.task('sass-import', () => {
    gulp.src(path_src_sass)
        .pipe(concatFilenames('app.sass', concatFilenamesOptions))
        .pipe(gulp.dest('./build'))
})

Puoi anche controllare l'ordine di importazione ordinando le cartelle in questo modo:

path_src_sass = [
    './style/**/*.sass', // mixins, variables - import first
    './components/**/*.sass', // singule components
    './pages/**/*.sass' // higher-level templates that could override components settings if necessary
]

0

Potrebbe essere una vecchia domanda, ma ancora rilevante nel 2020, quindi potrei pubblicare qualche aggiornamento. Dall'aggiornamento di Octobers'19 dovremmo generalmente usare @use anziché @import , ma questa è solo un'osservazione. La soluzione a questa domanda è utilizzare i file indice per semplificare includendo intere cartelle. Esempio sotto.

// foundation/_code.scss
code {
  padding: .25em;
  line-height: 0;
}

// foundation/_lists.scss
ul, ol {
  text-align: left;

  & & {
    padding: {
      bottom: 0;
      left: 0;
    }
  }
}

// foundation/_index.scss
@use 'code';
@use 'lists';

// style.scss
@use 'foundation';

https://sass-lang.com/documentation/at-rules/use#index-files


1
Penso che tu voglia usare @forwardnel tuo _index.scss invece di@use
Isaac Pak il

-4

Con la definizione del file da importare è possibile utilizzare tutte le cartelle definizioni comuni.

Quindi, @import "style/*"compilerà tutti i file nella cartella di stile.

Maggiori informazioni sulla funzione di importazione in Sass sono disponibili qui .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.