Gulp 基本使用
Gulp 的基本使用方法和常见任务配置
📋 目录
创建 gulpfile.js
基本结构
// gulpfile.js
const { src, dest, watch, series, parallel } = require('gulp');
// 定义任务
function taskName() {
return src('src/file')
.pipe(dest('dist/'));
}
// 导出任务
exports.taskName = taskName;
exports.default = taskName;项目结构
project/
├── src/ # 源文件目录
│ ├── js/ # JavaScript 文件
│ ├── css/ # CSS 文件
│ ├── images/ # 图片文件
│ └── index.html # HTML 文件
├── dist/ # 输出目录(自动生成)
├── gulpfile.js # Gulp 配置文件
└── package.json # 项目配置
定义基本任务
复制文件
// 复制所有文件
function copy() {
return src('src/**/*')
.pipe(dest('dist/'));
}
// 复制特定文件
function copyHtml() {
return src('src/*.html')
.pipe(dest('dist/'));
}
exports.copy = copy;清理文件
const del = require('del');
// 清理 dist 目录
function clean() {
return del(['dist/*']);
}
// 清理特定文件
function cleanJs() {
return del(['dist/js/*.js']);
}
exports.clean = clean;处理 JavaScript
压缩 JavaScript
const uglify = require('gulp-uglify');
// 压缩 JS
function scripts() {
return src('src/js/**/*.js')
.pipe(uglify())
.pipe(dest('dist/js'));
}
exports.scripts = scripts;合并 JavaScript
const concat = require('gulp-concat');
// 合并 JS 文件
function scripts() {
return src('src/js/**/*.js')
.pipe(concat('app.js')) // 合并为 app.js
.pipe(uglify())
.pipe(dest('dist/js'));
}Babel 转译
const babel = require('gulp-babel');
// ES6+ 转 ES5
function scripts() {
return src('src/js/**/*.js')
.pipe(babel({
presets: ['@babel/preset-env']
}))
.pipe(uglify())
.pipe(dest('dist/js'));
}生成 Source Map
const sourcemaps = require('gulp-sourcemaps');
// 生成 sourcemap
function scripts() {
return src('src/js/**/*.js')
.pipe(sourcemaps.init())
.pipe(babel())
.pipe(uglify())
.pipe(sourcemaps.write('.'))
.pipe(dest('dist/js'));
}完整 JavaScript 处理流程
function scripts() {
return src('src/js/**/*.js')
.pipe(sourcemaps.init())
.pipe(babel({
presets: ['@babel/preset-env']
}))
.pipe(concat('app.min.js'))
.pipe(uglify())
.pipe(sourcemaps.write('.'))
.pipe(dest('dist/js'));
}处理 CSS
压缩 CSS
const cleanCSS = require('gulp-clean-css');
// 压缩 CSS
function styles() {
return src('src/css/**/*.css')
.pipe(cleanCSS())
.pipe(dest('dist/css'));
}Sass 编译
const sass = require('gulp-sass')(require('sass'));
// 编译 Sass
function styles() {
return src('src/scss/**/*.scss')
.pipe(sass().on('error', sass.logError))
.pipe(cleanCSS())
.pipe(dest('dist/css'));
}Less 编译
const less = require('gulp-less');
// 编译 Less
function styles() {
return src('src/less/**/*.less')
.pipe(less())
.pipe(cleanCSS())
.pipe(dest('dist/css'));
}PostCSS 处理
const postcss = require('gulp-postcss');
const autoprefixer = require('autoprefixer');
const cssnano = require('cssnano');
// PostCSS 处理
function styles() {
return src('src/css/**/*.css')
.pipe(postcss([
autoprefixer(),
cssnano()
]))
.pipe(dest('dist/css'));
}完整 CSS 处理流程
function styles() {
return src('src/scss/**/*.scss')
.pipe(sourcemaps.init())
.pipe(sass().on('error', sass.logError))
.pipe(postcss([
autoprefixer(),
cssnano()
]))
.pipe(concat('app.min.css'))
.pipe(sourcemaps.write('.'))
.pipe(dest('dist/css'));
}处理 HTML
压缩 HTML
const htmlmin = require('gulp-htmlmin');
// 压缩 HTML
function html() {
return src('src/*.html')
.pipe(htmlmin({
collapseWhitespace: true,
removeComments: true
}))
.pipe(dest('dist/'));
}
exports.html = html;模板引擎
const pug = require('gulp-pug');
// 编译 Pug 模板
function html() {
return src('src/pug/**/*.pug')
.pipe(pug({
pretty: true
}))
.pipe(dest('dist/'));
}文件包含
const fileInclude = require('gulp-file-include');
// 包含 HTML 片段
function html() {
return src('src/*.html')
.pipe(fileInclude({
prefix: '@@',
basepath: '@file'
}))
.pipe(htmlmin())
.pipe(dest('dist/'));
}处理图片
压缩图片
const imagemin = require('gulp-imagemin');
// 压缩图片
function images() {
return src('src/images/**/*')
.pipe(imagemin([
imagemin.gifsicle({ interlaced: true }),
imagemin.mozjpeg({ quality: 75, progressive: true }),
imagemin.optipng({ optimizationLevel: 5 }),
imagemin.svgo({
plugins: [
{ removeViewBox: true },
{ cleanupIDs: false }
]
})
]))
.pipe(dest('dist/images'));
}响应式图片
const responsive = require('gulp-responsive');
// 生成响应式图片
function images() {
return src('src/images/**/*.{jpg,png}')
.pipe(responsive({
'*.jpg': [
{ width: 320, rename: { suffix: '-small' } },
{ width: 640, rename: { suffix: '-medium' } },
{ width: 1024, rename: { suffix: '-large' } }
]
}))
.pipe(dest('dist/images'));
}WebP 转换
const webp = require('gulp-webp');
// 转换为 WebP
function webpImages() {
return src('src/images/**/*.{jpg,png}')
.pipe(webp({
quality: 85
}))
.pipe(dest('dist/images'));
}文件监听
基本监听
const { watch } = require('gulp');
// 监听文件变化
function dev() {
watch('src/js/**/*.js', scripts);
watch('src/css/**/*.css', styles);
watch('src/*.html', html);
watch('src/images/**/*', images);
}
exports.dev = dev;监听选项
function dev() {
watch('src/js/**/*.js', {
delay: 500, // 防抖延迟(毫秒)
ignoreInitial: false, // 是否忽略初始文件
queue: true // 是否排队执行
}, scripts);
}监听事件
function dev() {
const watcher = watch('src/js/**/*.js', scripts);
watcher.on('change', (path) => {
console.log(`File ${path} was changed`);
});
watcher.on('add', (path) => {
console.log(`File ${path} was added`);
});
watcher.on('unlink', (path) => {
console.log(`File ${path} was removed`);
});
}创建开发服务器
使用 gulp-connect
const connect = require('gulp-connect');
// 启动开发服务器
function server() {
connect.server({
root: 'dist',
port: 8080,
livereload: true
});
}
// 自动刷新
function html() {
return src('src/*.html')
.pipe(htmlmin())
.pipe(dest('dist'))
.pipe(connect.reload());
}
exports.server = series(build, server, dev);使用 browser-sync
const browserSync = require('browser-sync').create();
// 初始化 BrowserSync
function server() {
browserSync.init({
server: {
baseDir: './dist'
},
port: 3000,
open: true
});
}
// 自动刷新
function html() {
return src('src/*.html')
.pipe(htmlmin())
.pipe(dest('dist'))
.pipe(browserSync.stream());
}
// 监听文件
function dev() {
watch('src/js/**/*.js', series(scripts, browserSync.reload));
watch('src/css/**/*.css', series(styles, browserSync.reload));
watch('src/*.html', series(html, browserSync.reload));
}
exports.dev = series(build, parallel(server, dev));完整开发环境配置
// 开发模式
gulp.task('dev', gulp.series(
'build',
gulp.parallel('server', 'watch')
));
// 生产构建
gulp.task('build', gulp.series(
'clean',
gulp.parallel('scripts', 'styles', 'html', 'images')
));
// 默认任务
gulp.task('default', gulp.series('dev'));完整示例
完整 gulpfile.js
const { src, dest, watch, series, parallel } = require('gulp');
const uglify = require('gulp-uglify');
const babel = require('gulp-babel');
const sass = require('gulp-sass')(require('sass'));
const cleanCSS = require('gulp-clean-css');
const postcss = require('gulp-postcss');
const autoprefixer = require('autoprefixer');
const htmlmin = require('gulp-htmlmin');
const imagemin = require('gulp-imagemin');
const concat = require('gulp-concat');
const sourcemaps = require('gulp-sourcemaps');
const browserSync = require('browser-sync').create();
const del = require('del');
// 清理
gulp.task('clean', () => {
return del(['dist/*']);
});
// JavaScript
gulp.task('scripts', () => {
return src('src/js/**/*.js')
.pipe(sourcemaps.init())
.pipe(babel({
presets: ['@babel/preset-env']
}))
.pipe(concat('app.min.js'))
.pipe(uglify())
.pipe(sourcemaps.write('.'))
.pipe(dest('dist/js'))
.pipe(browserSync.stream());
});
// CSS
gulp.task('styles', () => {
return src('src/scss/**/*.scss')
.pipe(sourcemaps.init())
.pipe(sass().on('error', sass.logError))
.pipe(postcss([
autoprefixer(),
cssnano()
]))
.pipe(concat('app.min.css'))
.pipe(sourcemaps.write('.'))
.pipe(dest('dist/css'))
.pipe(browserSync.stream());
});
// HTML
gulp.task('html', () => {
return src('src/*.html')
.pipe(htmlmin({
collapseWhitespace: true,
removeComments: true
}))
.pipe(dest('dist'))
.pipe(browserSync.stream());
});
// Images
gulp.task('images', () => {
return src('src/images/**/*')
.pipe(imagemin())
.pipe(dest('dist/images'));
});
// Server
gulp.task('server', () => {
browserSync.init({
server: {
baseDir: './dist'
}
});
});
// Watch
gulp.task('watch', () => {
watch('src/js/**/*.js', scripts);
watch('src/scss/**/*.scss', styles);
watch('src/*.html', html);
watch('src/images/**/*', images);
});
// Build
gulp.task('build', series(
clean,
parallel(scripts, styles, html, images)
));
// Dev
gulp.task('dev', series(
build,
parallel(server, watch)
));
// Default
gulp.task('default', dev);📚 相关链接
标签: gulp 基本使用 javascript css html