基于gulp的前端自动化开发构建

就前端的发展而言会越来越朝着后端的标准化靠近,后端的工程化以及模块化都很成熟。基于这样一个思路,开始探索如何优化目前的开发流程。而使用的工具就是gulp。

个人觉得gulp比较webpack更为简单实用,gulp依靠插件工作,webpack除了插件还有各种loader。当然这不是重点,重点是能够确实解决问题。目前公司对前端开发并没有一个明确的要求,所以个人根据现有的开发流程以及开发认识,写了如下的代码。

目录结构,src内部的相关文件和代码,最终编译到dist中,dist就是发布的代码

然后是package.json文件

 1 {
 2   "name": "gulpf",
 3   "version": "1.0.0",
 4   "description": "",
 5   "main": "index.js",
 6   "scripts": {
 7     "test": "echo "Error: no test specified" && exit 1"
 8   },
 9   "author": "",
10   "license": "ISC",
11   "devDependencies": {
12     "babel-core": "^6.26.0",
13     "babel-preset-es2015": "^6.24.1",
14     "browser-sync": "^2.23.6",
15     "del": "^3.0.0",
16     "gulp": "^3.9.1",
17     "gulp-autoprefixer": "^5.0.0",
18     "gulp-babel": "^7.0.1",
19     "gulp-base64": "^0.1.3",
20     "gulp-clean": "^0.4.0",
21     "gulp-clean-css": "^3.9.3",
22     "gulp-htmlmin": "^4.0.0",
23     "gulp-imagemin": "^4.1.0",
24     "gulp-plumber": "^1.2.0",
25     "gulp-sass": "^4.0.1",
26     "gulp-spriter": "^1.1.5",
27     "gulp-uglify": "^3.0.0",
28   }
29 }

然后是gulpfile.js具体的代码

 1 var gulp = require('gulp'),
 2     clean=require("gulp-clean"),  
 3     htmlmin = require('gulp-htmlmin'),
 4     sass=require('gulp-sass'),
 5     base64=require('gulp-base64'),
 6     imageMin = require('gulp-imagemin'),
 7     uglify = require('gulp-uglify'),
 8     clean_css = require('gulp-clean-css'),
 9     babel = require("gulp-babel"),
10     browserSync = require('browser-sync').create(),
11     plumber = require('gulp-plumber'),
12     autoprefixer = require('gulp-autoprefixer');
13 //编译sass 
14 gulp.task('scss', function () {  
15     gulp.src('src/scss/*.scss')
16 
17         .pipe(plumber({ errHandler: e => {
18                 gutil.log(e); // 抛出异常
19             }}))  
20         .pipe(sass())
21         .pipe(base64({
22                 extensions:     ['svg','png','jpg','jpeg'],
23                 maxImageSize:   8*1024, // bytes 
24                 debug:          true
25             }))
26         .pipe(autoprefixer({
27             browsers: ['last 2 versions'],
28             cascade: false
29         }))
30         .pipe(clean_css())
31         .pipe(gulp.dest('dist/css/'))  
32 }); 
33 
34 //转译es6
35 gulp.task("es6",function(){
36     gulp.src('src/js/*.js')  
37         .pipe(babel({
38             presets: ['es2015']
39         }))
40         .pipe(uglify()) 
41         .pipe(gulp.dest('dist/js/')) 
42 })
43 
44 //清除图片文件
45 gulp.task("cleanimgs",function(){
46     gulp.src("dist/imgs/",{read:false})
47     .pipe(clean())
48 })
49 //清除html文件
50 gulp.task("cleanhtml",function(){
51     gulp.src("dist/html/*.html",{read:false})
52     .pipe(clean())
53 })
54 //拷贝压缩imgs
55 gulp.task("imgs",function(){
56     gulp.src('src/imgs/*')  
57         .pipe(imageMin({progressive: true})) 
58         .pipe(plumber({ errHandler: e => {
59                 gutil.log(e); // 抛出异常
60             }}))    
61         .pipe(gulp.dest('dist/imgs/')) 
62 })
63 //拷贝html
64 gulp.task("html",function(){
65     var options = {
66         removeComments: true,//清除HTML注释
67         collapseWhitespace: true,//压缩HTML
68         collapseBooleanAttributes: true,//省略布尔属性的值 <input checked="true"/> ==> <input />
69         removeEmptyAttributes: true,//删除所有空格作属性值 <input id="" /> ==> <input />
70         removeScriptTypeAttributes: true,//删除<script>的type="text/javascript"
71         removeStyleLinkTypeAttributes: true,//删除<style>和<link>的type="text/css"
72         minifyJS: true,//压缩页面JS
73         minifyCSS: true//压缩页面CSS
74     };
75     gulp.src('src/*.html')
76         .pipe(htmlmin(options))
77         .pipe(gulp.dest('dist/'));
78 })
79 
80 //默认任务
81 gulp.task('default',['cleanimgs','scss','es6','imgs','cleanhtml','html'],function(done) {  
82  
83     browserSync.init({  
84         //指定服务器启动根目录  
85         server: "./dist"  
86     });  
87     //监听sass编译,修改了才删除
88     gulp.watch("src/scss/*.scss", ['cleancss','scss']);
89     //监听sass编译  
90     gulp.watch("src/js/*.js", ['es6']);
91     //监听图片变化
92     gulp.watch("src/imgs/*", ['cleanimgs','imgs']);
93     //监听html变化
94     gulp.watch("src/*.html", ['html']);
95     //监听任何文件变化,实时刷新页面  
96     gulp.watch(["src/scss/*.scss","src/js/*.js","src/*.html","src/imgs/*"]).on('change',browserSync.reload);  
97 }); 

上述代码实现的功能有

1,实时刷新浏览器,不管是html变化,css变化,还是js变化

2,使用sass,转译sass为css,并且自动加浏览器前缀并且压缩

3,对es6进行转译并且压缩

4,对小图片进行base64转化,减少http请求数

5,压缩html文件内容

6,gulp-plumber这个插件的作用是,避免插件错误,终端gulp执行

当然,本代码还有优化的余地,比如雪碧图的使用,比如合并相关的css和js文件,再比如给js文件和css加MD5进行增量式更新,放置缓存。并且直接替换html中代码。

倒是尝试了给js和css添加md5,但是最终效果不稳定,所以没有写文章中,本文就算是工程化构建代码的一个1.0版本吧,至少对自己开发还是有很大帮助的。后续会考虑研究加上md5.

本文结束。

原文地址:https://www.cnblogs.com/zhensg123/p/8868336.html