Ответ 1
Я оказался в очень похожей ситуации. У нас было много существующих SASS, которые теперь должны были принимать динамические значения/переменные, которые будут использоваться повсюду (в качестве переменных). Сначала я пошел по пути записи временных каталогов/файлов и по существу создавал "точку входа прокси", которая создавала бы proxy_entry.scss
и variables.scss
и загружала фактический entry.scss
с предполагаемыми переменными SASS. Это отлично работало и добилось желаемых результатов, но было немного сложнее...
Оказывается, доступно гораздо более простое решение благодаря опции node -sass options.data
. Это принимает строку SASS, подлежащую оценке.
Тип: String Значение по умолчанию: null Специально: файл или данные должны быть указаны
Строка для передачи в libsass для рендеринга. Рекомендуется использовать includePaths в сочетании с этим, чтобы libsass мог находить файлы при использовании директивы @import.
Это полностью устранило необходимость записи/управления всеми временными каталогами и файлами.
Visual TL; DR
Решение сводится к чему-то вроде этого
1.) Определите sassOptions как обычно
var sassOptionsDefaults = {
includePaths: [
'some/include/path'
],
outputStyle: 'compressed'
};
2.) Напишите "динамическую строку SASS" для options.data
var dataString =
sassGenerator.sassVariables(variables) +
sassGenerator.sassImport(scssEntry);
var sassOptions = _.assign({}, sassOptionsDefaults, {
data: dataString
});
3.) Оцените САСС как обычно
var sass = require('node-sass');
sass.render(sassOptions, function (err, result) {
return (err)
? handleError(err);
: handleSuccess(result.css.toString());
});
Примечание.. Предполагается, что ваш entry.scss
импортирует часть variables.scss
, которая определяет переменные как "значения по умолчанию".
// variables.scss
$someColor: blue !default;
$someFontSize: 13px !default;
// entry.scss
@import 'variables';
.some-selector {
color: $someColor;
font-size: $someFontSize;
}
Соединяя все это в качестве примера
var sass = require('node-sass');
// 1.) Define sassOptions as usual
var sassOptionsDefaults = {
includePaths: [
'some/include/path'
],
outputStyle: 'compressed'
};
function dynamicSass(scssEntry, variables, handleSuccess, handleError) {
// 2.) Dynamically create "SASS variable declarations"
// then import the "actual entry.scss file".
// dataString is just "SASS" to be evaluated before
// the actual entry.scss is imported.
var dataString =
sassGenerator.sassVariables(variables) +
sassGenerator.sassImport(scssEntry);
var sassOptions = _.assign({}, sassOptionsDefaults, {
data: dataString
});
// 3.) render sass as usual
sass.render(sassOptions, function (err, result) {
return (err)
? handleError(err);
: handleSuccess(result.css.toString());
});
}
// Example usage.
dynamicSass('some/path/entry.scss', {
'someColor': 'red',
'someFontSize': '18px'
}, someSuccessFn, someErrorFn);
Где функции "sassGenerator" могут выглядеть примерно как
function sassVariable(name, value) {
return "$" + name + ": " + value + ";";
}
function sassVariables(variablesObj) {
return Object.keys(variablesObj).map(function (name) {
return sassVariable(name, variablesObj[name]);
}).join('\n')
}
function sassImport(path) {
return "@import '" + path + "';";
}
Это позволяет вам писать свой SASS так же, как и раньше, с использованием переменных SASS в любом месте, где они необходимы. Это также не привязывает вас к любой "специальной динамической реализации sass" (т.е. Это позволяет избежать использования шаблонов underscore/lodash во всех ваших файлах .scss
). Это также означает, что вы можете использовать функции IDE, листинг и т.д. то же самое, так как теперь вы просто вернулись к написанию обычного SASS.
Кроме того, он отлично переносится на не-w632 > /http/компиляция на лету, такие как предварительная компиляция нескольких вариаций entry.scss
с учетом множества наборов значений через Gulp и т.д.
Я надеюсь, что это поможет вам @ChrisWright (и другим)! Я знаю, что я пытался найти информацию по этому вопросу, и я думаю, что это довольно распространенный случай использования (желающий передать динамические значения в SASS из базы данных, конфигурации, параметров HTTP и т.д.).