Skip to content

gulp学习 #45

@bai3

Description

@bai3

gulp学习

先贴代码

var gulp = require('gulp');
var fileinclude = require('gulp-file-include')
var del = require('del');
var copy = require('copy');
var htmlmin = require('gulp-htmlmin');
var autoprefixer = require('gulp-autoprefixer');
var cleancss = require('gulp-clean-css');
var gulpSequence = require('gulp-sequence');

// 压缩图片
var imagemin = require('gulp-imagemin'),
    pngquant = require('imagemin-pngquant'),
    //确保本地已安装gulp-cache [cnpm install gulp-cache --save-dev]
    cache = require('gulp-cache');

gulp.task('del', () => {
  console.log("开始清理dist文件夹")
  return del(['dist/*!.git'], function(){
    console.log("清理完毕")
  })
 
});

/**
 * PC端部分配置
 */
gulp.task('first-page-html', function() {
  console.log('开始压缩首页的html');
  let options = {
    removeComments: true, // 清除html注释
    collapseWhitespace: true, // 去除html空格
    removeEmptyAttributes: true, //删除所有空格作属性值
    minifyCSS: true, // 压缩页面css
    minifyJS: true, //压缩页面js,好像失败了
  }
  return gulp.src(['*.html'])
    .pipe(htmlmin(options))
    .pipe(gulp.dest('dist'));
})

gulp.task('first-page-css', function() {
  console.log('开始压缩首页的css')
  return gulp.src(['*.css'])
    .pipe(autoprefixer({
      browsers: ['last 10 versions'],
      cascade: false
    }))
    .pipe(cleancss())
    .pipe(gulp.dest('dist/'));
})


gulp.task('cssmin-pc', function() {
  console.log("开始压缩PC端css")
  return gulp.src(['pages/**/*.css'])
    .pipe(autoprefixer({
      browsers: ['last 10 versions'],
      cascade: false
    }))
    .pipe(cleancss())
    .pipe(gulp.dest('dist/pages'));
   
})

// 执行模板和html和压缩任务
gulp.task('template-pc', function() {
  console.log('开始执行PC端模板');
  return gulp.src(['pages/**/*.html'])
      .pipe(fileinclude({
          prefix: '@@',
          basepath: '@file'
      }))
      .pipe(gulp.dest('src-pc'));
      
})
gulp.task('htmlmin-pc', function() {
    console.log('开始进行PC端html压缩');
    let options = {
      removeComments: true, // 清除html注释
      collapseWhitespace: true, // 去除html空格
      removeEmptyAttributes: true, //删除所有空格作属性值
      minifyCSS: true, // 压缩页面css
      minifyJS: true, //压缩页面js,好像失败了
    }
    return gulp.src(['src-pc/**/*.html'])
      .pipe(htmlmin(options))
      .pipe(gulp.dest('dist/pages'));
})

gulp.task('del-pc', () => {
  console.log("开始清理pc临时模板文件")
  return del(['src-pc'])
});

/**
 * 移动端部分配置
 */
// 移动端压缩css
gulp.task('cssmin-h5', function() {
  console.log("开始压缩移动端端css")
  return gulp.src(['m/css/*.css'])
    .pipe(autoprefixer({
      browsers: ['last 10 versions'],
      cascade: false
    }))
    .pipe(cleancss())
    .pipe(gulp.dest('dist/m/css'));
})

gulp.task('template-h5', function() {
  console.log('开始执行移动端模板工作');
  return gulp.src(['m/**/*.html'])
      .pipe(fileinclude({
          prefix: '@@',
          basepath: '@file'
      }))
      .pipe(gulp.dest('src-h5'));
      
})

gulp.task('htmlmin-h5', function() {
  console.log('开始进行移动端html压缩');
  let options = {
    removeComments: true, // 清除html注释
    collapseWhitespace: true, // 去除html空格
    removeEmptyAttributes: true, //删除所有空格作属性值
    minifyCSS: true, // 压缩页面css
    minifyJS: true, //压缩页面js,好像失败了
  }
  return gulp.src(['src-h5/**/*.html'])
    .pipe(htmlmin(options))
    .pipe(gulp.dest('dist/m'));
})

gulp.task('del-h5', () => {
  console.log("开始清理H5临时模板文件")
  return del(['src-h5'])
});

// 压缩图片
gulp.task('testImagemin', function () {
  console.log('压缩pc端图片');
  gulp.src('images/*.{png,jpg,gif,ico,svg}')
      .pipe(cache(imagemin({
          progressive: true,
          svgoPlugins: [{removeViewBox: false}],
          use: [pngquant()]
      })))
      .pipe(gulp.dest('dist/images'));
});
gulp.task('testImageminh5', function () {
  console.log('压缩移动端图片')
  gulp.src('m/images/*.{png,jpg,gif,ico,svg}')
      .pipe(cache(imagemin({
          progressive: true,
          svgoPlugins: [{removeViewBox: false}],
          use: [pngquant()]
      })))
      .pipe(gulp.dest('dist/m/images'));
});

gulp.task('copy', () => {
  // 复制一级目录下的所有文件
  console.log("开始复制一级目录下的所有文件")
  copy(['*','.gitignore'],'dist',() => console.log("一级目录下的所有文件复制完成"));
  copy(['pages/help/**/*'],'dist/pages/help/', () => console.log("help文件夹资料拷贝"))
  copy('m/lib/**','dist/m/lib', () => console.log('移动端lib文件拷贝'));
  copy('m/js/**','dist/m/js', () => console.log('移动端js插件拷贝'));
  copy('v2/**/*','dist/v2',() => console.log('v2文件夹复制完毕'));
  copy('pc/**/*','dist/pc',() => console.log('pc文件夹复制完毕'))
});
// 打包和测试的任务队列
gulp.task('build-quence', gulpSequence('del-pc','del','copy',['first-page-html','first-page-css'],'template-pc','htmlmin-pc','cssmin-pc','del-pc','template-h5','htmlmin-h5','cssmin-h5','del-h5','testImagemin','testImageminh5'))
gulp.task('test-quence-pc',function(cb){
  gulpSequence('template-pc','htmlmin-pc')(cb)
})
// 默认任务
gulp.task('build', () => {
  console.log('打包到dist文件夹')
  gulp.start('build-quence')
})
gulp.task('watch', ()=> {
  console.log('启动热更新,用于实时测试')
  gulp.watch("pages/**/*.html",["test-quence-pc"])
  gulp.watch("pages/**/*.css",["cssmin-pc"])
})
// 完美没毛病

学习目的

为公司官网PC端和移动端引入打包工具,压缩代码图片以及进行模板解耦

学习过程

主要学习gulp基本知识和基本使用以及相关插件的使用

用到的插件

  • fileinclude html模板插件(在html上运用类似后端的模板引擎)

    gulp.task('template-pc', function() {
      console.log('开始执行PC端模板');
      return gulp.src(['pages/**/*.html'])
          .pipe(fileinclude({
              prefix: '@@',
              basepath: '@file'
          }))
          .pipe(gulp.dest('src-pc'));
          
    })
  • del 插件用于删除文件和文件夹

  • copy插件用于复制文件和文件夹

  • htmlmin 插件用于压缩的html以及html内部的css和js

  • autoprefixer 插件用于css自动添加浏览器头部

  • cleancss 插件用于压缩css

  • imagemin 插件用于压缩图片

  • gulpSquence插件用于创建任务队列

遇到的问题以及解决

  • htmlmin插件存在一个小问题,设置minifyJs:true还是没能压缩html内的js代码,略坑
  • 因为gulp的任务是异步执行的,如果两个任务存在顺序执行关系,就容易导致错误,所以引入gulp-sequence插件解决任务队列问题
  • gulp文件匹配都采用类似正则匹配规则,不是很熟悉。

最后

不断优化打包工具,先后引入了图片压缩插件,大概一张200kb图片能减少十几k的样子,还创建一个单的的任务队列,用于在写代码的时候,监听代码变化实时进行模板合并,可以实时预览效果。具体的插件使用参考上面贴的代码。注意下打包前打包后相关文件夹路径问题,以及文件匹配规则问题。gulp总的来说比较简单,但是效率不是很高,目前的项目一般不会采用。。。,还是继续当个webpack配置工程师。。。。

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions