tags: ‘gulp’

categories: “gulp”

Gulp基础

Gulp运行环境

  1. // gulp的使用需要安装两个gulp,一个是本地的一个是全局的
  2. // 第一步、安装gulp:
  3. >全局的:npm i gulp -g 启动器(只负责启动)
  4. >本地的:npm i gulp 核心库(只负责提供各种功能)
  5. // 第二步
  6. // gulp也好,webpack也好,它的每一个功能基本都是由一个独立的组件完成的,所以需要包管理
  7. 输入命令npm init -y
  8. // 如果使用cnpm init -y,会出现很多乱的依赖项,cnpm的层级不对,需要删除配置中的依赖项
  9. // 再输入本地安装命令:cnpm i gulp -D
  10. // 第三步、编写配置:
  11. 文件名:gulpfile.js
  12. gulpfile.js

Gulp组件(模块)

压缩js的组件(模块):gulp-uglify

  1. 输入命令:cnpm i gulp-uglify -D
  2. gulp-uglify作用:帮助js文件压缩
  3. // 没有经过压缩的文件都放在gulpProject/src中
  4. gulpProject/src/js/jquery.js
  5. gulpProject/src/js/vue.js
  6. gulpProject/gulpfile.js
  7. const gulp=require('gulp'); // 引入gulp
  8. const uglify=require('gulp-uglify'); // 引入压缩文件的组件(插件)uglify
  9. // 声明gulp的任务:gulp.task(),gulp的任务可以声明多个
  10. /*
  11. gulp.task('任务名称', ()=>{
  12. return 任务的具体操作;
  13. })
  14. */
  15. /*
  16. gulp支持流操作
  17. gulp.src作用:读取一些文件
  18. .pipe作用:下一步操作
  19. uglify作用:压缩
  20. gulp.dest作用:输出到哪里
  21. */
  22. gulp.task('js', ()=>{
  23. return gulp.src(['./src/js/*.js'])
  24. .pipe(uglify())
  25. .pipe(gulp.dest('./build/js/'));
  26. });
  27. gulp.task('default', ['js']);
  28. /*
  29. default是一个特殊的任务
  30. 当不指定执行哪个任务的时候,会自动执行default中的任务
  31. 如果没有default,那么在运行的时候必须加名字,即需要输入gulp 声明的任务名
  32. gulp.task('default', [上面声明的任务的名字]);
  33. */
  34. 最后直接执行命令进行压缩:gulp

汇总js的组件(模块):gulp-concat

  1. // 1.初始化项目
  2. npm init -y
  3. // 2.安装相关的组件
  4. cnpm i gulp gulp-uglify gulp-concat -D
  5. // 3.编写配置
  6. gulpProject/gulpfile.js
  7. const gulp=require('gulp'); // 引入gulp
  8. const uglify=require('gulp-uglify'); // 引入uglify
  9. const concat=require('gulp-concat'); // 引入concat
  10. // .src(['./src/js/*/*.js']):这个匹配的是js下面的一层目录的.js文件,例如:/js/user/1.js
  11. // .src(['./src/js/**/*.js']):这个匹配的是js下面的任意目录的.js文件,(任意目录既包括根目录也包括任意级别的子目录)例如:/js/user/1.js
  12. // 每一个插件都有自己的参数
  13. // 文件连接
  14. // concat作用:文件连接,.pipe(concat(输出的文件名))
  15. // gulp.dest作用:输出.pipe(gulp.dest('./build/js')),因为concat已经指定过文件名了,所以只需指定文件的目录
  16. gulp.task('js', ()=>{
  17. return gulp
  18. .src(['./src/js/**/*.js'])
  19. .pipe(concat('bundle.min.js'))
  20. .pipe(uglify())
  21. .pipe(gulp.dest('./build/js'));
  22. });
  23. gulp.task('default', ['js']);
  24. // 如果需要每个打包成为单独的文件,则去除concat的使用即可

编译js中的ES6语法的组件(模块):gulp-babel

  1. 安装:cnpm i gulp-babel @babel/core @babel/preset-env -D
  2. // @babel是babel新版本的标志
  3. // gulp-babel没有办法直接使用,需要其他库辅助来使用babel
  4. // gulp-babel:编译ES6语法,babel没有办法直接使用,需要其他的插件(@babel/core和@babel/preset-env)辅助使用,@babel/core是babel本身的核心库,@babel/preset-env是babel的环境预设。gulp-babel插件只是一个桥梁(是一个适配器),让gulp能调用babel,但是,它不是babel本身,所以还需要安装@babel/core和@babel/preset-env
  5. // 编译文件
  6. gulpProject/gulpfile.js
  7. const gulp=require('gulp'); // 引入gulp
  8. const uglify=require('gulp-uglify'); // 引入uglify
  9. const concat=require('gulp-concat'); // 引入concat
  10. const rename=require('gulp-rename'); // 引入rename
  11. // rename作用:重命名文件,具体参数可以参考npmjs网站,rename({suffix: '.min'}):添加后缀名.min
  12. //babel:编译ES6,babel({presets: ['@babel/env']}):使用babel环境变量中的的预编译的配置
  13. gulp.task('js', ()=>{
  14. return gulp
  15. .src(['./src/js/**/*.js'])
  16. .pipe(concat('bundle.min.js'))
  17. .pipe(babel({
  18. presets: ['@babel/env']
  19. }))
  20. .pipe(uglify())
  21. .pipe(rename({suffix: '.min'}))
  22. .pipe(gulp.dest('./build/js'));
  23. });
  24. gulp.task('default', ['js']);

更改编译后的文件的名字的组件(模块):gulp-rename

  1. 安装:cnpm i gulp-rename -D
  2. // 配置文件:
  3. gulpProject/gulpfile.js
  4. const gulp=require('gulp'); // 引入gulp
  5. const uglify=require('gulp-uglify'); // 引入uglify
  6. const concat=require('gulp-concat'); // 引入concat
  7. const rename=require('gulp-rename'); // 引入rename
  8. // rename作用:重命名文件,具体参数可以参考npmjs网站,rename({suffix: '.min'}):添加后缀名.min
  9. gulp.task('js', ()=>{
  10. return gulp
  11. .src(['./src/js/**/*.js'])
  12. .pipe(concat('bundle.min.js'))
  13. .pipe(uglify())
  14. .pipe(rename({suffix: '.min'}))
  15. .pipe(gulp.dest('./build/js'));
  16. });
  17. gulp.task('default', ['js']);

解决编译、压缩之后的代码难调试模块:gulp-sourcemaps

  1. // gulp-sourcemaps:解决编译、压缩之后的代码难调试(保留编译之前的源码的信息,如果不开sourcemap,则只是压缩,压缩之后就结束,出错代码不容易调试;如果打开sourcemap,它会将源码中的信息带过来,一旦出错了或者调试的时候,它可以通过sourcemap将原始的源代码恢复过来),并不是所有的浏览器都支持sourcemap,目前chrom支持sourcemap很好,火狐支持不大,IE不支持。
  2. 安装: npm i gulp-sourcemaps -D
  3. // sourcemap的位置是放置在编译之前执行
  4. // 配置文件
  5. gulpProject/gulpfile.js
  6. const gulp=require('gulp'); // 引入gulp
  7. const uglify=require('gulp-uglify'); // 引入uglify
  8. const concat=require('gulp-concat'); // 引入concat
  9. const rename=require('gulp-rename'); // 引入rename
  10. const babel=require('gulp-babel'); // 引入gulp-babel,它只是一个适配器
  11. const sourcemaps=require('gulp-sourcemaps');
  12. gulp.task('js', ()=>{
  13. return gulp
  14. .src(['./src/js/**/*.js'])
  15. //.pipe(concat('bundle.min.js'))
  16. .pipe(sourcemaps.init()) // 对sourcemaps进行初始化(开始记录编译对代码的影响,方便告诉浏览器如何恢复)
  17. .pipe(babel({
  18. presets: ['@babel/env']
  19. }))
  20. .pipe(uglify())
  21. .pipe(sourcemaps.write())// 对sourcemaps进行写出
  22. .pipe(rename({suffix: '.min'}))
  23. .pipe(gulp.dest('./build/js'));
  24. });
  25. gulp.task('default', ['js']);
  26. // 如果不使用合并concat而是使用include的方式引入,sourcemap的css会定位不准确

压缩css模块:gulp-cssmin

  1. 安装:npm i gulp-cssmin -D
  2. // 配置文件
  3. gulpProject/gulpfile.js
  4. const gulp=require('gulp');
  5. const cssmin=require('gulp-cssmin'); // 引入cssmin
  6. const concat=require('gulp-concat'); // 引入concat:合并css
  7. // .src(['./src/css/**/*.css']):读取文件
  8. // .pipe(concat('style.min.css')):合并文件
  9. // .pipe(cssmin()):压缩文件
  10. // .pipe(gulp.dest('./build/css/')):输出
  11. gulp.task('style', ()=>{
  12. return gulp
  13. .src(['./src/css/**/*.css'])
  14. .pipe(concat('style.min.css'))
  15. .pipe(cssmin())
  16. .pipe(gulp.dest('./build/css/'));
  17. });
  18. gulp.task('default', ['style']);

压缩图片:gulp-imagemin,还提供了渐进式的加载

  1. 安装:npm i gulp-imagemin -D
  2. // gulp-imagemin提供了压缩图片的功能,还提供了渐进式的加载(图片加载比较慢时,一开始就能看见图片,但是比较模糊,渐渐就清晰了)
  3. // 配置文件
  4. gulpProject/gulpfile.js
  5. const gulp=require('gulp');
  6. const cssmin=require('gulp-cssmin'); // 引入cssmin
  7. const concat=require('gulp-concat'); // 引入concat:合并css
  8. const imagemin=require('gulp-imagemin');
  9. // .src(['./src/css/**/*.css']):读取文件
  10. // .pipe(concat('style.min.css')):合并文件
  11. // .pipe(cssmin()):压缩文件
  12. // .pipe(gulp.dest('./build/css/')):输出
  13. gulp.task('style', ()=>{
  14. return gulp
  15. .src(['./src/css/**/*.css'])
  16. .pipe(concat('style.min.css'))
  17. .pipe(cssmin())
  18. .pipe(gulp.dest('./build/css/'));
  19. });
  20. // gulp-imagemin只能压缩下面的三种文件png、jpg、gif
  21. gulp.task('image', ()=>{
  22. return gulp
  23. .src(['./src/img/**/*.jpg', './src/img/**/*.gif', './src/img/**/*.png']) // 读取文件,也可以写'./src/img/**/*.*'
  24. .pipe(imagemin([
  25. imagemin.gifsicle({interlaced: true}), // 优化.gif,隔行扫描(图片加载比较慢时,一开始就能看见图片,但是比较模糊,渐渐就清晰了)
  26. imagemin.jpegtran({propressive: true}), // 优化.jpg,渐进扫描(和上面的一样)
  27. imagemin.optipng({optimizationLevel: 5}) // 优化png(png是无损压缩),
  28. ]))
  29. .pipe(gulp.dest('./build/img/')); // 输出
  30. });
  31. gulp.task('default', ['image']);

自动监视文件的变化,自动重新编译:gulp.watch(这个只能编译实时更新,但是浏览器的实时更新不可以,需要另外一个组件)

  1. gulp.watch的功能也叫热更新
  2. gulp.watch([文件列表], [任务列表])
  3. gulp.watch(['./src/js/**/*.js'], ['js'])
  4. // 任何一个文件变化了,它会自动执行任务列表中所有操作
  5. // 配置文件
  6. gulpProject/gulpfile.js
  7. const gulp=require('gulp');
  8. const cssmin=require('gulp-cssmin');
  9. const uglify=require('gulp-uglify');
  10. const concat=require('gulp-concat');
  11. const rename=require('gulp-rename');
  12. const babel=require('gulp-babel');
  13. const sourcemaps=require('gulp-sourcemaps');
  14. const imagemin=require('gulp-imagemin');
  15. // 可以使用数组存储一系列类型的地址
  16. const js_path=['./src/js/**/*.js'];
  17. gulp.task('js', ()=>{
  18. return gulp
  19. .src(js_path)
  20. //.pipe(concat('bundle.min.js'))
  21. .pipe(sourcemaps.init())
  22. .pipe(babel({
  23. presets: ['@babel/env']
  24. }))
  25. .pipe(uglify())
  26. .pipe(sourcemaps.write())
  27. .pipe(rename({suffix: '.min'}))
  28. .pipe(gulp.dest('./build/js'));
  29. });
  30. gulp.task('style', ()=>{
  31. return gulp
  32. .src(['./src/css/**/*.css'])
  33. .pipe(concat('style.min.css'))
  34. .pipe(cssmin())
  35. .pipe(gulp.dest('./build/css/'));
  36. });
  37. gulp.task('image', ()=>{
  38. return gulp
  39. .src(['./src/img/**/*.jpg', './src/img/**/*.gif', './src/img/**/*.png']) // 读取文件,也可以写'./src/img/**/*.*'
  40. .pipe(imagemin([
  41. imagemin.gifsicle({interlaced: true}), // 优化.gif,隔行扫描(图片加载比较慢时,一开始就能看见图片,但是比较模糊,渐渐就清晰了)
  42. imagemin.jpegtran({propressive: true}), // 优化.jpg,渐进扫描(和上面的一样)
  43. imagemin.optipng({optimizationLevel: 5}) // 优化png(png是无损压缩),
  44. ]))
  45. .pipe(gulp.dest('./build/img/')); // 输出
  46. });
  47. gulp.task('watch', ()=>{
  48. gulp.watch(js_path, ['js']);
  49. });
  50. gulp.task('default', ['js', 'watch']);
  51. // watch如果操作特别复杂,会比较慢

代码重新编译之后,浏览器实时更新:livereload

  1. livereload是一个插件;
  2. livereload首先需要一个服务端,浏览器还需要一个livereload插件
  3. livereload的配置
  4. 1.首先需要服务器
  5. npm i http-server -g
  6. // gulp带的服务器http-server
  7. 2.插件(gulp)
  8. npm i gulp-livereload -D
  9. // 本地安装插件
  10. 3.插件(chrome)
  11. crx往里拖
  12. 4.配置
  13. 编译之后,触发livereload
  14. gulpProject/1.html
  15. <!DOCTYPE html>
  16. <html lang="en" dir="ltr">
  17. <head>
  18. <meta charset="utf-8">
  19. <title></title>
  20. <script>
  21. document.write(`<script src="build/js/bundle.min.js?t=${Math.random()}" charset="utf-8"></sc`+`ript>`)
  22. </script>
  23. </head>
  24. <body>
  25. aaabbbbdfasd
  26. </body>
  27. </html>
  28. gulpProject/gulpfile.js
  29. const gulp=require('gulp');
  30. const livereload=require('gulp-livereload'); // 功能:浏览器实时更新
  31. const babel=require('gulp-babel'); // 编译ES6
  32. const uglify=require('gulp-uglify'); // js压缩
  33. const concat=require('gulp-concat'); // 文件连接
  34. const js_path=['./src/js/**/*.js'];
  35. gulp.task('js', ()=>{
  36. return gulp
  37. .src(js_path) // 匹配文件
  38. .pipe(babel({ // 编译ES6
  39. presets: ['@babel/env']
  40. }))
  41. .pipe(concat('bundle.min.js')) // 文件合并
  42. .pipe(uglify()) // 压缩js文件
  43. .pipe(gulp.dest('./build/js')) // 输出文件目录
  44. .pipe(livereload()); // 浏览器实时更新
  45. });
  46. // 通过watch调用名字为js的任务,通过js的任务来调用livereload
  47. gulp.task('watch', ()=>{
  48. // 开启livereload的服务(让服务器开始监听)
  49. livereload.listen();
  50. // 重新编译JS(监听js_path文件的修改,如果它修改了,则执行任务名为js的任务)
  51. gulp.watch(js_path, ['js']);
  52. // 监听html;标记文件修改
  53. gulp.watch([
  54. './1.html',
  55. ...js_path
  56. ], file=>{
  57. livereload.changed(file.path); // changed:告诉livereload哪个文件更改了,则更新哪个文件
  58. });
  59. });
  60. gulp.task('default', ['js', 'watch']);
  61. 开启http-server:输入命令:http-server

gulp - 图1

编译less:gulp-less

  1. // 配置
  2. gulpProject/gulpfile.js
  3. const gulp=require('gulp');
  4. const less=require('gulp-less');
  5. const sourcemaps=require('gulp-sourcemaps');
  6. const concat=require('gulp-concat');
  7. const cssmin=require('gulp-cssmin');
  8. gulp.task('less', ()=>{
  9. return gulp
  10. .src(['./src/less/**/*.less'])
  11. .pipe(sourcemaps.init())
  12. .pipe(concat('main.less.min.css'))
  13. .pipe(less())
  14. .pipe(cssmin())
  15. .pipe(sourcemaps.write())
  16. .pipe(gulp.dest('./build/css/'));
  17. });
  18. gulp.task('default', ['less']);

组合任务

gulp.series:按照顺序执行
gulp.paralle:可以并行计算

series和paralle可以混合使用,这两个方法中的参数是task或者是组合的任务

  1. const gulp=require('gulp');
  2. gulp.task('less1', ()=>{
  3. return gulp
  4. .src(['./src/less/**/*.less'])
  5. .pipe(sourcemaps.init())
  6. .pipe(concat('main.less.min.css'))
  7. .pipe(less())
  8. .pipe(cssmin())
  9. .pipe(sourcemaps.write())
  10. .pipe(gulp.dest('./build/css/'));
  11. });
  12. gulp.task('less2', ()=>{
  13. return gulp
  14. .src(['./src/less/**/*.less'])
  15. .pipe(sourcemaps.init())
  16. .pipe(concat('main.less.min.css'))
  17. .pipe(less())
  18. .pipe(cssmin())
  19. .pipe(sourcemaps.write())
  20. .pipe(gulp.dest('./build/css/'));
  21. });
  22. gulp.task('test', gulp.paralle('less1', 'less2'))
  23. gulp.task('test', gulp.series('less1', 'less2', gulp.parallel(
  24. cssTranspile,
  25. gulp.series(jsTranspile, jsBundle)
  26. )))