基于 gulp 的工作流配置

发布于 2024-06-23 10:25:53 字数 7194 浏览 12 评论 0

配置一套基于 gulp 的工作流,满足日常的基本开发。

一、目录结构

二、 package.json

{
  "name": "gulp-project",
  "scripts": {
    "dev": "gulp dev", //npm run dev   开发
    "build": "gulp build", //npm run build   发布
    "upload": "gulp upload", //npm run upload 上传服务器 
    "zip": "gulp zip" ////npm run zip 打包文件
  },
  "devDependencies": {
    "babel-preset-es2015": "^6.22.0", //编译 es6
    "browser-sync": "^2.15.0",  //监听改动刷新
    "gulp": "^3.9.1", //gulp
    "gulp-autoprefixer": "^3.1.1", //补齐 css 浏览器前缀
    "gulp-babel": "^6.1.2", // Es6
    "gulp-clean": "^0.3.2", //删除文件
    "gulp-clean-css": "^2.0.12", //css 压缩,gulp-minify-css 不更新了
    "gulp-concat": "^2.6.0",//合并文件
    "gulp-ftp": "^1.1.0",//提交到 ftp 服务器
    "gulp-git": "^1.11.3",//提交到 git
    "gulp-htmlmin": "^2.0.0",//压缩 html
    "gulp-imagemin": "^3.0.3",//压缩图片
    "gulp-rename": "^1.2.2",//重命名文件
    "gulp-rev-append": "^0.1.6", //添加 MD5 版本号,这里改成了时间戳
    "gulp-sass": "^2.3.2",//编译 SASS
    "gulp-uglify": "^2.0.0",//js 压缩
    "gulp-util": "^3.0.7", //说是 ftp 配套用的,看了下是包装了些常用函数
    "gulp-zip": "^3.2.0" // 打包文件
  }
}

三、 gulpfile.js

//组件

let gulp = require('gulp'),
browserSync = require('browser-sync').create(), //监听刷新
    reload = browserSync.reload,
    ftp = require('gulp-ftp'), // ftp 上传
    gutil = require('gulp-util'),
    sass = require('gulp-sass'), // sass
    cleancss = require('gulp-clean-css'), // CSS 压缩
    autoprefixer = require("gulp-autoprefixer"),
    uglify = require('gulp-uglify'), // js 压缩
    concat = require('gulp-concat'), // 合并文件
    rename = require('gulp-rename'), // 重命名
    clean = require('gulp-clean'), //清空文件夹
    imagemin = require('gulp-imagemin'), //压缩图片
    zip = require('gulp-zip'), //打包文件
    rev = require('gulp-rev-append'), //添加 MD5
    htmlmin = require('gulp-htmlmin'), // 压缩 html
git = require('gulp-git'),     //git
babel = require("gulp-babel"); //ES6 转 es5
// =========== 开发构建流程 [多文件输出] ==============

//dev
gulp.task('sass:dev', () => {
    gulp.src('src/sass/*.scss')
        .pipe(sass())
        .pipe(gulp.dest('src/css/'))
        .pipe(reload({ stream: true }))
});

// 合并、重命名 css
gulp.task('css:dev', ['sass:dev'], () => {
    gulp.src(['src/css/*.css', '!src/css/areaMap.css'])
        .pipe(concat('all.css'))
        .pipe(gulp.dest('dist/css/'))
});

// 合并、重命名 js
gulp.task('js:dev', () => {
    gulp.src('src/js/*.js')
    .pipe(babel({
       presets: ['es2015']
     })) //ES6 转 ES5
        //.pipe(concat('all.js')) 开发阶段分开输出 js 文件
        .pipe(gulp.dest('dist/js/'))
        .pipe(reload({ stream: true }))
});

// HTML

gulp.task('html:dev', () => {
    gulp.src('src/tpl/*.html')
        .pipe(gulp.dest('dist'))
});

// 将 lib 的库文件对应到指定位置
gulp.task('lib:dev', () => {
    gulp.src('./src/lib/*')
        .pipe(gulp.dest('./dist/lib/'));
});


//开发构建
gulp.task('dev', ['css:dev', 'js:dev', 'html:dev', 'img','copyFonts','lib'], () => {
    browserSync.init({
        server: {
            baseDir: "dist" // 设置服务器的根目录为 dist 目录
        },
        notify: false // 开启静默模式
    });
    // 我们使用 gulp 的文件监听功能,来实时编译修改过后的文件

    gulp.watch('src/js/*.js', ['js:dev']);
    gulp.watch('src/sass/*.scss', ['sass:dev']);
    gulp.watch('src/tpl/*.html', ['html:dev']);
    gulp.watch('src/fonts/**', ['copyFonts']);
    gulp.watch('src/images/**', ['img']);
    gulp.watch('src/lib/**', ['lib']);
});
// =========== 正式构建 build [单文件输出] ==============

// sass 解析
gulp.task('sass', () => {
    gulp.src('src/sass/*.scss')
        //输出为压缩
         .pipe(sass({
             outputStyle: 'compressed'
         }))
        .pipe(sass())
        .pipe(gulp.dest('src/css/'))
});

// 合并、压缩、重命名 css

gulp.task('css', ['sass'], () => {
    gulp.src(['src/css/*.css', '!src/css/areaMap.css'])
        .pipe(concat('all.css'))
        .pipe(autoprefixer({
            browsers: ['last 2 versions', 'Android >= 4.0'],
            cascade: true, //是否美化属性值 默认:true 像这样:
            remove: false //是否去掉不必要的前缀 默认:true 
        }))
        .pipe(cleancss()) //压缩 css
        .pipe(gulp.dest('dist/css'));
});

// 合并,压缩,重命名 js 文件

gulp.task('js', () => {
    gulp.src('src/js/*.js')
    .pipe(babel({
       presets: ['es2015']
     })) //ES6 转 ES5
        .pipe(concat('all.js'))
        .pipe(uglify())
        .pipe(gulp.dest('dist/js'));
});


// 压缩 HTML

gulp.task('html', () => {
    gulp.src('src/tpl/*.html')
        .pipe(rev())//记得在引用地址后面加后缀,插件原本是 ver=@@hash ,这里改成了 v=@@hash
      //<link rel="stylesheet" href="css/all.css?v=@@hash">
      //<script src="js/all.js?v=@@hash"></script>
        .pipe(htmlmin({
            removeComments: true, //清除 HTML 注释
            collapseWhitespace: true, //压缩 HTML
            collapseBooleanAttributes: true, //省略布尔属性的值 <input checked="true"/> ==> <input />
            removeEmptyAttributes: true, //删除所有空格作属性值 <input id="" /> ==> <input />
            removeScriptTypeAttributes: true, //删除<script>的 type="text/javascript"
            removeStyleLinkTypeAttributes: true, //删除<style>和<link>的 type="text/css"
            minifyJS: true, //压缩页面 JS
            minifyCSS: true //压缩页面 CSS
        }))
        .pipe(gulp.dest('dist'))
});

//压缩图片

gulp.task('img', () => {
    gulp.src('src/images/*.{png,jpg,gif,ico}')
        .pipe(imagemin({
            optimizationLevel: 5, //类型:Number  默认:3  取值范围:0-7(优化等级)
            progressive: true, //类型:Boolean 默认:false 无损压缩 jpg 图片
            interlaced: true, //类型:Boolean 默认:false 隔行扫描 gif 进行渲染
            multipass: true //类型:Boolean 默认:false 多次优化 svg 直到完全优化
        }))
        .pipe(gulp.dest('dist/images'));
});

//字体文件
gulp.task('copyFonts', function () {
    gulp.src('src/fonts/**/*')
        .pipe(gulp.dest('dist/fonts/'))
});

// 清空图片、样式、js

gulp.task('clean', () => {
    gulp.src('dist', { read: false })
        .pipe(clean({ force: true }));
});

// 将 bower 的库文件对应到指定位置

gulp.task('lib', () => {
    gulp.src('/src/lib/*')
        .pipe(gulp.dest('/dist/lib/'));
});
// ================ 打包主体 dist 文件夹 zip ====

//打包主体 dist 文件夹并按照时间重命名
gulp.task('zip', function(){
      function checkTime(i) {
          if (i < 10) {
              i = "0" + i
          }
          return i
      }
          
      var d=new Date();
      var year=d.getFullYear();
      var month=checkTime(d.getMonth() + 1);
      var day=checkTime(d.getDate());
      var hour=checkTime(d.getHours());
      var minute=checkTime(d.getMinutes());

  return gulp.src('./dist/**')
        .pipe(zip(year+month+day +hour+minute+'.zip'))
        .pipe(gulp.dest('./zip'));
});
//正式构建

gulp.task('build', ['clean','css', 'js', 'img', 'html','copyFonts','lib']);

// ================ 上传 upload ====

gulp.task('upload', () => {
    gulp.src('dist/**')
        .pipe(ftp({
            host: '8.8.8.8', // 远程主机 ip
            port: 22, // 端口
            user: 'username', // 帐号
            pass: 'password', // 密码
            remotePath: '/project' // 上传路径,不存在则新建
        }))
        .pipe(gutil.noop())
})

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

十级心震

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

謌踐踏愛綪

文章 0 评论 0

开始看清了

文章 0 评论 0

高速公鹿

文章 0 评论 0

alipaysp_PLnULTzf66

文章 0 评论 0

热情消退

文章 0 评论 0

白色月光

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文