@İmport kullanarak sass içindeki bir dizinin tamamını almak mümkün müdür?


209

Benim gibi SASS kısmi ile benim stilleri modülerleştiriyorum:

@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

@import pusulası veya başka bir şey gibi tüm kısmi dizini (SASS-kısmi dolu bir dizin) eklemenin bir yolu var mı?


3
Yanıt değil, yararlı: SASS gibi bir içe aktarmada birden çok dosyayı içe aktarabilir @import 'partials/header', 'partials/viewport', 'partials/footer';.
llobet

Yanıtlar:


201

Sass'ı bir Rails projesinde kullanıyorsanız, sass-rails gem, https://github.com/rails/sass-rails , glob içe aktarma özelliğine sahiptir.

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

"Bir dizini içe aktarırsanız, içe aktarma sırasını nasıl belirleyebilirsiniz? Yeni bir karmaşıklık düzeyi getirmeyen bir yol yoktur."

Bazıları dosyalarınızı dizinler halinde düzenlemenin karmaşıklığı azaltabileceğini iddia eder.

Kuruluşumun projesi oldukça karmaşık bir uygulama. 17 dizinde 119 Sass dosyası var. Bunlar kabaca görüşlerimize karşılık gelir ve ağırlıklı olarak ayarlamalar için kullanılır, ağır kaldırma özel çerçevemiz tarafından ele alınır. Bana göre, birkaç içe aktarılan dizin satırı, 119 satırlık ithal dosya adından biraz daha az karmaşıktır.

Yükleme sırasını ele almak için, önce yüklenmesi gereken dosyaları (mixins, değişkenler, vb.) Erken yükleme dizinine yerleştiriyoruz. Aksi takdirde, yük emri önemsizdir ve önemsiz olmalıdır ... eğer işleri düzgün yapıyoruz.


7
veya @import "*"denetleyici css / scss dosyalarınız application.css.scss ile birlikte "app / asset / stylesheets" klasöründeyse (application.css.scss dosyasında) ekleyin .
Magne

Bu "mücevher" arabası ve pencerelerde çalışmıyor, uzun zamandır açık olan ve aslında tamamen kırık olduğu anlamına gelen bu konuya bakın github.com/chriseppstein/sass-globbing/issues/3
pilavdzice

Chris Eppstein'ın sersemlemiş mücevherlerinden bahsediyorsun. Cevabım, sanırım farklı olan sass-rails gemini kullanıyor. Windows'da değilim, ancak sass-rails gem ile ilgili herhangi bir sorun görmüyorum.
Dennis Best

1
Bu benim için işe yaramadı - Globbing, ayrı ayrı vanilya css @import satırlarına ayrıldı. Hangi nastily, dev içinde çalıştı, ama üretim değil (çünkü uygulamada tek bir kök varlık yolu vardır.
Ccs

5
Benim için harika çalıştı, bu ipucu için teşekkürler. Hoş söyleyerek şaşırdım @import "*"application.scss tüm kapsamaktadır diğer aynı dizinde bulunan dosyaları değil, ben sonsuz döngü hata olsun bekleniyor ... application.scss yeniden sayılabilir.
Topher Hunt

94

Bu özellik asla Sass'ın bir parçası olmayacak. Bunun önemli nedenlerinden biri ithalat siparişidir. CSS'de, en son içe aktarılan dosyalar daha önce belirtilen stilleri geçersiz kılabilir. Bir dizini içe aktarırsanız, içe aktarma sırasını nasıl belirleyebilirsiniz? Yeni bir karmaşıklık düzeyi getirmeyen bir yol yoktur. İçe aktarmaların bir listesini tutarak (örneğin örnekte olduğu gibi), içe aktarma siparişi ile açıksınız. Başka bir dosyada tanımlanan stilleri güvenle geçersiz kılmak veya bir dosyada mixins yazmak ve bunları başka bir dosyada kullanmak istiyorsanız bu önemlidir.

Daha ayrıntılı bir tartışma için bu kapalı özellik isteğine buradan bakın:


260
iyi yapılandırılmış css dosyaları için, içerme sırası önemli değil
Milovan Zogovic

57
@MilovanZogovic Geçersiz kılmalara çok fazla güvenmenin bir kod kokusu var, ancak art arda sıralı kullanımı hakkında yanlış bir şey yok. Dil böyle tasarlandı.
Brandon Mathis

34
@BrandonMathis Buradaki teorik saflığı anlıyorum, ancak bir uygulamada (benim ve aşınmış olduğunu varsayıyorum) CSS'nizi farklı dosyaların birbirleri üzerinde hiçbir etkisi olmayacak şekilde yazmayı seçebilirsiniz. Her biri farklı bir css sınıf kuralı içeren dosyaları ile "modüller" adlı bir dizin var. Bu dizindeki tüm dosyaların dahil edilmesini istiyorum ve sıraları değil ve tasarım gereği asla önemli olmayacak. Her yeni liste eklediğimde listeyi güncellemek zorunda kalmak acı verici.
Robin Winslow

5
Uygulanamayan css,% kurallar, işlevler vb. İle dolu bir dizin varsa, herhangi bir risk söz konusu değildir ve bunun tersi (izin vermiyor), yalnızca bir tek satırlık @import "/functions"veya @import "partials/".
srcspider

3
Bir usecase, siparişin önemli olmadığı ve stillerin ad alanlı olduğu modülleri içe aktarıyor ... Bu işlevi görmek istiyorum - akıllıca kullanılması gerekeceğine rağmen ...
Hancock

41

1
benim yorumum birkaç yıl eski, ama .... sass-globbing projesinde ciddi bir yavaş ilerleme vardır ve sadece Windows üzerinde işler yapmak için aşırı telaşlı tek bir geliştirici var. Linux, Mac ve Windows'ta çalışan yeni bir tane yapmaya başlıyoruz
Stuart

33

__partials__.scssAynı dizinde adlı bir dosya oluşturuyorumpartials

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

İçinde __partials__.scssşunu yazdım:

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

Yani, bütün ithal etmek istediğimde partials, sadece yaz @import "partials". Bunlardan herhangi birini içe aktarmak istersem de yazabilirim @import "partials/header".


2
Bu oldukça iyi bir çözüm. Pusulanın dahil edilmesini basitleştirmek için yaptığı şey +1
Jethro Larson

8
Bu temel olarak OP kurulumuyla aynıdır. @import 'partials/xyz'Her yeni bölüm oluşturulduğunda , ifadeleri elle eklemeden dosyaları içe aktarmak istiyor .
gyo

1
Downvoters + Upvoters: Lütfen bu cevabın OP kurulumundan ne kadar farklı olduğunu açıklayabilir misiniz?
gyo

4
Bu hiçbir şeyi çözmez.
oligofren

2
@gyo Yalnızca bir kısmi dizini varsa OP'ye yardımcı olmaz, ancak birden çok kısmi dizini olan kişilere yardımcı olur. Ben formsve widgetsdizinleri varsa, ben @import "forms"; @import "widgets"bir sayfa için ana CSS dosyasında ve sadece @import forms/text; @import forms/buttoniçindeki tüm bireysel kısmi ( ...) hakkında endişe forms.scssve widgets.scss.
ttotherat

4

Bir sass dosyasını bu dosyadaki tüm dosyaları almak ve almak istediğiniz klasöre yerleştirerek biraz geçici bir çözüm kullanabilirsiniz:

dosya yolu: ana / akım / _current.scss

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

ve bir sonraki dir düzeyindeki dosyada, o dizindeki tüm dosyaları içe aktaran dosya için import komutunu kullanabilirsiniz:

dosya yolu: main / main.scss

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

Bu şekilde, tüm dizini içe aktardığınız gibi aynı sayıda dosyanız olur. Siparişe dikkat edin, en son gelen dosya eşleşen stilleri geçersiz kılar.


3

Kaynak sırasını korumak isteyebilirsiniz, o zaman bunu kullanabilirsiniz.

@import
  'foo',
  'bar';

Bunu tercih ederim.


2

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

öyle görünmüyor.

Bu dosyalardan herhangi biri her zaman başkalarını gerektirirse, diğer dosyaları içe aktarmalarını ve yalnızca en üst düzey dosyaları almalarını sağlayın. Eğer hepsi bağımsızlarsa, sanırım şimdi olduğu gibi yapmaya devam etmeniz gerekecek.


evet belgelerin gördüm, sadece kimse bir hile biliyordu ya da sadece belgesiz lol olduğunu umuyordu kontrol etti. Yine de öneri için teşekkürler
aşınmış

2

Dennis Best'in kabul ettiği cevap, "Aksi takdirde yük emrinin önemsiz olduğunu ve olması gerektiğini ... bir şeyleri doğru bir şekilde yapıyorsak" diyor. Bu sadece yanlış. İşleri düzgün bir şekilde yapıyorsanız, özgüllüğü azaltmanıza ve css'i basit ve temiz tutmanıza yardımcı olmak için css sırasını kullanırsınız.

_all.scssİçe aktarma işlemlerini düzenlemek için yaptığım, dizindeki tüm dosyaları doğru sırada içe aktardığım bir dizine dosya eklemek . Bu şekilde, ana içe aktarma dosyam aşağıdaki gibi basit ve temiz olacaktır:

// Import all scss in the project

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

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

Gerekirse, alt dizinler için de bunu yapabilirsiniz, ancak css dosyalarınızın yapısının çok derin olması gerektiğini düşünmüyorum.

Bu yaklaşımı kullanmama rağmen, hala bir karışım ithalatı var, sanırım bir karışıklık dizini veya hatta animasyonlar dizini gibi, siparişin önemli olmadığı durumlar için sass'ta var olmalı.


RSCSS gibi bir yaklaşım kullanırsanız, özgüllük eşittir ve her bileşen yalnızca ihtiyaç duyulan yerlerde çakışma olmadan uygulanır.
RWDJ

1

Ayrıca sorunuzun yanıtını da arıyorum. Yanıtlara karşılık gelen doğru içeri aktarma işlevi yok.

Bu yüzden scss klasörünüzün köküne böyle yerleştirmeniz gereken bir python betiği yazdım:

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

Daha sonra ağaçta yürüyecek ve tüm scss dosyalarını bulacaktır. Bir kez yürütüldüğünde, main.scss adlı bir scss dosyası oluşturur

#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)

bir çıktı dosyası örneği:

/* 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

bu benim için iyi çalıştı

@import 'folder/*';

7
Bu SASS değil yakut özelliği nedeniyle olduğunu düşünüyorum. Bazı derleyicilerin bu şekilde sorunu vardır. Örneğin bunu gulp-ruby-sass tarafından kullandım ve işe yaradı ama gulp-sass kullanarak bir hata yarattı.
Morteza Ziyae

0

Her şeyi otomatik olarak alan SASS dosyası oluşturabilirsiniz, bu Gulp görevini kullanıyorum:

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'))
})

İçe aktarma sırasını aşağıdaki gibi klasörleri sipariş ederek de kontrol edebilirsiniz:

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

Eski bir soru olabilir, ancak 2020'de hala alakalı, bu yüzden bazı güncelleme gönderebilirim. Octobers'19 güncellemesinden bu yana genellikle @import yerine @ kullanmalıyız , ancak bu sadece bir açıklama. Bu sorunun çözümü, tüm klasörleri dahil etmeyi basitleştirmek için dizin dosyalarını kullanmaktır. Aşağıdaki örnek.

// 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
Sanırım @forward_index.scss'niz yerine kullanmak istediğinizi düşünüyorum@use
Isaac Pak

-4

İçe aktarılacak dosyayı tanımlayarak, tüm klasörlerin ortak tanımlarını kullanmak mümkündür.

Böylece, @import "style/*"stil klasöründeki tüm dosyaları derleyecektir.

Sass'ta içe aktarma özelliği hakkında daha fazla bilgiyi burada bulabilirsiniz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.