Gulp

gulp是基于流的任务化构建工具,读取源文件后在管道中通过一系列插件进行压缩、处理然后输出到目标地址。

1.使用

需要node环境,先全局安装gulp-cli

1 npm install --global gulp-cli

cmd进入项目目录,分别输入

1 npm init
2 npm i gulp -D

根目录下创建gulpfile.js文件,在该文件中配置gulp任务,下面以压缩html文件为例介绍:

 1 const gulp = require('gulp')  // 引入gulp
 2 
 3 const htmlmin = require('gulp-htmlmin') // 引入压缩HTML的插件
 4 
 5 gulp.task('html', function () { // 创建一个名为gulp的任务
 6   return gulp
 7     .src('./src/index.html') // 读取源文件到流
 8     .pipe(                         // pipe管道中对读取的流进行处理
 9       htmlmin({                 // 执行压缩
10         collapseWhitespace: true, // 去掉空格
11         removeAttributeQuotes: true // 删除属性的引号
12       })
13     )
14     .pipe(gulp.dest('dist/')) // 输出到目标地址
15 })

因为用到了html压缩插件需要先安装npm i gulp-htmlmin -D

在命令行中输入gulp 任务名即可,如:

1 gulp html

此时查看dist目录,已经生成了压缩好的html:

<!DOCTYPE html><html lang=en><head><meta charset=UTF-8><meta name=viewport content="width=device-width,initial-scale=1"><title>Sass</title></head><body><div class=container>Lorem ipsum dolor sit amet consectetur adipisicing elit. Magni, consectetur eos possimus optio corrupti at. Alias voluptatem ut ducimus aspernatur totam harum magni quidem odio adipisci. Eum consequuntur explicabo non.</div></body></html>

gulp的使用大抵如此,src读取源文件,pipe中利用插件(如gulp-htmlmin)进行处理,再由dest输出到目标位置。

2.主要功能

gulp的强大之处在于可以使用各种插件进行处理,常用有:压缩html\css\js及静态图片,转译sass、es6+语法;监听文件改动,自动将压缩后的css及js注入html文件;启动开发服务器,实时刷新等。

// 常用插件
// gulp-htmlmin 压缩html
// gulp-sass 编译sass
// gulp-cssmin 压缩css
// gulp-babel 转译es6+语法
// gulp-concat  js / css 合并
// gulp-uglify  压缩js
// gulp-rename 重命名
// gulp-less 编译less
// gulp-inject 把压缩后的css和js注入到html中
// gulp-connect 开发服务器、实时自动编译刷新
// open 打开浏览器
// browser-sync 创建开发服务器并同步浏览器 推荐
 
// 重要API
// src 源文件夹
// dest 目标文件夹
// task 注册任务
// pipe 流管道
// watch 监听文件
 
注:
gulp4.0版本以后不能使用数组放依赖的任务了,gulp.task没有了以往的三参数,可以用gulp.parallel和gulp.series来随意嵌套并行及串行任务,任务依赖需要放到series里面,在该函数的回调里面执行后续任务。
gulp组合任务时异步任务可以通过return保证任务已完成。

3.案例

gulp 3.9.1案例

  1 const gulp = require('gulp')
  2 
  3 // 0.任务前先清除目录
  4 const del = require('del')
  5 gulp.task('clean', function (cb) {
  6   return del(['./dist'], cb)
  7 })
  8 
  9 // 注意:
 10 // 每个任务都返回一个stream, 将会保证clean在任一个任务开始之前完成
 11 // clean并不会被执行两次,尽管它被作为依赖调用了两次
 12 
 13 // 1.html
 14 const htmlmin = require('gulp-htmlmin')
 15 gulp.task('html', function () {
 16   return gulp
 17     .src('./src/index.html')
 18     .pipe(
 19       htmlmin({
 20         // collapseWhitespace: true, // 去掉空格
 21         removeAttributeQuotes: true // 删除属性的引号
 22       })
 23     )
 24     .pipe(gulp.dest('dist/'))
 25     .pipe(connect.reload())
 26 })
 27 
 28 // 2.静态文件
 29 gulp.task('images', function () {
 30   return gulp
 31     .src('./srcimg/**/*.*')
 32     .pipe(gulp.dest('dist/images'))
 33     .pipe(connect.reload())
 34 })
 35 
 36 // 3.copy多个文件到一个目录
 37 // ! 可以排除一些文件
 38 gulp.task('data', function () {
 39   return gulp
 40     .src(['./src/json/*.json', './src/xml/*.xml', '!./src/xml/old.xml'])
 41     .pipe(gulp.dest('dist/data/'))
 42     .pipe(connect.reload())
 43 })
 44 
 45 // 4.添加插件  sass
 46 const sass = require('gulp-sass')
 47 sass.compiler = require('node-sass')
 48 
 49 gulp.task('sass', function () {
 50   return gulp
 51     .src('./src/style/**/*.scss')
 52     .pipe(sass().on('error', sass.logError))
 53     .pipe(gulp.dest('./src/css/'))
 54     .pipe(connect.reload())
 55 })
 56 
 57 // 5.压缩css插件 及重命名
 58 var cssmin = require('gulp-cssmin')
 59 var rename = require('gulp-rename')
 60 
 61 gulp.task('cssmin', ['sass'], function () {
 62   return gulp
 63     .src('./src/css/*.css')
 64     .pipe(concat('index.css'))
 65     .pipe(cssmin())
 66     .pipe(rename({ suffix: '.min' }))
 67     .pipe(gulp.dest('dist/css/'))
 68     .pipe(connect.reload())
 69 })
 70 
 71 // 6.处理js文件
 72 // 合并文件 压缩js文件
 73 const concat = require('gulp-concat')
 74 const babel = require('gulp-babel')
 75 const uglify = require('gulp-uglify')
 76 
 77 gulp.task('js', function () {
 78   return gulp
 79     .src('./src/scripts/*.js')
 80     .pipe(concat('index.js'))
 81     .pipe(
 82       babel({
 83         presets: ['@babel/env']
 84       })
 85     )
 86     .pipe(gulp.dest('dist/js/'))
 87     .pipe(uglify())
 88     .pipe(rename('index.min.js'))
 89     .pipe(gulp.dest('dist/js/'))
 90     .pipe(connect.reload())
 91 })
 92 
 93 // 7.inject 把压缩后的css和js注入到html中
 94 var inject = require('gulp-inject')
 95 gulp.task(
 96   'inject', ['html', 'images', 'data', 'cssmin', 'js'],
 97   function () {
 98     return gulp
 99       .src('./dist/index.html') // 获取该文件的数据
100       .pipe(
101         inject(
102           gulp.src(['./dist/js/index.min.js', './dist/css/index.min.css'], {
103             // 让获取的流被 inject 操作一次:把指定文件注入到流文件中
104             read: false // 该参数默认为ture,此处fasle也就是并不会去读取文件
105           }),
106           {
107             relative: true // Injecting files relative to target files
108           }
109         )
110       )
111       .pipe(gulp.dest('./dist/'))
112       .pipe(connect.reload())
113   }
114 )
115 
116 // inject说明:
117 // 1.在html中需要标记插入位及文件类型
118 //   < !--inject: css-- >
119 //   <!-- endinject-->
120 
121 // default 默认任务
122 gulp.task(
123   'default', ['inject'],
124   function () {
125     return gulp.src('./dist/**/*.*')
126   }
127 )
128 
129 // default 默认任务
130 gulp.task('build', ['clean', 'default'], function () {
131   console.info('build done!')
132 })
133 
134 // 8.任务监听
135 // 启动服务器
136 const connect = require('gulp-connect')
137 const open = require('open')
138 gulp.task('server', ['default'], function () {
139   connect.server({
140     root: 'dist/',
141     port: 9001,
142     livereload: true // 实时刷新
143   })
144   // 注意:需要在各个子任务中添加connect配合
145 
146   // 打开浏览器
147   open('http://localhost:9001/')
148 
149   // 监听文件
150   gulp.watch('./src/index.html', ['html'])
151   gulp.watch('./src/style/**/*.scss', ['sass', 'cssmin'])
152   gulp.watch('./src/img/**/*', ['images'])
153   gulp.watch(['./src/json/*.json', './src/xml/*.xml', '!./src/xml/old.xml'], ['data'])
154   gulp.watch('./src/scripts/*.js', ['js'])
155 })
156 
157 // 使用时在命令行输入gulp taskname即可,直接输入gulp则运行默认任务
View Code

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-09-05
  • 2021-09-14
  • 2021-08-13
  • 2021-11-02
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-04-13
  • 2021-04-27
  • 2021-09-11
  • 2022-12-23
  • 2022-12-23
  • 2022-01-06
相关资源
相似解决方案