记录:sass结合gulp在前端项目中的应用

①确保电脑全局安装了npm

    查看npm版本号:npm -v

②在项目根目录中打开cmd:创建配置文件package.json

       npm init

③在项目中安装gulp

        npm install gulp --save-dev

④在项目中安装gulp-sass

        npm install gulp-sass --save-dev

gulp的使用:

①项目根目录创建gulpfile.js(gulp项目的配置文件)

②安装gulp-connect插件(创建服务器,监听文件变化,实现页面自动刷新)

            npm install gulp-connect --save-dev

③安装压缩JS的插件gulp-uglify,pump需要附带安装

            npm install gulp-uglify --save-dev

            npm install pump --save-dev

④安装压缩css的插件gulp-clean-css

            npm install gulp-clean-css --save-dev

⑤给css里的引用文件加版本号,可以和④结合一起用

npm install gulp-make-css-url-version

⑥压缩图片

        npm install gulp-imagemin --save-dev

⑦深度压缩图片,可与⑥结合使用

       npm install imagemin-pngquant --save-dev

⑧只压缩修改的图片

        npm install gulp-cache --save-dev

⑨css背景图生成雪碧图

            npm install gulp-css-spriter --save-dev

使用注意:要合成的图片在css中使用时不能设置background-position和background-size,合成后会自动生成雪碧图并计算好background-position的值的。

代码设置参考:http://www.cnblogs.com/xbcq/p/5277850.html

⑩根据设置浏览器版本自动处理浏览器前缀

npm install gulp-autoprefixer --save-dev

⑪使用babel编译es6语法

npm install gulp-babel babel-core babel-preset-es2015--save-dev

⑫文件引入合并

npm install gulp-file-include --save-dev

⑬压缩htmlmin

    npm install gulp-htmlmin --save-dev

⑭给页面的引用添加版本号,清除页面引用缓存

 npm install gulp-rev-append --save-dev

其他:

重命名:npm install gulp-rename --save-dev

过滤文件:npm install gulp-filter --save-dev

删除文件:npm install del --save-dev

合并文件:npm install gulp-concat --save-dev

package.json

{

  "name": "zufang",

  "version": "1.0.0",

  "description": "",

  "main": "index.js",

  "scripts": {

    "test": "echo \"Error: no test specified\" && exit 1"

  },

  "author": "",

  "license": "ISC",

  "devDependencies": {

    "babel-core": "^6.26.3",

    "babel-preset-es2015": "^6.24.1",

    "del": "^3.0.0",

    "gulp": "^3.9.1",

    "gulp-autoprefixer": "^5.0.0",

    "gulp-babel": "^7.0.1",

    "gulp-cache": "^1.0.2",

    "gulp-clean-css": "^3.9.4",

    "gulp-connect": "^5.5.0",

    "gulp-css-spriter": "^0.4.0",

    "gulp-file-include": "^2.0.1",

    "gulp-filter": "^5.1.0",

    "gulp-htmlmin": "^4.0.0",

    "gulp-imagemin": "^4.1.0",

    "gulp-make-css-url-version": "0.0.13",

    "gulp-rename": "^1.3.0",

    "gulp-rev-append": "^0.1.8",

    "gulp-sass": "^4.0.1",

    "gulp-uglify": "^3.0.0",

    "imagemin-pngquant": "^5.1.0",

    "pump": "^3.0.0"

  }

}

gulpfile.js

//引入插件

var gulp = require('gulp');

var sass = require('gulp-sass');

var connect = require('gulp-connect');

var uglify = require('gulp-uglify');

var pump = require('pump');

var cssmin = require('gulp-clean-css');

var cssver = require('gulp-make-css-url-version');

var imagemin = require('gulp-imagemin');

var pngquant = require('imagemin-pngquant');

var cache = require('gulp-cache');

var spriter = require('gulp-css-spriter');

var autoprefixer = require('gulp-autoprefixer');

var babel = require('gulp-babel');

var fileinclude = require('gulp-file-include');

var htmlmin = require('gulp-htmlmin');

var rev = require('gulp-rev-append');

var rename = require('gulp-rename');

var filter = require('gulp-filter');

var del = require('del');

//路径变量

var path = {

    //开发环境

    src: {

        html: './src',

        js: './src/js',

        scss: './src/scss',

        css: './src/css',

        img: './src/img',

        font:'./src/font',

        includebase: './src/include' //include引用文件路径

    },

    //发布环境

    dist: {

        html: './dist',

        js: './dist/js',

        scss: './dist/scss',

        css: './dist/css',

        img: './dist/img',

        font:'./dist/font',

        baseroot: './dist'

    }

};

//将scss文件编译成css

gulp.task('scss', function() {

    return gulp.src(path.src.scss + '/*.scss', { style: 'expanded' })

        .pipe(cache(sass()))

        .pipe(gulp.dest(path.src.css))

        .pipe(connect.reload());

});

//压缩css文件,css样式加前缀

gulp.task('css', ['scss'], function() {

    var timestamp = new Date().getTime();

    return gulp.src(path.src.css + '/*.css')

        .pipe(autoprefixer({ //给样式增加浏览器前缀

            // browsers:['last 2 versions','safari 5','ie 8', 'ie 9', 'opera 12.1','ff 15', 'ios 6','android 4'],

            browsers: ['>0.1%'],

            cascade: true, //是否美化属性值

            remove: true //是否去掉不必要的前缀 默认true

        }))

        // .pipe(spriter({ //合成雪碧图

        //    'spriteSheet': path.dist.img + '/sprite_' + timestamp + '.png', // 生成的spriter的位置

        //    // 如下将生产:backgound:url(../images/sprite20324232.png)

        //    'pathToSpriteSheetFromCSS': './../img/sprite_' + timestamp + '.png', //生成的样式文件里面图片引用地址的路径

        // }))

        // .pipe(rename({ suffix: '.min' })) // 对管道里的文件流添加 .min 的重命名

        // .pipe(cssmin({

        //    advanced: false, //类型:Boolean 默认:true [是否开启高级优化(合并选择器等)]

        //    compatibility: 'ie8', //保留ie8及以下兼容写法 类型:String 默认:''or'*' [启用兼容模式; 'ie7':IE7兼容模式,'ie8':IE8兼容模式,'*':IE9+兼容模式]

        //    keepBreaks: true,

        //    keepSpecialComments: '*' //保留所有特殊前缀 当你用autoprefixer生成的浏览器前缀,如果不加这个参数,有可能将会删除你的部分前缀

        // }))

        .pipe(gulp.dest(path.dist.css))

        .pipe(connect.reload());

});

//压缩图片

gulp.task('image', function() {

    return gulp.src(path.src.img + '/**/*.{png,jpg,gif,ico}')

        .pipe(cache(imagemin({

            optiimizationLevel: 5, //类型:Number  默认:3  取值范围:0-7(优化等级)

            progressive: true, //类型:Boolean 默认:false 无损压缩jpg图片

            interlaced: true, //类型:Boolean 默认:false 隔行扫描gif进行渲染

            multipass: true, //类型:Boolean 默认:false 多次优化svg直到完全优化

            svgoPlugins: [{ removeViewBox: false }], //不要移除svg的viewbox属性

            use: [pngquant()] //使用pngquant深度压缩png图片的imagemin插件

        })))

        .pipe(gulp.dest(path.dist.img))

});

/**

* 编译css及复制压缩图片及雪碧图后,再添加css引用文件的版本号

*/

// gulp.task('cssver',['css','image'], function(){

// return gulp.src(path.dist.css + '/*.css')

// .pipe(cssver())

// .pipe(gulp.dest(path.dist.css));

// });

// 压缩js文件

gulp.task('js', function(cb) {

    var jsFilter = filter('**/*.min.js', { restore: true });

    pump([

            gulp.src(path.src.js + '/*.js'),

            jsFilter,

            gulp.dest(path.dist.js), //复制*.min.js文件到dist/js中

            jsFilter.restore,

            filter(['**/*', '!**/*.min.js']), // 筛选出管道中的非 *.min.js 文件,进行压缩编译

            babel({

                presets: ['es2015']

            }),

            // rename({ suffix: '.min' }), //重命名

            uglify(),

            gulp.dest(path.dist.js)

        ],

        cb

    );

});

//字体文件

// gulp.task('font',function(){

// return gulp.src(path.src.font + '/*')

// .pipe(gulp.dest(path.dist.font))

// .pipe(connect.reload());

// });

//压缩html页面,文件嵌入,页面引用文件加版本号

gulp.task('html', ['js','css','image'], function() {

    var options = {

        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

    };

    return gulp.src(path.src.html + '/**/*.html')

        .pipe(fileinclude({ //文件嵌入

            prefix: '@@', //变量前缀 @@include

            basepath: path.src.includebase, //引用文件路径

            indent: true //保留文件的缩进

        }))

        .pipe(rev()) //引用文件添加版本号

        .pipe(htmlmin(options))

        .pipe(gulp.dest(path.dist.html))

        .pipe(connect.reload());

});

//clean 清空dist目录中文件

gulp.task('clean', function() {

    return del(path.dist.baseroot + '/**/*');

});

// build任务,依赖清空任务

gulp.task('build', ['clean'], function() {

    gulp.start('html');

});

// 服务器监听

gulp.task('server', function() {

    connect.server({

        root: path.dist.html,

        port: 520,

        livereload: true

    })

    // 监控文件,有变动则执行对应方法

    gulp.watch(path.src.scss + '/*.scss', ['scss']);

    gulp.watch(path.src.css + './*.css', ['css']);

    gulp.watch(path.src.html + '/**/*.html', ['html']);

    gulp.watch(path.src.img + '/**/*', ['image']);

    gulp.watch(path.src.js + '/*.js', ['js']);

    // gulp.watch(path.src.font + '/*', ['font']);

});


cmd输入 gulp server 开启服务器



参考资料:

gulp详细入门教程

https://gulpjs.com/plugins/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容