能压缩,但需额外插件;gulp-sass仅转换语法,dart sass已移除outputstyle参数;必须用gulp-plumber兜底错误并配合gulp-clean-css等实现压缩输出。

能,但默认不压缩,必须显式接入压缩插件;自动编译本身容易断,不加错误拦截 watch 一报错就停。
gulp-sass 编译后为什么没压缩?
因为 gulp-sass 只负责语法转换(SCSS → CSS),不处理压缩。它输出的是未压缩的、带缩进和换行的 CSS,哪怕你传了 { outputStyle: 'compressed' } —— 这个选项只在旧版 node-sass 中有效,Dart Sass(当前主流)已移除该参数,直接忽略。
- 正确做法是用
gulp-clean-css或gulp-cssmin接在gulp-sass后面做二次处理 - 别信
sass({ outputStyle: 'compressed' }),Dart Sass 不认这个,终端不会报错但也不起作用 - 如果用
postcss链路,可配cssnano替代,但多一层配置,小项目没必要
watch 一报错就中断,怎么让它“不死”?
根本原因是 gulp-sass 抛出异常时会终止整个 pipe 流,gulp.watch 没收到完成信号,监听就挂了。常见错误如 Error: Invalid CSS after "": expected "{", was "}" 出现后,后续保存完全没反应。
- 必须用
gulp-plumber包裹sass(),写成.pipe(plumber()).pipe(sass()),不能只写.pipe(sass().on('error', sass.logError)) -
.on('error', ...)只是打印日志,不阻止中断;plumber()才真正捕获并让流继续 - 别漏掉
plumber.stop—— 它不是函数名,而是plumber()的一个方法,用于在错误时停止后续 pipe(比如不往 dest 写坏文件)
如何一次跑通“监听 → 编译 → 压缩 → 输出”?
典型链路要四步串起来,顺序不能错:读源文件 → 编译 → 错误兜底 → 压缩 → 写目标目录。下面是一个可用的最小完整任务:
const gulp = require('gulp');
const sass = require('gulp-sass')(require('sass'));
const plumber = require('gulp-plumber');
const cleanCSS = require('gulp-clean-css');
gulp.task('sass:build', () => {
return gulp.src('src/scss/**/*.scss')
.pipe(plumber({ errorHandler: (err) => { console.error(err.message); plumber.stop(); } }))
.pipe(sass().on('error', sass.logError))
.pipe(cleanCSS({ level: { 1: { specialComments: 0 } } }))
.pipe(gulp.dest('dist/css'));
});
gulp.task('watch', () => {
gulp.watch('src/scss/**/*.scss', gulp.series('sass:build'));
});
-
cleanCSS的level配置可关掉版权注释,避免压缩后还留/*! */ - Gulp 4+ 必须用
gulp.series()包裹任务名传给watch,直接写字符串会静默失败 - 别把
cleanCSS放在plumber前面——压缩阶段出错也得兜住,否则照样中断监听
真正麻烦的不是链路拼接,而是路径映射和依赖感知。比如改了一个 _mixins.scss,但入口 main.scss 没被重新触发编译,就得靠 gulp-cached + gulp-dependents 或直接切到 Dart Sass 原生 --watch。这点多数人一开始根本意识不到。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











