Импортировать обычный файл CSS в файл SCSS?
есть ли в любом случае импортировать обычный файл CSS с Sass ? Хотя я не использую весь синтаксис SCSS из sass, мне все еще нравится комбинировать/сжимать функции и хотелось бы использовать его без переименования всех моих файлов в *.scss
14 ответов
Похоже, что это нереализовано, на момент написания этой статьи:
https://github.com/sass/sass/issues/193
для libsass (реализация C/C++) импорт работает для *.css
так же, как для *.css
файлы - просто опустите расширение:
@import "path/to/file";
это импорт path/to/file.css
.
посмотреть ответ для получения дополнительной информации.
посмотреть ответ Рубина реализация (Сасс камень)
после того, как у меня была та же проблема, я запутался со всеми ответами здесь и комментариями над репозиторием sass в github.
я просто хочу отметить, что в декабре 2014 года, этот вопрос был решен. Теперь можно импортировать css
файлы непосредственно в файл sass. Следующее PR в github решает проблему.
синтаксис такой же, как сейчас - @import "your/path/to/the/file"
, без расширения после имени файла. Это импортирует ваш файл напрямую. Если вы добавляете *.css
в конце он будет переведен в css
правила @import url(...)
.
в случае, если вы используете некоторые из" причудливых " новых модулей, таких как webpack, вам, вероятно, придется использовать use ~
в начале пути. Итак, если вы хотите импортировать следующий путь node_modules/bootstrap/src/core.scss
вы бы написали что-то вроде @import "~bootstrap/src/core"
.
Примечание:
Похоже, это работает не для всех. Если ваш переводчик на основе libsass
это должны работать нормально (проверка этой). Я тестировал с помощью @import
на узле-sass, и он работает нормально. К сожалению, это работает и не работает на некоторых экземплярах ruby.
вы должны добавить подчеркивание к CSS-файлу, который будет включен, и переключить его расширение на scss (например:_yourfile.scss
). Тогда вы просто должны назвать это так:
@import "yourfile";
и он будет включать содержимое файла вместо использования директивы CSS standard @import.
это было реализовано и объединено начиная с версии 3.2
(потяните #754 слился на 2 января 2015 на libsass
, вопросы изначально были определены здесь:sass
#193 #556, libsass
#318).
чтобы сократить длинную историю, синтаксис следующий:
-
импортировать (включить) необработанный CSS-файл
синтаксис без.css
расширение в конце (результаты фактического чтения частичногоs[ac]ss|css
и включить его в SCSS / SASS):@import "path/to/file";
-
импортировать CSS-файл традиционным способом
синтаксис идет традиционным способом, С.css
расширение в конце (результаты@import url("path/to/file.css");
в скомпилированный CSS в):@import "path/to/file.css";
и это чертовски хорошо: этот синтаксис элегантный и лаконичный, плюс обратная совместимость! Он отлично работает с libsass
и node-sass
.
__
чтобы избежать дальнейших спекуляций в комментариях, напишите это явно:Рубин на основе Сасс все еще имеет эту функцию невыполненными после 7 лет дискуссий. К моменту написания этого ответа обещано, что в 4.0 будет простой способ выполнить это, вероятно, с помощью @use
. Кажется там будет реализация очень скоро, Новый "запланировано" тег "предложение принято" был назначен для выпуск #556 и новая @use
характеристика.
ответ может быть обновлен, как только что-то меняется.
хорошие новости все, Крис Eppstein создал плагин compass с встроенной функцией импорта css:
https://github.com/chriseppstein/sass-css-importer
теперь импортировать файл CSS так же просто, как:
@import "CSS:library/some_css_file"
если у вас .css
файл, который вы не хотите изменять, ни изменить его расширение на .scss
(например, этот файл из раздвоенного проекта, который вы не поддерживаете), вы всегда можете создайте символическую ссылку, а затем импортируйте ее в своем .scss
.
создает символическую ссылку:
ln -s path/to/css/file.css path/to/sass/files/_file.scss
импорт симлинк файла в элемент .scss
:
@import "path/to/sass/files/file";
ваш целевой выход .css
файл будет содержать содержимое из импортированной символической ссылки .scss
файл, а не правило импорта CSS (упомянутый @yaz с самыми высокими голосами комментариев). И у вас нет дублированных файлов с разными расширениями, что означает любое обновление, сделанное внутри initial .css
файл немедленно импортируется в целевой вывод.
символическая ссылка (также символическая ссылка или мягкая ссылка) - это особый тип файла который содержит ссылку на другой файл в виде Абсолюта или относительный путь и что влияет на разрешение пути.
– http://en.wikipedia.org/wiki/Symbolic_link
вы можете использовать стороннюю importer
настроить @import
семантика.
node-sass-import-once С узел-sass (для узла.js) может встроенный импорт CSS-файлов.
пример использования:
var sass = require('node-sass');,
importOnce = require('node-sass-import-once');
sass.render({
file: "input.scss",
importer: importOnce,
importOnce: {
css: true,
}
});
пример грунт-Сасс конфигурация:
var importOnce = require("node-sass-import-once");
grunt.loadNpmTasks("grunt-sass");
grunt.initConfig({
sass: {
options: {
sourceMap: true,
importer: importOnce
},
dev: {
files: {
"dist/style.css": "scss/**/*.scss"
}
}
});
обратите внимание, что node-sass-import-once в настоящее время не может импортировать частичные значения Sass без явного подчеркивания. Например с файл partials/_partial.scss
:
-
@import partials/_partial.scss
успешно -
@import * partials/partial.scss
не
в общем, имейте в виду, что пользовательский импортер может изменить любой семантика импорт. Читайте документы, прежде чем начать использовать его.
Если я прав, css совместим с scss, поэтому вы можете изменить расширение css на scss, и оно должно продолжать работать. После изменения расширения вы можете импортировать его, и он будет включен в файл.
Если вы этого не сделаете, sass будет использовать css @import, который вам не нужен.
я придумал элегантный, Рельсоподобный способ сделать это. Во-первых, переименуйте свой до .scss.erb
, затем используйте такой синтаксис (пример для highlight_js-rails4 gem CSS актив):
@import "<%= asset_path("highlight_js/github") %>";
почему вы не можете разместить файл непосредственно через SCSS:
тут @import
в SCSS отлично работает для CSS-файлов, если вы явно используете полный путь так или иначе. В режиме разработки,rails s
обслуживает активы без компиляции они, значит, такой путь работает...
@import "highlight_js/github.css";
...потому что размещенный путь буквально /assets/highlight_js/github.css
. Если вы щелкните правой кнопкой мыши на странице и "просмотреть источник", затем нажмите на ссылку для таблицы стилей с выше @import
, вы увидите строку, которая выглядит так:
@import url(highlight_js/github.css);
двигатель SCSS переводит "highlight_js/github.css"
to url(highlight_js/github.css)
. Это будет работать плавно, пока вы не решите попробовать запустить его в производстве, где предварительно скомпилированные активы имеют хэш, введенный в файл имя. Файл SCSS по-прежнему будет разрешаться статическим /assets/highlight_js/github.css
это не было предварительно скомпилировано и не существует в производстве.
как это решение работает:
во-первых, перемещая до .scss.erb
, мы эффективно превратили SCSS в шаблон для Rails. Теперь, когда мы используем <%= ... %>
template tags, обработчик шаблонов Rails заменит эти фрагменты выводом кода (как и любой другой шаблон.)
о том,asset_path("highlight_js/github")
на .scss.erb
файл делает две вещи:
- вызывает
rake assets:precompile
задача предварительной компиляции соответствующего CSS-файла. - создает URL-адрес, который соответствующим образом отражает актив независимо от среды Rails.
это также означает, что движок SCSS даже не анализирует файл CSS; он просто размещает ссылку на него! Таким образом, нет Хоки-мартышек или грубых обходных путей. Мы обслуживаем CSS-ресурс через SCSS по назначению и использование URL-адреса для указанного CSS-ресурса по назначению Rails. Милая!
простой обходной путь:
All или почти весь css-файл также можно интерпретировать как scss. Это также позволяет импортировать их внутри блока. Переименуйте css в scss и импортируйте его так.
в моей конфигурации я делаю следующее:
сначала я копирую .CSS-файл во временный, на этот раз с .расширение СКС. Пример конфигурации Grunt:
copy: {
dev: {
files: [
{
src: "node_modules/some_module/some_precompiled.css",
dest: "target/resources/some_module_styles.scss"
}
]
}
}
затем вы можете импортировать .SCSS-файл из родительского scss (в моем примере это даже импортируется в блок):
my-selector {
@import "target/resources/some_module_styles.scss";
...other rules...
}
Примечание: это может быть опасно, потому что это приведет к тому, что css будет проанализирован несколько раз. Проверьте исходный css на то, что он содержит любой SCSS-интерпретируемый артефакт (это маловероятно, но если это произойдет, результат будет трудно отлаживать и опасно).
Я могу подтвердить это работает:
class CSSImporter < Sass::Importers::Filesystem
def extensions
super.merge('css' => :scss)
end
end
view_context = ActionView::Base.new
css = Sass::Engine.new(
template,
syntax: :scss,
cache: false,
load_paths: Rails.application.assets.paths,
read_cache: false,
filesystem_importer: CSSImporter # Relevant option,
sprockets: {
context: view_context,
environment: Rails.application.assets
}
).render
кредит Крисс Эпштейн: https://github.com/sass/sass/issues/193