高级前端进阶,用gulp提升你的开发效率
zhezhongyun 2025-09-29 16:03 5 浏览
前言:
这两天动手配置了一下gulp,发现gulp配置简单,构建速度快,在某些使用场景下还是个不错的选择,本文从零开始构建,到最后打包发布到生成环境。通过本文可以快速上手gulp,文末附送github源码,需要的可以点击下载。
gulp介绍:
gulp是一个基于流的前端自动化构建工具,与grunt、webpack为前端三大自动构建工具。
1.安装
//1.安装gulp脚手架
npm install --global gulp-cli
//2.创建文件夹gulp-demo
mkdir gulp-demo
//3.进入文件夹
cd gulp-demo
//4.初始化项目
npm init
2.gulpfile.js介绍
在项目根目录创建个gulpfile.js文件,执行gulp命令后,gulp会去读取gulpfile.js文件,这是gulp的入口文件,所有的指令逻辑处理都在此文件中进行。
当项目体量过大时,可以在根目录内创建个gulpfile.js文件夹,文件夹内部创建index.js,可以在index.js中引入不同的处理模块.
在以前的版本中都是通过gulp.task来创建不同的任务,新版本主要通过exports.xxx来导出任务
例:
function test(cb) {
cb()
}
exports.test = test;
在控制台输入指令gulp test
[16:41:29] Using gulpfile F:\gulp\gulpfile.js
[16:41:29] Starting 'test'...
[16:41:29] Finished 'test' after 1.95 ms
如果将exports.test = test改为exports.default=test,在控制台直接输入gulp就可以直接构建了。
1.处理js
压缩js、创建sourcemap、重命名js
const {
src, //gulp的内置方法
dest
} = require('gulp');
//重命名js文件
const rename = require('gulp-rename');
const uglify = require('gulp-uglify');
const sourcemaps = require('gulp-sourcemaps');
function javascript() {
return src(['src/js/*.js', '!src/js/*.min.js']) //1.创建一个流,从src读取
//2.创建sourcemap
.pipe(sourcemaps.init())
//pipe为gulp内的一个方法
//用于流之间的链接
// 3. 压缩文件
.pipe(uglify())
//4.重命名,名称后加min.js
.pipe(rename({
extname: '.min.js'
}))
//5.将sourcemap写入
.pipe(sourcemaps.write('./'))
// 6.将文件写入build/js目录下
.pipe(dest('build/js'))
}
exports.javascript = javascript;
控制台输入指令gulp javascript
在build/js下会生成两个文件index.min.js 以及index.min.js.map
2.处理css
压缩css、创建sourcemap、重命名css
const {
src,
dest
} = require('gulp');
const minifyCSS = require('gulp-clean-css');
const sourcemaps = require('gulp-sourcemaps');
const autoprefixer = require('gulp-autoprefixer');
function css() {
return src('src/css/*.css') //1.流入口文件
//2.创建sourcemap
.pipe(sourcemaps.init())
//3.自动添加浏览器前缀
.pipe(autoprefixer())
// 4.压缩css
.pipe(minifyCSS())
//5.写入sourcemap
.pipe(sourcemaps.write('./'))
//6.写入文件
.pipe(dest('build/css'))
}
exports.css = css;
控制台输入指令gulp css
在build/js下会生成两个文件index.min.css 以及index.min.css.map
3.处理图片
const {
src,
dest
} = require('gulp');
const imagemin = require('gulp-imagemin')
function image() {
return src('src/images/*.*') // 1. 创建输入流
// 2. 压缩图片
.pipe(imagemin({
progressive: true
}))
// 3. 写入文件
.pipe(dest('build/images'))
}
exports.image = image;
控制台输入指令gulp image
[17:00:07] Using gulpfile F:\gulp-demo\gulpfile.js
[17:00:07] Starting 'image'...
[17:00:19] gulp-imagemin: Minified 3 images (saved 449 kB - 35.5%)
[17:00:19] Finished 'image' after 12 s
可以看到图片的压缩比例
4.处理less
const {
src,
dest
} = require('gulp');
const gulpLess = require('gulp-less');
const minifyCss = require('gulp-clean-css')
const sourcemaps = require('gulp-sourcemaps');
const rename = require('gulp-rename');
function less() {
return src('src/less/**.less') //1.创建输入流
//2.创建sourcemap
.pipe(sourcemaps.init())
//3.less转为css
.pipe(gulpLess())
//4.压缩css
.pipe(minifyCss())
//5.修改名称
.pipe(rename({extname: '.min.css'}))
//6.写入sourcemap
.pipe(sourcemaps.write('./'))
//7.写入文件
.pipe(dest('build/less'))
}
exports.less = less;
控制台输入指令gulp less 在build/less下会生成两个文件index.min.css 以及index.min.css.map
基本使用介绍完毕,接下来咱们分别通过开发环境跟正式环境来配置gulp
开发环境:
开发环境需要:
- css浏览器前缀添加
- 热更新
- 静态服务器启动
相关配置:
const gulp = require('gulp');
//内置方法
const {
series,
parallel,
watch,
src,
dest
} = require('gulp');
//工具
const autoprefixer = require('gulp-autoprefixer');
const include = require('gulp-file-include');
const clean = require('gulp-clean');
//转码
const less = require('gulp-less');
//浏览器
const browserSync = require('browser-sync').create();
const reload = browserSync.reload;
//源文件路径
const srcPath = {
root: 'src',
html: ['src/**/*.html', '!src/include/**/*.html'],
images: 'src/images/*',
css: 'src/css/*.css',
less: 'src/less/*.less',
js: 'src/js/*.js',
library: 'src/library/*.js'
};
//开发生成路径
const distPath = {
root: 'dist',
html: 'dist',
images: 'dist/images',
css: 'dist/css',
less: 'dist/less',
js: 'dist/js',
library: 'dist/library',
manifest: 'dist/**/*.json',
};
//开发环境
//css处理
function cssDev() {
return src(srcPath.css)
.pipe(autoprefixer({
browsers: ['last 2 versions'],
cascade: false,
}))
.pipe(dest(distPath.css))
.pipe(reload({
stream: true
}))
}
//less处理
function lessDev() {
return src(srcPath.less)
.pipe(less())
.pipe(autoprefixer({
browsers: ['last 2 versions'],
cascade: false,
}))
.pipe(dest(distPath.less))
.pipe(reload({
stream: true
}))
}
//js处理
function jsDev() {
return gulp.src(srcPath.js)
.pipe(dest(distPath.js))
.pipe(reload({
stream: true
}))
}
//library 处理
function libraryDev() {
return src(srcPath.library)
.pipe(dest(distPath.library))
.pipe(reload({
stream: true
}))
}
//image 处理
function imagesDev() {
return src(srcPath.images)
.pipe(dest(distPath.images))
.pipe(reload({
stream: true
}))
}
//html 处理
function htmlDev() {
return src(srcPath.html)
.pipe(include({}))
.pipe(dest(distPath.html))
.pipe(reload({
stream: true
}))
}
//清除dist目录
function cleanDir() {
return src('dist/*')
.pipe(clean({
read: false
}))
}
//静态服务器
function browser() {
browserSync.init({
server: {
baseDir: './dist',
}
})
watchDev();
}
function watchDev() {
console.log("开始监控")
watch(srcPath.css, function(cb) {
cssDev()
});
watch(srcPath.less, function(cb) {
lessDev()
});
watch(srcPath.html, function(cb) {
htmlDev()
});
watch(srcPath.js, function(cb) {
jsDev()
});
watch(srcPath.library, function(cb) {
libraryDev()
});
watch(srcPath.images, function(cb) {
imagesDev()
});
}
exports.dev = series(cleanDir, parallel(libraryDev, cssDev, lessDev, imagesDev, jsDev, htmlDev), browser)
在控制台输入gulp dev,浏览器会启动,默认端口号:3000,文件更新后会监听到并更新。
生产环境
生产环境需要:
- 代码压缩
- js、css生成hash名称
- css添加前缀
- 图片压缩
const gulp = require('gulp');
const {
series,
parallel,
watch,
src,
dest
} = require('gulp');
//工具
const autoprefixer = require('gulp-autoprefixer');
const include = require('gulp-file-include');
const clean = require('gulp-clean');
//转码
const less = require('gulp-less');
const babel = require('gulp-babel');
const css_base64 = require('gulp-css-base64');
//压缩优化
const minifyHtml = require('gulp-htmlmin');
const minifyImage = require('gulp-imagemin');
const minifyJs = require('gulp-uglify');
const minifyCss = require('gulp-clean-css');
//版本控制
const rev = require('gulp-rev');
const revCollector = require('gulp-rev-collector');
const delOriginal = require('gulp-rev-delete-original');
//浏览器
const browserSync = require('browser-sync').create();
const reload = browserSync.reload;
//源文件路径
const srcPath = {
root: 'src',
html: ['src/**/*.html', '!src/include/**/*.html'],
images: 'src/images/*',
css: 'src/css/*.css',
less: 'src/less/*.less',
js: 'src/js/*.js',
library: 'src/library/*.js'
};
//生产生成路径
const buildPath = {
root: 'build',
html: 'build',
images: 'build/images',
css: 'build/css',
less: 'build/less',
js: 'build/js',
library: 'build/library',
manifest: 'build/**/*.json',
};
//生产环境
//第三方库
function libraryBuild() {
return src(srcPath.library)
.pipe(minifyJs())
.pipe(dest(buildPath.library));
}
//css处理
function cssBuild() {
return src([buildPath.manifest, buildPath.css + '/*.css'])
.pipe(revCollector())
.pipe(rev())
.pipe(delOriginal())
.pipe(dest(buildPath.css))
.pipe(rev.manifest())
.pipe(dest(buildPath.css))
}
function cssCompile() {
return src([srcPath.css])
.pipe(css_base64({
maxWeightResource: 8 * 1024,
}))
.pipe(autoprefixer())
.pipe(minifyCss())
.pipe(dest(buildPath.css))
}
//less处理
function lessBuild() {
return src([buildPath.manifest, buildPath.less + '/*.css'])
.pipe(revCollector())
.pipe(rev())
.pipe(delOriginal())
.pipe(dest(buildPath.less))
.pipe(rev.manifest())
.pipe(dest(buildPath.less))
}
function lessCompile() {
return src([srcPath.less])
.pipe(css_base64({
maxWeightResource: 8 * 1024,
}))
.pipe(less())
.pipe(autoprefixer())
.pipe(minifyCss())
.pipe(dest(buildPath.less))
}
//js处理
function jsBuild() {
return src(srcPath.js)
.pipe(babel({
presets: ['env'],
}))
.pipe(minifyJs())
.pipe(rev())
.pipe(dest(buildPath.js))
.pipe(rev.manifest())
.pipe(dest(buildPath.js))
}
//image 处理
function imagesBuild() {
return src(srcPath.images)
.pipe(minifyImage())
.pipe(rev())
.pipe(dest(buildPath.images))
.pipe(rev.manifest())
.pipe(dest(buildPath.images))
}
//html 处理
function htmlBuild() {
return src([buildPath.manifest, ...srcPath.html])
.pipe(include({}))
.pipe(revCollector({
replaceReved: true,
}))
.pipe(minifyHtml({
collapseWhitespace: true,
}))
.pipe(dest(buildPath.html))
}
//清除build目录
function cleanBuild() {
return src('build/*')
.pipe(clean({
read: false
}))
}
//清除manifest
function cleanManifest() {
return src('build/**/*.json')
.pipe(clean({
read: false
}))
}
exports.build = series(cleanBuild, imagesBuild, jsBuild, libraryBuild, lessCompile, lessBuild, cssCompile, cssBuild, htmlBuild,
cleanManifest)
控制台输入gulp build就会生成build目录,将生成后的目录上传至服务器即可
[20:27:33] Using gulpfile F:\gulp-demo\gulpfile.js
[20:27:33] Starting 'build'...
[20:27:33] Starting 'cleanBuild'...
[20:27:33] Finished 'cleanBuild' after 37 ms
[20:27:33] Starting 'imagesBuild'...
[20:27:45] gulp-imagemin: Minified 2 images (saved 174 kB - 21.5%)
[20:27:45] Finished 'imagesBuild' after 12 s
[20:27:45] Starting 'jsBuild'...
[20:27:46] Finished 'jsBuild' after 832 ms
[20:27:46] Starting 'libraryBuild'...
[20:27:46] Finished 'libraryBuild' after 3.77 ms
[20:27:46] Starting 'lessCompile'...
[20:27:46] Finished 'lessCompile' after 66 ms
[20:27:46] Starting 'lessBuild'...
[20:27:46] Finished 'lessBuild' after 18 ms
[20:27:46] Starting 'cssCompile'...
[20:27:46] Finished 'cssCompile' after 8.67 ms
[20:27:46] Starting 'cssBuild'...
[20:27:46] Finished 'cssBuild' after 13 ms
[20:27:46] Starting 'htmlBuild'...
[20:27:46] Finished 'htmlBuild' after 23 ms
[20:27:46] Finished 'build' after 13 s
最后附上github地址:demo下载(https://github.com/zuohahaha/gulp-demo.git)
相关推荐
- VSCode中值得推荐的常用的23个高效前端插件(工具篇)(一)
-
VSCode是我们前端开发的一个强大的IDE,所以选择趁手好用的插件是提高开发效率,然后剩下的时间用来摸鱼是很有必要滴。工具篇(23)Chinese(Simplified)vscode我们都知道是...
- 高级前端进阶,用gulp提升你的开发效率
-
前言:这两天动手配置了一下gulp,发现gulp配置简单,构建速度快,在某些使用场景下还是个不错的选择,本文从零开始构建,到最后打包发布到生成环境。通过本文可以快速上手gulp,文末附送github源...
- Chrome 110 3大新特性!CSS支持画中画!
-
大家好,很高兴又见面了,我是"前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!今天带着大家一起看看最新发布的Chrome1...
- 用html中If语句——判断ie浏览器的版本
-
if语句的代码的语法非常简单,,就是一个if判断语句来判断浏览器的类型和版本,应用类似<!--[iflteIE6]>和<![endif]-->语法结构包孕起来...
- 谷歌浏览器怎么开启无痕浏览_谷歌浏览器怎么开启无痕浏览模式
-
很多用户在使用谷歌浏览器时,不希望留下任何上痕迹,开启无痕浏览器是最好的选择。这个模式下可以更好的保护个人隐私记录,给你带来更加安全的冲浪体验,接下来就给大家详细介绍下谷歌浏览器的无痕浏览模式,希望对...
- Linux命令那么多,其实只需要记住这些就足够了!
-
你好,这里是网络技术联盟站,我是瑞哥。Linux命令行是一个强大且灵活的工具,可以极大地提高用户的工作效率和系统管理能力。我们都知道,Linux命令非常多,但是在实际的工作中,日常使用到的命令并不多,...
- Linux如何查看文件_linux如何查看文件大小
-
Linux如何查看目录下的所有文件?用ls(list)查看当前目录下的所有文件和子目录。Ls查看目录下的文件,怎么区分是目录还是文件呢?第一种方式,我们可以通过颜色来区分目录和文件。默认情况下,目录显...
- Linux系统man命令使用详解_linux man命令详解
-
man命令是在Linux和Unix系统上用于查看系统手册页(manualpages)的工具。手册页提供了关于系统命令、函数和文件的详细文档。命令语法:man[选项][命令或主题]参数:[选项]...
- linux ps命令详解_linux中ps
-
linux中ps只显示进程的静态快照,及瞬间的进程状态,它拥有众多的风格,可分为3组:UNIX风格,BSD风格,GNU风格,本文介绍UNIX风格的ps指令。参数ps[-aefFly][-ppid...
- 如何在 Linux 上查找系统硬件信息?hwinfo命令很强大!
-
hwinfo是一个功能强大的硬件信息查询工具,专为Linux系统设计。它能够提供系统中几乎所有硬件组件的详细信息,包括但不限于CPU、内存、硬盘、网络设备、USB设备、显卡、声卡等。与其他常...
- Linux Shell 入门教程(二):常用命令大全与使用技巧
-
在上一节《理解Linux与Shell》中,我们了解了Linux是什么、Shell是什么以及常见的Shell类型。这一篇,我们将正式动手操作,掌握使用频率最高、最实用的Linux命令...
- SpringBoot应用部署神器:可视化服务管理脚本让运维更轻松
-
在SpringBoot应用的生产环境部署中,传统的手动启停服务方式不仅效率低下,还容易出错。今天分享一个功能强大的可视化服务管理脚本,让SpringBoot应用的部署和运维变得简单高效。痛点分析:传统...
- 一次虚拟机性能问题导致的应用故障
-
最近我负责维护的一套语音平台出了问题。故障现象据客户反馈是转入IVR以后没有正常响应,客户无奈挂机了。老实说,刚开始接到用户反馈的时候,我是不太相信的。我们的系统平时运行运行很稳定,客户的并发数不大,...
- linux中的常用命令_linux常用命令及含义
-
linux中的常用命令linux中的命令统称shell命令shell是一个命令行解释器,将用户命令解析为操作系统所能理解的指令,实现用户与操作系统的交互shell终端:我们平时输入命令,执行程序的那个...
- linux学习笔记——常用命令-文件处理命令
-
ls目录处理命令:ls全名:list命令路径:/bin/ls执行权限:所有用户ls–ala--alll–long-i查看i节点ls–i查看i节点命令名称:mkdir命令英文原意:m...
- 一周热门
- 最近发表
- 标签列表
-
- HTML 教程 (33)
- HTML 简介 (35)
- HTML 实例/测验 (32)
- HTML 测验 (32)
- JavaScript 和 HTML DOM 参考手册 (32)
- HTML 拓展阅读 (30)
- HTML文本框样式 (31)
- HTML滚动条样式 (34)
- HTML5 浏览器支持 (33)
- HTML5 新元素 (33)
- HTML5 WebSocket (30)
- HTML5 代码规范 (32)
- HTML5 标签 (717)
- HTML5 标签 (已废弃) (75)
- HTML5电子书 (32)
- HTML5开发工具 (34)
- HTML5小游戏源码 (34)
- HTML5模板下载 (30)
- HTTP 状态消息 (33)
- HTTP 方法:GET 对比 POST (33)
- 键盘快捷键 (35)
- 标签 (226)
- HTML button formtarget 属性 (30)
- opacity 属性 (32)
- transition 属性 (33)