gulp配置杂谈

370 阅读2分钟

现有项目中有react技术栈与jquery技术栈的使用。 jquery技术栈是静态页面资源的方式引用。

为了让这些jquery栈享受到前端工程化的便利,利用gulp配置,对现有页面进行了配置升级。

开发工程gulp-webpack一体化

目标:

  1. 现有开发目录为源文件
  2. 部署时,统一部署到deploy文件夹中
  3. 增加js,css,等文件hash版本号,更新文件缓存
  4. 压缩html
  5. 压缩css,压缩js,混淆代码
  6. 文件合并
  7. 压缩图片
  8. 每次部署前,清空deploy.
  9. 替换包含文件内容
  10. 处理gulp的通知
  11. 处理代码风格
  12. 监控文件变化,执行相应任务

实现过程:

引入相应依赖包

var gulp = require('gulp');
var runSequence = require('run-sequence');// 同步执行任务
var rev = require('gulp-rev-dxb');// 更改版本号 // gulp-rev
var revCollector = require('gulp-rev-collector');// gulp-rev插件,用于html模板更改引用路径
var rename = require('gulp-rename');// 文件重命名
var autoprefixer = require('gulp-autoprefixer');
var uglify = require('gulp-uglify');// js压缩
var sourcemaps = require('gulp-sourcemaps');
var clean = require('gulp-clean');// 清空文件夹
var sass = require('gulp-sass');
var pump = require('pump');
var watch = require('gulp-watch');
var jshint = require('gulp-jshint');// js 风格
var gulpif = require('gulp-if');
var changed = require('gulp-changed');
var notify = require('gulp-notify');// 处理消息
var cache = require('gulp-cache');// 只压缩修改的图片
var htmlclean = require('gulp-htmlclean');// 精简html
var htmlmin = require('gulp-htmlmin');// 压缩html
var revAppend = require('gulp-rev-append');
var concat = require('gulp-concat');// 文件合并
var imagemin = require('gulp-imagemin');// 压缩图片
var stylish = require('jshint-stylish');
var cleanCSS = require('gulp-clean-css');
var replace = require('gulp-string-replace');
var fileinclude  = require('gulp-file-include')

知识点

Gulp自动添加版本号

预期效果:

"css/Albumdetail.css": "css/Albumdetail.css?v=df04a5981a",
"css/aboutapp.css": "css/aboutapp.css?v=4e7e0a5e44",
"css/bootstrap-theme.css": "css/bootstrap-theme.css?v=b9b46bcc4d",

实际效果

"css/Albumdetail.css": "css/Albumdetail-df04a5981a.css",
"css/aboutapp.css": "css/aboutapp-4e7e0a5e44.css",
"css/bootstrap-theme.css": "css/bootstrap-theme-b9b46bcc4d.css",

插件 gulp-rev + gulp-rev-collector 更新为 gulp-rev-dxb + gulp-rev-collector 实现了预期效果。

替换文件字符串内容

源文件:

<link rel="stylesheet" href="/commonstatic/static/base/css3.0/base_WXorange.css">
<link rel="stylesheet" href="/commonstatic/static/base/en-iconfont3.0/iconfont.css">

目标文件:

文件版本与替换合并

// Html替换css、js文件版本
gulp.task('revHtml', function (cb) {
  return gulp.src(['rev/**/*.json', htmlSrc])// '../static/**/*.html'
    .pipe(replace(/\/commonstatic/ig, function () {
      const regularProd=/(beta1|*.cn|prod)$/i;
      const commonstatic = (regularProd.test(process.env.YG_ENV)) ? 'https://static.*.cn' : 'http://static.*.alpha' ;
      return commonstatic;
    }))
    .pipe(revCollector({
      replaceReved: true,
    }))
    .pipe(gulp.dest(staticDesc));
});

压缩html

gulp.task('minify-html', function () {
  return gulp.src(htmlDesc)
      .pipe(htmlclean())
      .pipe(htmlmin({
          removeComments: true, //清除HTML注释
          collapseWhitespace: true, //压缩HTML
          minifyJS: true, //压缩页面JS
          minifyCSS: true, //压缩页面CSS
          minifyURLs: true
      }))
      .pipe(gulp.dest(staticDesc));
});

压缩css,压缩js,混淆代码

.pipe(cleanCSS({compatibility: 'ie8'}))
    .pipe(autoprefixer({
        browsers: ['last 10 versions', 'Firefox >= 20', 'Opera >= 36', 'ie >= 9', 'Android >= 4.0', ],
        cascade: true, //是否美化格式
        remove: false //是否删除不必要的前缀
    }))
     .pipe(cleanCSS({
        compatibility: 'ie8',
        keepSpecialComments: '*' //保留所有特殊前缀
    }))
.pipe(uglify({
      compress: {
          // warnings: false,
          drop_console: true,  // 过滤 console
          drop_debugger: true  // 过滤 debugger
      }
    }))

文件合并

// 合并,压缩文件
gulp.task('scripts', function() {
    gulp.src('./js/*.js')
        .pipe(concat('all.js'))
        .pipe(gulp.dest('./dist'))
        .pipe(rename('all.min.js'))
        .pipe(uglify())
        .pipe(gulp.dest('./dist'));
});

压缩图片

//压缩图片
gulp.task('minifyImg', function(){
  return gulp.src(imgSrc)
      .pipe(imagemin())
      .pipe(gulp.dest(imgDest))// '../public/dist/images'
      .pipe(notify({ message: 'image minify complete' }));
});

每次部署前,清空deploy.

// 清空目标文件
gulp.task('cleanDst', function () {
  return gulp.src([staticDesc, './rev'], {read: false})
    .pipe(clean({force: true}))
    .pipe(notify({ message: 'clean Dst minify complete' }));
});

替换包含文件内容

gulp.src([cfg.htmlSrcGulp])
    .pipe(fileinclude({
        prefix: '@@',
        basepath: `${staticSrc}commonModule/`
    }))
    .pipe(gulp.dest(cfg.htmlDestGulp));

处理gulp的通知

.pipe(notify({ message: '.... complete' }));

处理代码风格

// 检查js语法
gulp.task('jslint', function() {
  return gulp.src(jsSrc)
    .pipe(jshint({
      "undef": false,
      "unused": false
    }))
    .pipe(jshint.reporter(stylish))   //高亮提示
    .pipe(jshint.reporter('fail'))
    .pipe(notify({ message: 'jslint minify complete' }));
});

监控文件变化,执行相应任务

gulp.watch(cfg.htmlSrcGulp,function(event){
  commonSet(cfg);
})

移动未处理的文件夹

// 将非js、非css移动到目标目录
gulp.task('mvNotDealAsset', function () {
  return gulp.src(otherSrc)
    .pipe(gulp.dest(staticDesc));
  
});

sass任务

gulp.task('sass', function() {
    gulp.src('./scss/*.scss')
        .pipe(sass())
        .pipe(gulp.dest('./css'));
});

build

gulp.task('build', function (done) {
  runSequence(
    ['jslint'],
    ['cleanDst'],
    ['revCss'],
    ['revJs'],
    ['revHtml'],
    ['filemodule'],
    ['mvNotDealAsset'],
    
    done);
});

package配置

devDependencies 依赖

"gulp": "^3.9.1",
"gulp-autoprefixer": "^2.3.1",
"gulp-cache": "^1.1.3",
"gulp-changed": "^1.2.1",
"gulp-clean": "^0.3.2",
"gulp-clean-css": "^3.9.0",
"gulp-concat": "^2.6.1",
"gulp-csslint": "^0.1.5",
"gulp-file-include": "^2.1.0",
"gulp-html-replace": "^1.6.2",
"gulp-htmlclean": "^2.7.22",
"gulp-htmlmin": "^5.0.1",
"gulp-if": "^1.2.5",
"gulp-imagemin": "^6.1.0",
"gulp-jshint": "^2.0.4",
"gulp-minify-html": "^1.0.4",
"gulp-notify": "^3.2.0",
"gulp-plumber": "^1.1.0",
"gulp-rename": "^1.2.2",
"gulp-replaces": "^0.1.5",
"gulp-rev": "^7.1.2",
"gulp-rev-append": "^0.1.8",
"gulp-rev-collector": "^1.2.2",
"gulp-rev-collector-dxb": "^1.3.2",
"gulp-rev-dxb": "^9.0.1",
"gulp-sass": "^4.0.2",
"gulp-sourcemaps": "^2.6.5",
"gulp-string-replace": "^1.1.2",
"gulp-uglify": "^3.0.0",
"gulp-watch": "^4.3.11",

Npm Script 启动

"gulp:alpha": "cd $PWD/scripts && YG_ENV=alpha  gulp build:alpha",
"gulp:prod": "cd $PWD/scripts && YG_ENV=prod  gulp build:prod",
"build:alpha": "npm run gulp:alpha && APP_ROOT=$PWD umi build",
"build:prod": "npm run gulp:prod && APP_ROOT=$PWD umi build",