Rails - Разница между @import и * = требует?

Итак, у меня есть относительно простое приложение Rails, и я хотел добавить к нему стиль дизайна материалов через Bootstrap.

Я добавил следующие gems в свой Gemfile:

gem 'bootstrap-sass'
gem 'bootstrap-material-design'

Теперь они оба работают, мой вопрос заключается в том, почему мне, похоже, приходится добавлять их в свое приложение по-разному. Для Vanilla Boostrap я просто импортирую его в конкретный вид (я думаю, что правильный термин) scss файл, как обычно.

@import "bootstrap-sprockets";
@import "bootstrap";

Но для драгоценного камня Material Design я должен "потребовать" его вместо корневого файла application.css

 *= require bootstrap-material-design

Почему разница, и для чего требуется синтаксис, который действительно делает?

Ответ 1

Входящие и требующие методы делают очень разные вещи.

Метод require делает то, что включает в большинстве других программ Языки: запустить другой файл. Он также отслеживает то, что вам нужно в прошлого и не будет требовать того же файла дважды. Чтобы запустить другой файл без этой дополнительной функции вы можете использовать метод загрузки.

Метод include принимает все методы из другого модуля и включает их в текущий модуль. Это вещь на уровне языка в отличие от вещи на уровне файлов, как и требовать. Метод включения является основным способом "расширить" классы с помощью других модулей (обычно называемые микшированием). Например, если ваш класс определяет метод "каждый", вы можете включить модуль mixin Enumerable, и он может действовать как Коллекция. Это может сбивать с толку, поскольку глагол include используется очень иначе в других языках.

Итак, если вы просто хотите использовать модуль, а не расширять его или делать микширование, тогда вы захотите использовать require.

Как ни странно, Ruby require аналогичен C include, а Ruby include почти не похож на C include.

Дополнительная информация

Ответ 2

Я думаю, вы понимаете цель опции CSS/SASS @import. require директива sprockets. Sprockets обрабатывает директивы во время сеанса компиляции - простая конкатенация требуемых файлов. Единственное различие заключается в том, как они обрабатывают контекст. В двух словах - всегда @import всегда.

Пожалуйста, смотрите подробное описание здесь: https://github.com/rails/sass-rails#important-note

Ответ 3

У меня возникала проблема с очень медленными перекомпиляциями всякий раз, когда я менял свой CSS. Согласно этой статье, разница между Sprockets require и Sass @import является значительной, по крайней мере, с точки зрения производительности:

Конвейер ресурсов рассматривает Sass @imports по-разному, что он относится к Sprockets. В случае импорта каждое сохранение будет проходить и каждый раз скомпилировать весь импорт, независимо от того, какой частичный вы сохранили. Способ, которым Sprockets обрабатываются внутри таблиц стилей, заключается в том, что только частично сохраненная вами информация будет перекомпилирована и затем будет введена на страницу локально при обновлении. Звездочки - это способ по умолчанию для загрузки нескольких партикулов в один файл для производства.

Используя require для зависимостей сторонних поставщиков, перекомпиляция CSS теперь занимает 1,5 секунды вместо 25 секунд.