gulp构建项目——生产环境/开发环境、生成雪碧图

新建项目Gulp-Project,执行 npm init初始化项目生成package.json文件,然后再创建config文件夹,新建index.js(公共部分)、gulpfile.dev.js(开发环境)、gulpfile.prod.js(生产环境)。当然了,要打包编译的文件内容一般都放在都在根目录src里面。

项目结构:

Gulp-Project
├── README.md
├── config
│   ├── gulpfile.dev.js
│   ├── gulpfile.prod.js
│   └── index.js
├── gulpfile.js
├── package-lock.json
├── package.json
└── src
    ├── assets
    │   └── common.css
    ├── images
    │   ├── sprite_2
    │   │   ├── 01.jpg
    │   │   ├── 02.jpg
    │   │   └── 03.jpg
    │   └── t3.png
    ├── index.html
    ├── script
    │   └── index.js
    └── style
        ├── style.css
        └── style2.css

接下来开始写config文件夹里面的公共部分的js——index.js:

const SRC_DIR='./src/';   //源路径,不支持相对路径,下面也是
const DEV_DIR='./dev/';   //生成开发环境的文件
const DIST_DIR='./dist/';  //生成生产环境的文件

const config={
    src:SRC_DIR,
    dist:DIST_DIR,
    dev:DEV_DIR,
    html:{
        src:SRC_DIR+'*.html',
        dev:DEV_DIR,
        dist:DIST_DIR
    },
    assets:{
        src:SRC_DIR+'assets/**/*',
        dev:DEV_DIR+'assets',
        dist:DIST_DIR+'assets'
    },
    style:{
        src:SRC_DIR+'style/*.css',  //如果是scss或者css,就改对应的
        dev:DEV_DIR+'css',
        dist:DIST_DIR+'css'
    },
    script:{
        src:SRC_DIR+'script/*.js',
        dev:DEV_DIR+'js',
        dist:DIST_DIR+'js'
    },
    img:{
        src:SRC_DIR+'images/**/*.*',
        dev:DEV_DIR+'images',
        dist:DIST_DIR+'images'
    }
};

module.exports=config;  //把这个接口暴露给别的文件用

配置开发环境文件gulpfile.dev.js:

//配置开发的文件

const gulp = require('gulp'); //引用gulp插件
const $ = require('gulp-load-plugins')();  //自动加载插件,可以省略一个一个引用插件
const config = require('./index.js'); //引用配置的路径文件
const open = require('open'); //开启服务
const revCollector = require('gulp-rev-collector'); //来自清单的静态资产修订数据收集器(由不同的流生成),并替换其在html模板中的链接。

function dev() {
    gulp.task('html:dev', function () {
        var optins = {
            removeComments: true,//清除HTML注释
            collapseWhitespace: true, //压缩HTML
            minfyJS: true,//压缩JS
            minfyCss: true,//压缩CSS
        }
        return gulp.src(['./rev/**/*.json',config.html.src])
        // .pipe($.htmlmin(optins))
        .pipe(revCollector({
            replaceReved: true,//允许替换, 已经被替换过的文件
            dirReplacements: {
                'style': 'css',
                'script': 'js',
                // 'cdn/': function(manifest_value) {
                //     return '//cdn' + (Math.floor(Math.random() * 9) + 1) + '.' + 'exsample.dot' + '/img/' + manifest_value;
                // }
            }})) //替换html中的引用
        .pipe(gulp.dest(config.html.dev))
        .pipe($.connect.reload())
    });
    gulp.task('assets:dev', function () {
        return gulp.src(config.assets.src).pipe(gulp.dest(config.assets.dev)).pipe($.connect.reload())
    });
    gulp.task('style:dev', function () {
        return gulp.src(config.style.src)
        .pipe($.rev()) //添加hash后缀 -- 文件名加MD5后缀
        .pipe($.cssmin())
        .pipe($.autoprefixer({
            browseers: ['last 2 versions', 'Firefox>=20', 'last 2 Explorer versions', 'last 3 Safari versions'],
            cascade: true
        }))
        .pipe(gulp.dest(config.style.dev)) //新生成的文件路径
        .pipe($.rev.manifest()) //生成文件映射
        .pipe(gulp.dest("rev/css")) //将映射文件导出到rev/css中
        .pipe($.connect.reload())
    });
    gulp.task('script:dev', function () {
        return gulp.src(config.script.src)
        .pipe($.babel())
        .pipe($.uglify())
        .pipe(gulp.dest(config.script.dev))
        .pipe($.rev()) //添加hash后缀 -- 文件名加MD5后缀
        .pipe($.rev.manifest()) //生成文件映射
        .pipe(gulp.dest("rev/js")) //将映射文件导出到rev/js中
        .pipe($.connect.reload())
    });
    gulp.task('img:dev', function () {
        return gulp.src(config.img.src)
        .pipe($.imagemin({ progressive: true }))
        .pipe(gulp.dest(config.img.dev))
        .pipe($.connect.reload())
    });
    gulp.task('connect', function (cb) {
        $.connect.server({
            root: config.dev,
            port: 8081,
            livereload: true
        });
        open('http://localhost:8081');
        cb();//执行回调,表示这个异步任务已经完成,起通作用,这样会执行下个任务
    })
    gulp.task('watchs',function(){
        gulp.watch(config.html.src, gulp.series('html:dev'));
        gulp.watch(config.html.src, gulp.series('style:dev'));
        gulp.watch(config.html.src, gulp.series('script:dev'));
        gulp.watch(config.html.src, gulp.series('img:dev'));
    })
    gulp.task('dev', gulp.series(gulp.parallel('style:dev', 'script:dev','img:dev'),'html:dev','connect','watchs'), function () {
        // console.log('ok')
        // $.connect.server({
        //     root: config.dev,
        //     port: 8080,
        //     livereload: true
        // });
        // open('http://localhost:8080');
        // gulp.watch(config.html.src, ['html:dev']);
        // gulp.watch(config.html.src, ['style:dev']);
        // gulp.watch(config.html.src, ['script:dev']);
        // gulp.watch(config.html.src, ['img:dev']);
    })
}
module.exports = dev;

配置生产环境文件gulpfile.prod.js:

//配置生产的文件

const gulp = require('gulp'); //引用gulp插件
const $ = require('gulp-load-plugins')();  //自动加载插件,可以省略一个一个引用插件
const config = require('./index.js'); //引用配置的路径文件

function prod() {
    gulp.task('html', function () {
        return gulp.src(config.html.src).pipe($.fileInclude()).pipe(gulp.dest(config.html.dist))
    });
    gulp.task('assets', function () {
        return gulp.src(config.assets.src).pipe(gulp.dest(config.assets.dist))
    });
    gulp.task('style', function () {
        return gulp.src(config.style.src).pipe($.cssmin()).pipe($.autoprefixer({
            browseers: ['last 2 versions', 'Firefox>=20', 'last 2 Explorer versions', 'last 3 Safari versions'],
            cascade: true
        })).pipe($.cleanCss({ compatibility: 'ie8' }))
            .pipe(gulp.dest(config.style.dist))
    });
    gulp.task('script', function () {
        return gulp.src(config.script.src)
            .pipe($.babel())
            .pipe($.uglify())
            .pipe($.stripDebug({
                debugger: true, console: true, alert: false
            }))
            .pipe(gulp.dest(config.script.dist))
    });
    gulp.task('img', function () {
        return gulp.src(config.img.src).pipe($.imagemin()).pipe(gulp.dest(config.img.dist))
    });
    gulp.task('build', gulp.parallel('html', 'style', 'script', 'assets', 'img'))
}
module.exports = prod;

最后是gulpfile.js:把 config里的文件引入,这里还写有歇息公共的任务,雪碧图还有文件的清理都是放在这里。

const gulp = require('gulp');
const del = require('del');
const prod = require('./config/gulpfile.prod.js');
const dev = require('./config/gulpfile.dev.js');
const config = require('./config/index.js');
const $ = require('gulp-load-plugins')();

dev();  //启动开发环境,gulp dev
prod(); //启动生产环境,  gulp build

/*
gulp.task('clean', async function () {
  await gulp.src([config.dev, config.dist])
    .pipe($.clean());
});
*/
gulp.task('clean:dev', function() {//删除之前生成的文件
  return del(['dev','rev','dist']);
});
gulp.task('sprite', async function () {  //生成雪碧图,gulp sprite,分别生成dev和dist
  let spriteData = await gulp.src(config.src + '/images/sprite_2/*.{png,jpg,gif,ico,jpeg}')
    .pipe($.spritesmith({
      imgName: 'images/sprite_2.png',
      cssName: 'style/sprite.css',
      padding: 2, // 图片之间的间距
      algorithm: 'left-right', //图片排列格式,默认是top-down,我这里稍微修改下
      algorithmOpts: { sort: false } //是否排序
    }));

  return spriteData.pipe(gulp.dest(config.src)).pipe(gulp.dest(config.dist)).pipe(gulp.dest(config.dev));
});

最后再贴一下我的package.json,因为我为了方便,把启动命令也配在这个文件了:

  "scripts": {
    "dev": "gulp dev",
    "build": "gulp build",
    "del": "gulp clean:dev",
    "sprite": "gulp sprite"
  },

你可能感兴趣的:(gulp构建项目——生产环境/开发环境、生成雪碧图)