Gulp打包构建项目

打包压缩js,css,支持sass编译成css,图片压缩,图片组建成精灵图,静态文件拷贝,实时监听变化自动刷新浏览器
//引入相关插件
var gulp = require('gulp');
var rename = require('gulp-rename');   //文件重命名
var uglify = require('gulp-uglify');   //JS代码压缩
var minCSS = require('gulp-clean-css'); //CSS代码压缩
var autoprefixer = require('gulp-autoprefixer');  //添加浏览器前缀
var clean   = require('gulp-clean');     //清空文件
var cleanDest = require('gulp-clean-dest'); //清空dist目录指定文件
var changed = require('gulp-changed');  //仅仅传递更改过的文件
var imagemin = require('gulp-imagemin');  //图片压缩
var spritesmith = require('gulp.spritesmith');  //PNG图片合并成精灵图
const filter = require('gulp-filter');   //js压缩过滤器,排除已压缩过的
var sass = require('gulp-sass');  //处理sass文件
var browserSync = require('browser-sync'); //拥有实时重载服务器
var reload = browserSync.reload;  //编译后重新刷新浏览器
var buffer = require('vinyl-buffer');
var merge = require('merge-stream');

var pageSrc = 'src/pages/**/*.html';
var pageDist = 'dist/pages/';
var jsSrc = 'src/js/**/*.js';
var jsDist = 'dist/js/';
var cssSrc = 'src/css/**/*.css';
var cssDist = 'dist/css/';
var sassSrc = 'src/sass/**/*.scss';
var sassDist = 'src/css/';
var imgSrc = 'src/images/*';
var imgDist = 'dist/images/';
var iconfontSrc = 'src/iconfont/*';
var iconfontDist = 'dist/iconfont/';
var staticSrc = 'src/static/*';
var staticDist = 'dist/static/';
var spriteSrc = 'src/images/*.png';
var spriteDist = 'src/images/sprite';

gulp.task('html', function() {  //拷贝html
    return gulp.src(pageSrc)
        .pipe(changed(pageDist))
        .pipe(cleanDest(pageDist))//先清空后生成
        .pipe(gulp.dest(pageDist))
        .pipe(reload({ stream:true }));
});

//对已经压缩过的文件进行过滤,不再压缩
var  jsFilter = filter([jsSrc, '!src/js/**/*.min.js'], {restore: true});
gulp.task('js', function() {  //拷贝压缩js
    return gulp.src(jsSrc)
        .pipe(changed(jsDist))
        .pipe(cleanDest(jsDist))//先清空后生成
        .pipe(jsFilter)
        // 这会输出一个未压缩过的版本
        .pipe(gulp.dest(jsDist))
        // 这会输出一个压缩过的并且重命名未 foo.min.js 的文件
        .pipe(uglify())
        .pipe(rename({ extname: '.min.js' }))
        .pipe(jsFilter.restore)
        .pipe(gulp.dest(jsDist))
        .pipe(reload({ stream:true }));
});
gulp.task('css', function() {  //拷贝压缩css
    return gulp.src(cssSrc)
        .pipe(changed(cssDist))
        .pipe(cleanDest(cssDist))//先清空后生成
        .pipe(autoprefixer({
            browsers: ['last 2 versions'],
            cascade: false
        }))
        // 这会输出一个未压缩过的版本
        .pipe(gulp.dest(cssDist))
        .pipe(minCSS())
        .pipe(rename({ extname: '.min.css' }))
        .pipe(gulp.dest(cssDist))
        .pipe(reload({ stream:true }));
});
gulp.task('sass', function () {  //将sass文件编译成css
    return gulp.src(sassSrc)
        .pipe(changed(sassSrc))
        .pipe(cleanDest(sassDist))//先清空后生成
        .pipe(sass())
        .pipe(gulp.dest(sassDist))
        .pipe(reload({ stream:true }));
});

gulp.task('img', function() {  //拷贝压缩图片
    return gulp.src([imgSrc,'src/images/**/*'])
        .pipe(changed(imgSrc))
        .pipe(cleanDest(imgDist))//先清空后生成
        // 这会输出一个未压缩过的版本
        .pipe(imagemin([
            imagemin.gifsicle({interlaced: true}),
            imagemin.jpegtran({progressive: true}),
            imagemin.optipng({optimizationLevel: 5}),
            imagemin.svgo({
                plugins: [
                    {removeViewBox: true},
                    {cleanupIDs: false}
                ]
            })
        ]))
        .pipe(gulp.dest(imgDist))
        .pipe(reload({ stream:true }));
});
gulp.task('sprite', function () {  //产出精灵图

   /*  //img,css产出的路径相同时
   var spriteData = gulp.src(spriteSrc).pipe(cleanDest(spriteDist)).pipe(spritesmith({
        imgName: 'sprite.png',
        cssName: 'sprite.css'
    }));
    return spriteData.pipe(gulp.dest(spriteDist));*/
    var spriteData = gulp.src(spriteSrc)
        .pipe(cleanDest(spriteDist))
        .pipe(spritesmith({
        imgName: 'sprite.png',
        cssName: 'sprite.css'
    }));

    //设置打包的图片路径
    var imgStream = spriteData.img
        .pipe(buffer())
        .pipe(imagemin())
        .pipe(gulp.dest(spriteDist));
    //设置打包的css路径
    var cssStream = spriteData.css
        .pipe(gulp.dest('src/css/sprite'));

    return merge(imgStream, cssStream);
});

gulp.task('ifont', function () {  //拷贝图标字体
    return gulp.src(iconfontSrc)
        .pipe(changed(iconfontDist))
        .pipe(cleanDest(iconfontDist))//先清空后生成
        .pipe(gulp.dest(iconfontDist))
        .pipe(reload({ stream:true }));
});
gulp.task('static', function () {  //拷贝静态资源,如json数据
    return gulp.src(staticSrc)
        .pipe(changed(staticDist))
        .pipe(cleanDest(staticDist))//先清空后生成
        .pipe(gulp.dest(staticDist))
        .pipe(reload({ stream:true }));
});

//清除dist目录
gulp.task('clean', function () {
    return gulp.src('dist', {read: false})
        .pipe(clean());
});

//初始化时,批量执行多个操作
gulp.task('build', ['html','sass', 'css','js','sprite','img','ifont','static']);

//开启本地服务器监视文件改动
gulp.task('serve', function() {
    browserSync({
        open:false,
        server: {
            baseDir: 'dist',
            index : "/pages/index.html"  //将dist目录下的index.html作为入口页面访问
        }
    });
});

//启动项目,命令:gulp start ,
// 浏览器访问地址:http://localhost:3000/pages/index.html
gulp.task('start',['clean'], function() {
    gulp.start(['build','serve']);
    gulp.watch(pageSrc, ['html']);
    gulp.watch(sassSrc, ['sass']);
    gulp.watch(cssSrc, ['css']);
    gulp.watch(jsSrc, ['js']);
    gulp.watch('src/images/*.png', ['sprite']);
    gulp.watch(imgSrc, ['img']);
    gulp.watch(iconfontSrc, ['ifont']);
    gulp.watch(staticSrc, ['static']);
});


gulp.task('tojsp', function() {  //新增jsp文件
    return gulp.src('dist/pages/**/*.html')
           .pipe(rename({ extname: '.jsp' }))
           .pipe(gulp.dest('dist/views/'))
});


说明:使用 BrowserSync 和 gulp,你可以轻松地创建一个开发服务器,然后同一个 WiFi 中的任何设备都可以方便地访问到。BrowserSync 同时集成了 live-reload 所以不需要另外做配置了。打开一个浏览器,访问默认的 URL (http://localhost:3000)

当前案例的目录结构为:(目录粗略图,详细图)

  

 

注:当你启动项目后直接浏览器输入http://localhost:3000时可能返回的页面信息是:Get Error,排除了项目配置错误及代码书写错误后,该错误可能是你的访问地址没有进入到指定页面,倘若你的项目目录结构比较复杂,主页面不是直接暴露在外面,此时你需要在地址后面补充访问的页面路径,例如我这边的访问时:http://localhost:3000/pages/home/home.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值