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

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

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

然后是package.json文件

 {
"name": "gulpf",
"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.0",
"babel-preset-es2015": "^6.24.1",
"browser-sync": "^2.23.6",
"del": "^3.0.0",
"gulp": "^3.9.1",
"gulp-autoprefixer": "^5.0.0",
"gulp-babel": "^7.0.1",
"gulp-base64": "^0.1.3",
"gulp-clean": "^0.4.0",
"gulp-clean-css": "^3.9.3",
"gulp-htmlmin": "^4.0.0",
"gulp-imagemin": "^4.1.0",
"gulp-plumber": "^1.2.0",
"gulp-sass": "^4.0.1",
"gulp-spriter": "^1.1.5",
"gulp-uglify": "^3.0.0",
}
}

然后是gulpfile.js具体的代码

 var gulp = require('gulp'),
clean=require("gulp-clean"),
htmlmin = require('gulp-htmlmin'),
sass=require('gulp-sass'),
base64=require('gulp-base64'),
imageMin = require('gulp-imagemin'),
uglify = require('gulp-uglify'),
clean_css = require('gulp-clean-css'),
babel = require("gulp-babel"),
browserSync = require('browser-sync').create(),
plumber = require('gulp-plumber'),
autoprefixer = require('gulp-autoprefixer');
//编译sass
gulp.task('scss', function () {
gulp.src('src/scss/*.scss') .pipe(plumber({ errHandler: e => {
gutil.log(e); // 抛出异常
}}))
.pipe(sass())
.pipe(base64({
extensions: ['svg','png','jpg','jpeg'],
maxImageSize: *, // bytes
debug: true
}))
.pipe(autoprefixer({
browsers: ['last 2 versions'],
cascade: false
}))
.pipe(clean_css())
.pipe(gulp.dest('dist/css/'))
}); //转译es6
gulp.task("es6",function(){
gulp.src('src/js/*.js')
.pipe(babel({
presets: ['es2015']
}))
.pipe(uglify())
.pipe(gulp.dest('dist/js/'))
}) //清除图片文件
gulp.task("cleanimgs",function(){
gulp.src("dist/imgs/",{read:false})
.pipe(clean())
})
//清除html文件
gulp.task("cleanhtml",function(){
gulp.src("dist/html/*.html",{read:false})
.pipe(clean())
})
//拷贝压缩imgs
gulp.task("imgs",function(){
gulp.src('src/imgs/*')
.pipe(imageMin({progressive: true}))
.pipe(plumber({ errHandler: e => {
gutil.log(e); // 抛出异常
}}))
.pipe(gulp.dest('dist/imgs/'))
})
//拷贝html
gulp.task("html",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
};
gulp.src('src/*.html')
.pipe(htmlmin(options))
.pipe(gulp.dest('dist/'));
}) //默认任务
gulp.task('default',['cleanimgs','scss','es6','imgs','cleanhtml','html'],function(done) { browserSync.init({
//指定服务器启动根目录
server: "./dist"
});
//监听sass编译,修改了才删除
gulp.watch("src/scss/*.scss", ['cleancss','scss']);
//监听sass编译
gulp.watch("src/js/*.js", ['es6']);
//监听图片变化
gulp.watch("src/imgs/*", ['cleanimgs','imgs']);
//监听html变化
gulp.watch("src/*.html", ['html']);
//监听任何文件变化,实时刷新页面
gulp.watch(["src/scss/*.scss","src/js/*.js","src/*.html","src/imgs/*"]).on('change',browserSync.reload);
});

上述代码实现的功能有

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.

本文结束。

基于gulp的前端自动化开发构建的更多相关文章

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

    关于gulp的使用,已经在之前写过一篇文章,但是遗留了一个问题.问题是实现文件的增量式更新,就是给html引入的js和css文件打上标记.每次更新标记更新. 上篇文章想通过开发同时实现标记的实时更新, ...

  2. 基于gulp 的前端自动化构建方案总结

    一,基础篇 先安装nodejs 使用淘宝镜像安装tnpm 安装 cnpm 插件:npm install -g cnpm --registry=https://registry.npm.taobao.o ...

  3. 基于gulp的前端自动化方案

    前言 ​ 最近几年前端技术发展日新月异,特别是单页应用的普及.组件化.工程化.自动化成了前端发展的趋势.webpack已经成为了前端打包构建的主流,但是一些老古董的项目还是存在的,也有优化的必要,正好 ...

  4. 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)

    通过前面几节的准备工作,对于 npm / node / gulp 应该已经有了基本的认识,本节主要介绍如何构建一个基本的前端自动化开发环境. 下面将逐步构建一个可以自动编译 sass 文件.压缩 ja ...

  5. 常用 Gulp 插件汇总 —— 基于 Gulp 的前端集成解决方案(三)

    前两篇文章讨论了 Gulp 的安装部署及基本概念,借助于 Gulp 强大的 插件生态 可以完成很多常见的和不常见的任务.本文主要汇总常用的 Gulp 插件及其基本使用,需要读者对 Gulp 有一个基本 ...

  6. 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一)

    相关连接导航 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一) 执行 $Gulp 时发生了什么 —— 基于 Gulp 的前端集成解决方案(二) 常用 Gulp 插件汇总 ...

  7. 执行 $Gulp 时发生了什么 —— 基于 Gulp 的前端集成解决方案(二)

    前言 文章 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一) 中,已经完成对 gulp 的安装,由于是window环境,文中特意提到了可以通过安装 gitbash 来代替 ...

  8. 基于webpack的前端工程化开发解决方案探索(一):动态生成HTML(转)

    1.什么是工程化开发 软件工程的工程化开发概念由来已久,但对于前端开发来说,我们没有像VS或者eclipse这样量身打造的IDE,因为在大多数人眼中,前端代码无需编译,因此只要一个浏览器来运行调试就行 ...

  9. 基于webpack的前端工程化开发解决方案探索(二):代码分割与图片加载

    今天我们继续来进行webpack工程化开发的探索! 首先来验证上一篇文章   基于webpack的前端工程化开发解决方案探索(一):动态生成HTML  中的遗留问题:webpack将如何处理按需加载的 ...

随机推荐

  1. day 17 成员

    1.成员      在类中你能写的所有内容都是类的成员 2.变量      1. 实例变量:昨天写的就是实力变量,由对象去访问的变量      2. 类变量:   这个变量属于类.但是对象也可以访问 ...

  2. Python学习手册之元组拆包、三元运算符和 else 语句深入

    在上一篇文章中,我们介绍了 Python 之禅. Python 编程规范和函数参数,现在我们介绍 Python 的元组拆包.三元运算符和对 Python 的 else 语句深入讲解.查看上一篇文章请点 ...

  3. QOS-policy配置

    QOS-QOS-policy配置 2018年7月7日 20:29 配置: 先匹配acl: [RT2]acl number 3000 [RT2-acl-adv-3000]description QOS ...

  4. PC环境搭建——虚拟机配置双网卡

    Vmware虚拟机三种网络模式详解 TCP/IP协议四层模型: 应用层 传输层 网络层 物理接口 桥接模式时,主机和虚拟机在同一个网段,之间可以相互访问 NAT模式时,主机和虚拟机不在同一网段,之间通 ...

  5. Linux 中的权限

    ABCD A-0, 十进制 B-user(u, 用户) C-group(g, 组用户) D-others(o, 其他用户) +-----+---+--------------------------+ ...

  6. [Real World Haskell翻译]第27章 网络通信和系统日志 Sockets and Syslog

    第27章 网络通信和系统日志 Sockets and Syslog 基础网络 在本书的前面几章,我们讨论了运转在网络上的服务.其中的两个例子是客户端/服务器架构的数据库和Web服务.当需要制定一个新的 ...

  7. 20145202马超《java》实验5

    两人一组结对编程: 参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA 结对实现中缀表达式转后缀表达式的功能 MyBC.java 结对实现从上面 ...

  8. 【JUC源码解析】Exchanger

    简介 Exchanger,并发工具类,用于线程间的数据交换. 使用 两个线程,两个缓冲区,一个线程往一个缓冲区里面填数据,另一个线程从另一个缓冲区里面取数据.当填数据的线程将缓冲区填满时,或者取数据的 ...

  9. Fiddler使用总结(二)

    在上一篇中介绍了Fiddler的基本使用方法.通过上一篇的操作我们可以直接抓取浏览器的数据包.但在APP测试中,我们需要抓取手机APP上的数据包,应该怎么操作呢? Andriod配置方法: .确保手机 ...

  10. CentOS 7.2-编译安装zabbix 3.4

    起因: 前面已经使用yum安装了zabbix 3.4了,准备去交差了,交差时老大明确要求必须使用编译安装,统一放在/usr/local目录下.... 重来吧!! 一.环境说明 本次安装使用CentOS ...