GULP установка, плагины, gulpfile-s:#
gulp-clean-css#
gulp-clean-css: Это основной плагин для минификации и оптимизации CSS. Он удаляет лишние пробелы, комментарии, сжимает код и в некоторых случаях оптимизирует его структуру для уменьшения размера файла.
npm install --save-dev gulp gulp-concat gulp-clean-css gulp-autoprefixer
gulp-postcss с плагинами PostCSS:#
cssnano: Это мощный оптимизатор CSS. Он не просто минифицирует, но и выполняет более глубокую оптимизацию: удаляет дублирующиеся правила, объединяет селекторы, преобразует цвета и выполняет другие операции для максимального сжатия кода.
autoprefixer: Добавляет вендорные префиксы (-webkit-, -moz-) для поддержки старых версий браузеров, что является своего рода оптимизацией для кроссбраузерности.
postcss-discard-unused: Этот плагин удаляет неиспользуемые правила CSS (например, если вы импортировали весь фреймворк, но используете только несколько классов).
npm install --save-dev gulp-postcss postcss postcss-import gulp-autoprefixer gulp-clean-css
npm install --save-dev gulp
npm install -g gulp-cli
Параметры CSSnano#
минималный набор#
cssnano({
preset: ['default', {
calc: false, // ВАЖНО: не трогать calc/clamp
discardComments: {
removeAll: true
},
normalizeWhitespace: true,
colormin: true,
minifyFontValues: true,
minifyGradients: true,
minifySelectors: true,
// Безопасные отключения:
reduceIdents: false, // Не ломать @keyframes имена
zindex: false, // Не трогать z-index
discardUnused: false, // Не удалять "неиспользуемые" шрифты/keyframes
mergeIdents: false, // Безопаснее не объединять идентификаторы
cssDeclarationSorter: false // Не менять порядок свойств
}]
})
максимальный набор#
cssnano({
preset: ['default', {
// === Calc и математические функции ===
calc: false, // Не оптимизировать calc() выражения
// === Цвета ===
colormin: true, // Минимизировать цвета (#ffffff -> #fff)
// === Комментарии ===
discardComments: {
removeAll: true // Удалить все комментарии
// removeAllButFirst: false // Оставить только первый комментарий
},
// === Пробелы и форматирование ===
normalizeWhitespace: true, // Удалить лишние пробелы и переносы
// === At-rules ===
discardEmpty: true, // Удалить пустые правила
discardDuplicates: true, // Удалить дубликаты правил
discardOverridden: true, // Удалить перезаписанные @keyframes и @counter-style
discardUnused: false, // Удалить неиспользуемые @keyframes, @counter-style, @font-face
// === Шрифты ===
minifyFontValues: true, // Минимизировать font и font-family
// === Градиенты ===
minifyGradients: true, // Минимизировать градиенты
// === Селекторы ===
minifySelectors: true, // Минимизировать селекторы
discardComments: {
removeAll: true
},
// === URL и пути ===
normalizeUrl: true, // Нормализовать URL
normalizeUnicode: false, // Конвертировать Unicode в ASCII
// === Значения ===
normalizeString: true, // Нормализовать строки (кавычки)
normalizeCharset: true, // Добавить @charset если нужно
normalizeDisplayValues: true, // Нормализовать display значения
normalizePositions: true, // Нормализовать position значения (background-position и т.д.)
normalizeRepeatStyle: true, // Нормализовать repeat стили
normalizeTimingFunctions: true, // Нормализовать timing functions
// === Единицы измерения ===
convertValues: true, // Конвертировать значения (ms -> s, и т.д.)
// === Порядок свойств ===
cssDeclarationSorter: false, // Не сортировать CSS свойства
// === SVG ===
svgo: true, // Оптимизировать inline SVG
// === Слияние правил ===
mergeRules: true, // Объединять одинаковые правила
mergeLonghand: true, // Объединять longhand свойства (margin-top, margin-right -> margin)
mergeIdents: true, // Объединять одинаковые @keyframes и @counter-style
// === Упрощение ===
reduceIdents: false, // Сокращать имена @keyframes, @counter-style (может сломать JS)
reduceInitial: true, // Заменять initial на actual values где возможно
reduceTransforms: true, // Упрощать transform функции
// === Z-index ===
zindex: false, // Не rebasing z-index значений (может сломать layout)
// === Prefixes ===
autoprefixer: false, // Не удалять outdated prefixes (у вас уже есть autoprefixer)
// === Остальное ===
uniqueSelectors: true, // Удалять дубликаты селекторов
rawCache: true, // Кешировать сырые значения для производительности
// === Порядок медиа-запросов ===
orderValues: false, // Не менять порядок значений (может сломать специфичность)
}]
})
Install GULP#
#!/bin/bash
# install-local-gulp.sh
# Скрипт для установки gulp + популярных плагинов (sass, autoprefixer, browser-sync и т.д.)
# Остановить выполнение при ошибке
set -e
echo "🚀 Установка Gulp + плагинов..."
# Проверяем, есть ли package.json
if [ ! -f package.json ]; then
echo "📦 package.json не найден, создаем..."
npm init -y
fi
# Устанавливаем gulp и плагины локально
npm install --save-dev \
gulp \
sass \
gulp-sass \
gulp-sourcemaps \
gulp-autoprefixer \
gulp-clean-css \
cssnano \
perfectionist \
browser-sync \
gulp-postcss \
postcss \
postcss-import \
postcss-discard-unused \
gulp-rename
# Проверяем, установлен ли gulp-cli глобально
if ! command -v gulp &> /dev/null
then
echo "⚙️ Устанавливаю gulp-cli глобально..."
sudo npm install -g gulp-cli
else
echo "✅ gulp-cli уже установлен глобально"
fi
echo "⚙️ Устанавливаю normalize.css"
npm install normalize.css
echo "🎉 Установка завершена!"
gulpfile:#
gulpfile SCSS to CSS v. 1#
const gulp = require('gulp');
const sass = require('gulp-sass')(require('sass'));
function compileSass() {
return gulp.src('src/scss/**/*.scss')
.pipe(sass().on('error', sass.logError))
.pipe(gulp.dest('dist/css'));
}
exports.sass = compileSass;
gulpfile SCSS to CSS v. 2#
const gulp = require('gulp');
const sass = require('gulp-sass')(require('sass'));
const rename = require('gulp-rename');
gulp.task('sass', function() {
return gulp.src('src/scss/**/*.scss')
.pipe(sass({
outputStyle: 'expanded' // или 'compressed'
}).on('error', sass.logError))
.pipe(rename({
basename: 'style', // 'styles.css'
extname: '.css'
}))
.pipe(gulp.dest('assets/css'));
});
gulp.task('watch', function() {
gulp.watch('src/scss/**/*.scss', gulp.series('sass'));
});
Объединение импорта#
const gulp = require('gulp');
const postcss = require('gulp-postcss');
const autoprefixer = require('gulp-autoprefixer'); // Оставим его для совместимости
const cleanCSS = require('gulp-clean-css');
const postcssImport = require('postcss-import');
// Пути к исходным и целевым файлам
const paths = {
styles: {
src: 'src/css/main.css', // Теперь указываем только главный файл
dest: 'dist/css/'
}
};
// Задача для обработки CSS
function styles() {
return gulp.src(paths.styles.src)
.pipe(postcss([
postcssImport() // 1. Обрабатываем импорты
]))
.pipe(autoprefixer({ // 2. Добавляем вендорные префиксы
cascade: false
}))
.pipe(cleanCSS({ level: 2 })) // 3. Оптимизируем и минифицируем
.pipe(gulp.dest(paths.styles.dest)); // 4. Сохраняем результат
}
// Задача для отслеживания изменений в файлах
function watch() {
gulp.watch('src/css/**/*.css', styles); // Отслеживаем изменения во всех файлах
}
// Задачи Gulp по умолчанию
exports.styles = styles;
exports.watch = watch;
exports.default = gulp.series(styles, watch);
Объединение файлов#
const gulp = require('gulp');
const concat = require('gulp-concat');
const cleanCSS = require('gulp-clean-css');
const autoprefixer = require('gulp-autoprefixer');
// Пути к исходным и целевым файлам
const paths = {
styles: {
src: 'src/css/**/*.css', // Источник: все .css файлы в папке src/css
dest: 'dist/css/' // Цель: папка dist/css
}
};
// Задача для обработки CSS
function styles() {
return gulp.src(paths.styles.src) // 1. Берем исходные файлы
.pipe(concat('main.min.css')) // 2. Объединяем их в один файл 'main.min.css'
.pipe(autoprefixer({ // 3. Добавляем вендорные префиксы
cascade: false
}))
.pipe(cleanCSS({ level: 2 })) // 4. Оптимизируем и минифицируем CSS
.pipe(gulp.dest(paths.styles.dest)); // 5. Сохраняем результат в папку назначения
}
// Задача для отслеживания изменений в файлах
function watch() {
gulp.watch(paths.styles.src, styles);
}
// Задачи Gulp по умолчанию
exports.styles = styles;
exports.watch = watch;
exports.default = gulp.series(styles, watch); // Задача по умолчанию, запускает обе задачи