百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

高级前端进阶,用gulp提升你的开发效率

zhezhongyun 2025-09-29 16:03 38 浏览

前言:

这两天动手配置了一下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

开发环境:

开发环境需要:

  1. css浏览器前缀添加
  2. 热更新
  3. 静态服务器启动

相关配置:

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,文件更新后会监听到并更新。

生产环境

生产环境需要:

  1. 代码压缩
  2. js、css生成hash名称
  3. css添加前缀
  4. 图片压缩
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)

相关推荐

Python入门学习记录之一:变量_python怎么用变量

写这个,主要是对自己学习python知识的一个总结,也是加深自己的印象。变量(英文:variable),也叫标识符。在python中,变量的命名规则有以下三点:>变量名只能包含字母、数字和下划线...

python变量命名规则——来自小白的总结

python是一个动态编译类编程语言,所以程序在运行前不需要如C语言的先行编译动作,因此也只有在程序运行过程中才能发现程序的问题。基于此,python的变量就有一定的命名规范。python作为当前热门...

Python入门学习教程:第 2 章 变量与数据类型

2.1什么是变量?在编程中,变量就像一个存放数据的容器,它可以存储各种信息,并且这些信息可以被读取和修改。想象一下,变量就如同我们生活中的盒子,你可以把东西放进去,也可以随时拿出来看看,甚至可以换成...

绘制学术论文中的“三线表”具体指导

在科研过程中,大家用到最多的可能就是“三线表”。“三线表”,一般主要由三条横线构成,当然在变量名栏里也可以拆分单元格,出现更多的线。更重要的是,“三线表”也是一种数据记录规范,以“三线表”形式记录的数...

Python基础语法知识--变量和数据类型

学习Python中的变量和数据类型至关重要,因为它们构成了Python编程的基石。以下是帮助您了解Python中的变量和数据类型的分步指南:1.变量:变量在Python中用于存储数据值。它们充...

一文搞懂 Python 中的所有标点符号

反引号`无任何作用。传说Python3中它被移除是因为和单引号字符'太相似。波浪号~(按位取反符号)~被称为取反或补码运算符。它放在我们想要取反的对象前面。如果放在一个整数n...

Python变量类型和运算符_python中变量的含义

别再被小名词坑哭了:Python新手常犯的那些隐蔽错误,我用同事的真实bug拆给你看我记得有一次和同事张姐一起追查一个看似随机崩溃的脚本,最后发现罪魁祸首竟然是她把变量命名成了list。说实话...

从零开始:深入剖析 Spring Boot3 中配置文件的加载顺序

在当今的互联网软件开发领域,SpringBoot无疑是最为热门和广泛应用的框架之一。它以其强大的功能、便捷的开发体验,极大地提升了开发效率,成为众多开发者构建Web应用程序的首选。而在Spr...

Python中下划线 ‘_’ 的用法,你知道几种

Python中下划线()是一个有特殊含义和用途的符号,它可以用来表示以下几种情况:1在解释器中,下划线(_)表示上一个表达式的值,可以用来进行快速计算或测试。例如:>>>2+...

解锁Shell编程:变量_shell $变量

引言:开启Shell编程大门Shell作为用户与Linux内核之间的桥梁,为我们提供了强大的命令行交互方式。它不仅能执行简单的文件操作、进程管理,还能通过编写脚本实现复杂的自动化任务。无论是...

一文学会Python的变量命名规则!_python的变量命名有哪些要求

目录1.变量的命名原则3.内置函数尽量不要做变量4.删除变量和垃圾回收机制5.结语1.变量的命名原则①由英文字母、_(下划线)、或中文开头②变量名称只能由英文字母、数字、下画线或中文字所组成。③英文字...

更可靠的Rust-语法篇-区分语句/表达式,略览if/loop/while/for

src/main.rs://函数定义fnadd(a:i32,b:i32)->i32{a+b//末尾表达式}fnmain(){leta:i3...

C++第五课:变量的命名规则_c++中变量的命名规则

变量的命名不是想怎么起就怎么起的,而是有一套固定的规则的。具体规则:1.名字要合法:变量名必须是由字母、数字或下划线组成。例如:a,a1,a_1。2.开头不能是数字。例如:可以a1,但不能起1a。3....

Rust编程-核心篇-不安全编程_rust安全性

Unsafe的必要性Rust的所有权系统和类型系统为我们提供了强大的安全保障,但在某些情况下,我们需要突破这些限制来:与C代码交互实现底层系统编程优化性能关键代码实现某些编译器无法验证的安全操作Rus...

探秘 Python 内存管理:背后的神奇机制

在编程的世界里,内存管理就如同幕后的精密操控者,确保程序的高效运行。Python作为一种广泛使用的编程语言,其内存管理机制既巧妙又复杂,为开发者们提供了便利的同时,也展现了强大的底层控制能力。一、P...