@importを使用してsassにディレクトリ全体をインポートすることは可能ですか?


209

私はスタイルシートをSASSパーシャルで次のようにモジュール化しています:

@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 compassなどの部分ディレクトリ全体(SASS-partialsでいっぱいのディレクトリです)を含める方法はありますか?


3
答えではありませんが便利です。SASSは、1回のインポートで複数のファイルをインポートできます@import 'partials/header', 'partials/viewport', 'partials/footer';
llobet

回答:


201

RailsプロジェクトでSassを使用している場合、sass-rails gem(https://github.com/rails/sass-rails)はglobインポートを備えています。

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

「ディレクトリをインポートする場合、どのようにしてインポート順序を決定できますか?新しいレベルの複雑さを導入しない方法はありません。」

一部の人は、ファイルをディレクトリに編成すると複雑さを軽減できると主張するでしょう。

私の組織のプロジェクトはかなり複雑なアプリです。17個のディレクトリに119個のSassファイルがあります。これらはおおむね私たちの見解に対応しており、主に調整に使用されます。重い作業はカスタムフレームワークによって処理されます。私にとって、インポートされたディレクトリの数行は、インポートされたファイル名の119行よりも少し複雑ではありません。

ロード順序に対処するために、最初にロードする必要があるファイル(ミックスイン、変数など)を早期ロードディレクトリに配置します。それ以外の場合、ロードの順序は適切であり、適切である必要があります。


7
または@import "*"、コントローラーのcss / scssファイルがapplication.css.scssと一緒に「app / assets / stylesheets」フォルダーにある場合は(application.css.scssに)追加します。
マグネ

この「gem」はバグが多く、Windowsでは機能しません。長い間開いていたこの問題をご覧ください。本質的には完全に壊れていますgithub.com/chriseppstein/sass-globbing/issues/3
pilavdzice

あなたはクリス・エップスタインのサスグロブ宝石について話しているのです。私の答えは、sass-rails gemを使用しています。私はWindowsを使用していませんが、sass-rails gemに関連する問題はありません。
デニスベスト

1
これは私にはうまくいきませんでした-グロビングは個々のファイルの個々のバニラcss @import行に分解されました。どちらかと言えば、開発では機能しましたが、製品では機能しませんでした(application.cssのルートアセットパスは1つしかないため)
Peter Ehrlich

5
このヒントをありがとう、私にとってはうまくいきました。私は愉快に言って驚いている@import "*"application.scssにすると、すべての含まれる他の同じディレクトリに存在するファイルはしないが、私は無限ループのバグを取得することが期待... application.scssを再含まれています。
Topher Hunt

94

この機能はSassの一部にはなりません。主な理由の1つは輸入注文です。CSSでは、最後にインポートされたファイルは、前述のスタイルを上書きできます。ディレクトリをインポートする場合、インポート順序をどのように決定できますか?新しいレベルの複雑さをもたらさない方法はありません。(例で行ったように)インポートのリストを保持することで、インポートの順序を明示的にすることができます。これは、別のファイルで定義されているスタイルを自信を持ってオーバーライドしたり、あるファイルにミックスインを書き込んで別のファイルで使用したりできるようにする場合に不可欠です。

より完全な議論については、このクローズド機能のリクエストをここで確認してください:


260
適切に構造化されたcssファイルの場合、インクルードの順序は重要ではありません
Milovan Zogovic

56
@MilovanZogovicオーバーライドに大きく依存するとコードのにおいがしますが、カスケードの使用については何も問題はありません。それは言語がどのように設計されたかです。
Brandon Mathis

34
@BrandonMathis私はここで理論的な純粋さを理解していますが、実装では(私のものと私は腐食していると思います)、異なるファイルが互いに影響を及ぼさないようにCSSを作成することを選択できます。それぞれに異なるcssクラスルールを含むファイルを含む「モジュール」というディレクトリがあります。そのディレクトリ内のすべてのファイルを含めたいのですが、それらの順序は重要ではなく、設計上重要になることは決してありません。新しいリストを追加するたびにリストを更新しなければならないのは面倒です。
Robin Winslow 2013年

5
該当しないcss、%rules、関数などで満たされたディレクトリがある場合、関係するリスクはなく、その反対(許可しない)は単にファイルである可能性のあるものではなく、無駄な退屈で長い「インポートヘッダー」につながるだけです。@import "/functions"またはの1行@import "partials/"
srcspider 2013

3
1つの使用例は、モジュールのインポートであり、順序は重要ではなく、スタイルには名前空間が付けられる場合があります...この機能を確認したいのですが、賢明に使用する必要があることに同意します...
Will Hancock

41

sass-globbingプロジェクトをチェックしてください。


1
私のコメントは数年前に古くなっていますが、... sass-globbingプロジェクトの進行は非常に遅く、Windowsで物事をうまく機能させることについて大騒ぎしない1人の開発者しかいません。Linux、Mac、Windowsで動作する新しいものの作成を始めたばかりです
Stuart

33

__partials__.scss同じディレクトリにという名前のファイルを作成しますpartials

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

__partials__.scss、私はこれらを書きました:

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

だから、全体をインポートしたいときはpartials、ただ書いてください@import "partials"。それらのいずれかをインポートしたい場合は、と書くこともでき@import "partials/header"ます。


2
それはかなり良い解決策です。それは、コンパスが+1を単純化するために行うことです
ジェスロラーソン2013

8
これは基本的にOPセットアップと同じです。@import 'partials/xyz'新しいパーシャルが作成されるたびにステートメントを手動で追加せずにファイルをインポートしたいと考えています。
gyo

1
Downvoters + Upvoters:この回答がOPセットアップとどのように異なるか説明していただけますか?
gyo

4
それは何も解決していません。
オリゴフレン2016年

2
@gyoパーシャルのディレクトリが1つしかないOPには役立ちませんが、パーシャルの複数のディレクトリを持つユーザーには役立ちます。私が持っている場合formswidgets、ディレクトリ、私のことができ@import "forms"; @import "widgets"、ページのメインのCSSファイル内に、そしてすべての個々の部分音についてのみ心配(@import forms/text; @import forms/button...)の内側forms.scsswidgets.scss
ttotherat

4

次のように、インポートしたいファイルにsassファイルを置き、そのファイル内のすべてのファイルをインポートすることにより、少しの回避策を使用できます。

ファイルパス:main / current / _current.scss

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

そして次のdirレベルのファイルでは、そのdirからすべてのファイルをインポートしたファイルにimportを使用します。

ファイルパス:main / main.scss

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

そうすれば、dir全体をインポートするのと同じように、同じ数のファイルができます。順序に注意してください。最後に来るファイルは、一致するスタイルを上書きします。


3

ソースの順序保持したい場合は、これを使用できます。

@import
  'foo',
  'bar';

私はこれが好きです。


2

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

それのように見えません。

これらのファイルのいずれかで常に他のファイルが必要な場合は、他のファイルをインポートして、最上位のファイルのみをインポートするようにしてください。それらがすべてスタンドアロンである場合、今のようにそれを続けなければならないでしょう。


ええ、ドキュメントを見て、誰かがトリックを知っているかどうか、またはそれがドキュメント化されていないことを望んでいるかどうかを確認しましたlol。しかし提案をありがとう
腐食した

2

デニス・ベストの認められた回答は、「そうでなければ、ロードの順序は無関係であるはずです...私たちが適切に物事を行っているなら」。これは単に正しくありません。物事を適切に行っている場合は、CSSの順序を使用して、特異性を減らし、CSSをシンプルでクリーンな状態に保ちます。

インポートを整理するために_all.scss行うのは、ディレクトリ内のファイルを追加することです。ディレクトリ内のすべての関連ファイルを正しい順序でインポートします。このように、私のメインのインポートファイルは次のようにシンプルでクリーンになります。

// Import all scss in the project

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

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

必要に応じて、サブディレクトリでもこれを行うことができますが、CSSファイルの構造が深すぎるとは思いません。

私はこのアプローチを使用していますが、ミックスインのディレクトリやアニメーションなど、順序が重要ではない状況では、グロブインポートはsassに存在する必要があるとまだ思います。


RSCSSのようなアプローチを使用する場合、具体性は等しく、各コンポーネントは競合することなく必要な場所にのみ適用されます。
RWDJ

1

また、質問への回答も検索します。正解インポート機能に対応していない回答に対応しています。

そのため、次のようにscssフォルダーのルートに配置する必要があるpythonスクリプトを作成しました。

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

次に、ツリーをウォークスルーしてすべてのscssファイルを見つけます。実行すると、main.scssという名前の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)

出力ファイルの例:

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

これは私にとってはうまくいきました

@import 'folder/*';

7
これは、SASSではなくルビー機能によるものだと思います。一部のコンパイラはこの方法で問題があります。たとえば、私はこれをgulp-ruby-sassで使用しましたが、機能しましたが、gulp-sassを使用するとエラーが発生しました。
Morteza Ziyae 2014年

0

すべてを自動的にインポートするSASSファイルを生成できます。この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'))
})

次のようにフォルダを並べ替えることで、インポートの順序を制御することもできます。

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

それは古い質問かもしれませんが、2020年にも関連があるので、更新を投稿するかもしれません。19年10月の更新以降、通常、代わりに@useを使用する必要があります @importが、これは単なる注釈です。この質問の解決策は、インデックスファイルを使用してフォルダ全体を簡単に含めることです。以下の例。

// 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
@forward代わりに_index.scssで使用したいと思います@use
Isaac Pak

-4

インポートするファイルを定義すると、すべてのフォルダーに共通の定義を使用できます。

そう、 @import "style/*"スタイルフォルダー内のすべてのファイルをコンパイルします。

Sassのインポート機能の詳細については、こちらをご覧ください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.