Взгляните на это:
const gulp = require("gulp");
const concat = require("gulp-concat");
const fs = require("fs");
// const path = require("path"); // not used (yet)
const replace = require("gulp-replace");
let arrayOfImports = [];
function getArrayOfImports(master) {
// how to handle no such file? what does sass do?
let fileContents = fs.readFileSync(master, 'utf8');
let regexp = /^\s*@use ['"](.*?)['"];/gm; // @use "colors";
let useArray = fileContents.matchAll(regexp); // get all @use... matches in the file
for (let use of useArray) {
let usePath = `_${ use[1] }.scss`; // use[1] = colors, change to _colors.scss
getArrayOfImports(usePath); // recursive
arrayOfImports.push(usePath); // after recursive call so deeper levels are pushed first
};
};
function concatSources(cb) {
getArrayOfImports("index.scss");
arrayOfImports.push("index.scss");
console.log(arrayOfImports);
return (
gulp
.src(arrayOfImports)
.pipe(concat('dist.scss'))
.pipe(replace(/^\s*@use (.*?);\s*\n?/gm, "")) // strip out @use lines
.pipe(gulp.dest('./css'))
);
cb();
}
exports.default = gulp.series(concatSources);
Я использовал @use
вместо @import
, поскольку теперь использование @import
не рекомендуется, см. https://sass-lang.com/documentation/at-rules/import
И если вы переключаетесь, используйте gulp-dart-sass
. Но вы можете легко изменить приведенный выше код, чтобы использовать @imports
.
Он обрабатывает рекурсивные @use
в правильном порядке и удаляет их из окончательного dist.scss
.
Теперь он может искать только @use ....;
в ваших файлах - если вы поместите что-то, что соответствует ^\s*@use ['"](.*?)['"];
где-нибудь в файле, где его не должно быть - оно все равно будет захвачено, но я полагаю, что это будет ваша вина.
TODO: я еще не исследовал такие вызовы, как @use 'folder/subFolder/colors4'
, но они все равно должны работать (возможно добавление ./
в начало функции).