Можно ли импортировать весь каталог в sass с помощью @import?

Я модулирую свои таблицы стилей с помощью таких элементов 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

есть ли способ включить весь каталог partials (это каталог, полный SASS-partials), например, @import compass или что-то в этом роде?


person corroded    schedule 24.01.2011    source источник
comment
Не ответ, но полезный: SASS может импортировать несколько файлов за один раз. , как @import 'partials/header', 'partials/viewport', 'partials/footer';.   -  person llobet    schedule 16.05.2017


Ответы (13)


Если вы используете Sass в проекте Rails, гем sass-rails, https://github.com/rails/sass-rails, функции импорта глобусов.

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

Чтобы ответить на озабоченность в другом ответе: «Если вы импортируете каталог, как вы можете определить порядок импорта? Нет никакого способа, который не привнесет какой-то новый уровень сложности».

Некоторые утверждают, что организация файлов в каталогах может УМЕНЬШИТЬ сложность.

Проект моей организации - довольно сложное приложение. В 17 каталогах находится 119 файлов Sass. Они примерно соответствуют нашим взглядам и в основном используются для корректировок, при этом тяжелая работа выполняется нашей пользовательской структурой. Для меня несколько строк импортированных каталогов немного проще, чем 119 строк импортированных имен файлов.

Чтобы изменить порядок загрузки, мы помещаем файлы, которые нужно загрузить первыми - миксины, переменные и т. Д. - в каталог ранней загрузки. В противном случае порядок загрузки не имеет значения ... если мы все делаем правильно.

person Dennis Best    schedule 15.05.2013
comment
или добавьте @import "*" (в application.css.scss), если файлы css / scss вашего контроллера находятся в папке app / assets / stylesheets вместе с application.css.scss. - person Magne; 26.09.2013
comment
этот драгоценный камень содержит ошибки и не работает в Windows. См. эту проблему, которая была открыта в течение долгого времени и, по сути, означает, что она полностью сломана github.com/chriseppstein/sass-globbing/issues/3 - person pilavdzice; 18.09.2014
comment
Вы говорите о жемчужине нахальства Криса Эппштейна. В моем ответе используется драгоценный камень sass-rails, который, я думаю, отличается. Я не использую Windows, но не вижу проблем, связанных с гемом sass-rails. - person Dennis Best; 09.10.2014
comment
У меня это не сработало - подстановка была разбита на отдельные ванильные строки css @import отдельных файлов. Что неприятно, работало в dev, но не в продакшене (поскольку в продакшене есть только один путь к корневому ресурсу application.css) - person Peter Ehrlich; 14.01.2015
comment
@PeterEhrlich Не уверен, что именно происходит в вашем случае, но, чтобы сделать дикий удар, я бы предложил убедиться, что ваш application.scss имеет только @imports, а не требует или включает (не могу вспомнить, что входит в стандартное приложение для рельсов .scss, но это не сработает.) - person Dennis Best; 14.01.2015
comment
Отлично сработал для меня, спасибо за этот совет. Я приятно удивлен, что указание @import "*" в application.scss включает все другие файлы, находящиеся в том же каталоге, но не включает повторно application.scss ... Я ожидал получить ошибку бесконечного цикла. - person Topher Hunt; 07.02.2015
comment
Можно ли тогда исключить определенный подраздел? т.е. как в gulpfiles !src/**/thatOneOddFileFromPackae.css - person Frank Nocke; 17.03.2017

Эта функция никогда не будет частью Sass. Одна из основных причин - это импортный заказ. В CSS файлы, импортированные последними, могут переопределять стили, указанные ранее. Если вы импортируете каталог, как вы можете определить порядок импорта? Невозможно не ввести новый уровень сложности. Сохраняя список импорта (как в своем примере), вы четко указываете порядок импорта. Это важно, если вы хотите иметь возможность уверенно переопределять стили, определенные в другом файле, или записывать миксины в один файл и использовать их в другом.

Для более подробного обсуждения просмотрите этот закрытый запрос функции здесь:

person Brandon Mathis    schedule 24.01.2011
comment
для хорошо структурированных файлов css порядок включения не имеет значения - person Milovan Zogovic; 01.02.2012
comment
@MilovanZogovic Если сильно полагаться на переопределения, есть запах кода, но в использовании каскада нет ничего неправильного. Так был разработан язык. - person Brandon Mathis; 19.02.2012
comment
@BrandonMathis Я понимаю теоретическую чистоту здесь, но в реализации (моя и я предполагаю, что она корродированная) вы можете написать свой CSS таким образом, чтобы разные файлы не влияли друг на друга. У меня есть каталог, называемый модулями, с файлами, каждый из которых содержит отдельное правило класса css. Я хочу, чтобы все файлы в этом каталоге были включены, и их порядок не важен и никогда не будет иметь значения. Больно обновлять список каждый раз, когда я добавляю новый. - person Robin Winslow; 04.01.2013
comment
Если у меня есть каталог, заполненный неприменимыми css,% правилами, функциями и т. Д., Нет никакого риска, а противоположное (не разрешающее) просто приводит к бесполезной утомительности и длинным заголовкам импорта в файлах вместо того, что может быть просто одной строкой из @import "/functions" или @import "partials/". - person srcspider; 29.07.2013
comment
Я все равно называю свои файлы _00_base.scss, _01_mixins.scss, поэтому импорт всего каталога сэкономит мне время. - person Dmitri Pisarev; 10.07.2014
comment
Один из вариантов использования - это импорт модулей, где порядок не важен, а стили могут иметь пространство имен ... Я хотел бы увидеть эту функцию - хотя согласен, что ее нужно использовать с умом ... - person Will Hancock; 22.08.2014
comment
Да, если вы следите за smacss и используете отдельные модули для стилизации, у вас может быть огромная папка с файлами, которые можно импортировать независимо от приоритета. - person BJ McDuck; 04.09.2014
comment
Сброс css всегда должен быть первым. Как это должно быть первым, что это не хорошо структурированный CSS? - person ahnbizcad; 03.11.2014
comment
- 1 за ложь. Во-первых, рассуждения ошибочны, потому что в многих случаях (например, при импорте миксинов или библиотек функций; при импорте таблиц стилей с областью видимости для конкретной страницы) порядок действительно не имеет значения. Иногда это имеет значение, но это не значит, что вы не можете дать пользователю необходимые им полномочия и предупредить их, что злоупотребление ими опасно. Во-вторых, теперь эта функция существует. - person Mark Amery; 01.12.2014
comment
-1, потому что порядок импорта не всегда актуален. @ahnbizcad, вы можете просто включить сброс / нормализацию перед автоматическим импортом. - person gyo; 17.04.2015
comment
@ahnbizcad Было бы неплохо узнать, почему проголосовали против. Вы не поверите, но порядок загрузки CSS не всегда актуален. - person gyo; 21.08.2015
comment
Эти комментарии веселые. Порядок (каскад) - неотъемлемая основа CSS. Если это кажется несущественным, это означает, что вы в настоящее время не используете каскадный аспект. Однако нельзя игнорировать каскад или предполагать, что он не будет задействован в вашем проекте. Ваш следующий _middle-of-the-folder.scss всегда потенциально может сбить каскад, особенно если вы используете - или начинаете использовать - полезные функции Sass, такие как заполнители Если вы пишете CSS без каскада, я бы никогда не захотел с вами работать. - person Jason T Featheringham; 14.09.2016
comment
^ и обратите внимание, что ссылка @MarkAmery является жемчужиной, а не частью Sass - person henry; 05.10.2016
comment
количество времени, которое вы экономите при автоматическом импорте каталога, вероятно, равно 1 часу вашего времени для гигантского, гигантского проекта. это означает, что вам не нужно вводить список файлов css. это означает, что вам не нужно писать тесты (UI или другие), проверяющие, что вы включаете то, что вам нужно. n.b. мне нравится метапрограммирование. много. мне нравится автоматизация. Мне нравится, чтобы он был СУХИМ ... но автоматический импорт css / scss - не лучшая идея. - person spnkr; 30.12.2018

Ознакомьтесь с проектом sass-globbing.

person Akshay Rawat    schedule 07.04.2012
comment
мой комментарий устарел на несколько лет, но .... проект sass-globbing имеет довольно медленный прогресс и только один разработчик, который не слишком беспокоится о том, чтобы все работало в Windows. Мы только начинаем создавать новый, который будет работать в Linux, Mac и WIndows. - person Stuart; 12.05.2016

Я создаю файл с именем __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".

person fen    schedule 18.10.2012
comment
Это очень хорошее решение. Это то, что делает компас, чтобы упростить их включение +1 - person Jethro Larson; 11.04.2013
comment
Это в основном то же самое, что и установка OP. Он хотел бы импортировать файлы без ручного добавления операторов @import 'partials/xyz' каждый раз при создании нового партиала. - person gyo; 20.04.2015
comment
Голосующие против + сторонники: не могли бы вы объяснить, чем этот ответ отличается от настройки OP? - person gyo; 19.09.2015
comment
Это ничего не решает. - person oligofren; 01.06.2016
comment
@fen где это задокументировано? На самом деле это то, что мне нужно :) - person Geoffroy; 09.03.2017
comment
@gyo Это не помогает OP, если у них есть только один каталог частичных файлов, но это помогает людям с несколькими каталогами частичных файлов. Если у меня есть каталоги forms и widgets, я могу @import "forms"; @import "widgets" в основном файле CSS для страницы и беспокоиться только обо всех отдельных частях (_4 _...) внутри forms.scss и widgets.scss. - person ttotherat; 14.06.2018

Вы можете использовать обходной путь, поместив файл sass в папку, которую вы хотите импортировать, и импортировать все файлы в этом файле следующим образом:

путь к файлу: main / current / _current.scss

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

и в следующем файле уровня каталога вы просто используете import для файла, который импортировал все файлы из этого каталога:

путь к файлу: main / main.scss

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

Таким образом, у вас будет такое же количество файлов, как если бы вы импортировали весь каталог. Остерегайтесь порядка, файл, который идет последним, переопределит соответствующие стили.

person IGRACH    schedule 26.05.2014

Это может быть старый вопрос, но он все еще актуален в 2020 году, поэтому я могу опубликовать некоторые обновления. После обновления Octobers'19 мы обычно должны использовать @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

person Thinker    schedule 20.01.2020
comment
Я думаю, вы хотите использовать @forward в своем _index.scss вместо @use - person Isaac Pak; 06.03.2020

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

не похоже на это.

Если для одного из этих файлов всегда требуются другие, попросите их импортировать другие файлы и импортировать только файлы верхнего уровня. Если они все автономны, то я думаю, вам придется продолжать делать это, как сейчас.

person xaxxon    schedule 24.01.2011
comment
да, видел документацию, только что проверил, знает ли кто-нибудь трюк или надеется, что это просто недокументированный лол. Спасибо за предложение, хотя - person corroded; 24.01.2011

Вы можете захотеть сохранить исходный порядок, тогда вы можете просто использовать это.

@import
  'foo',
  'bar';

Я предпочитаю это.

person dewwwald    schedule 21.10.2016

Я тоже ищу ответ на ваш вопрос. Соответствуют ответам правильной функции импорта всего не существует.

Вот почему я написал скрипт python, который вам нужно поместить в корень вашей папки scss следующим образом:

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

Затем он пройдется по дереву и найдет все файлы scss. После выполнения он создаст файл scss с именем 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)

пример выходного файла:

/* 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';
person Sens4    schedule 19.10.2016

В принятом ответе Денниса Беста говорится: «В противном случае порядок загрузки не имеет и не должен иметь значения ... если мы все делаем правильно». Это просто неверно. Если вы все делаете правильно, вы используете порядок 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 для ситуаций, когда порядок не имеет значения, например, каталог миксинов или даже анимаций.

person BRN    schedule 30.04.2018
comment
Если вы используете такой подход, как RSCSS, то специфичность одинакова, и каждый компонент применяется только там, где это необходимо, без конфликтов. - person RWDJ; 01.08.2019
comment
Подход к проблеме специфики следует решать разными способами. Порядок - одно, простота селекторов - другое. Я думаю, что в этом БЭМ превосходит RSCSS, потому что он использует простые селекторы (например, .block__module) вместо более сложных (например, .block ›module). Проверьте это. Но всегда есть ситуации, когда потребуются более сложные селекторы. Еще один хороший инструмент, позволяющий избежать проблем со специфичностью, - это настраиваемые свойства, которые вы можете изменить для определенного контекста. Это тоже хорошая вещь, чтобы проверить. - person BRN; 15.06.2021

Вы можете сгенерировать файл 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
]
person Miro Junker    schedule 11.04.2019

это сработало для меня

@import 'folder/*';
person Siddhartha Mukherjee    schedule 20.04.2013
comment
Я думаю, это из-за функции Ruby, а не SASS. У некоторых компиляторов есть проблемы с этим способом. Например, я использовал это с помощью gulp-ruby-sass, и он работал, но с использованием gulp-sass возникла ошибка. - person Morteza Ziyae; 06.05.2014

Определив файл для импорта, можно использовать общие определения всех папок.

Итак, @import "style/*" скомпилирует все файлы в папке стилей.

Дополнительную информацию о функции импорта в Sass можно найти здесь.

person Nesha Zoric    schedule 08.03.2018