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 секунд.