基于gulp的前端自动化开发构建
就前端的发展而言会越来越朝着后端的标准化靠近,后端的工程化以及模块化都很成熟。基于这样一个思路,开始探索如何优化目前的开发流程。而使用的工具就是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的前端自动化开发构建的更多相关文章
- 基于gulp的前端自动化开发构建新
关于gulp的使用,已经在之前写过一篇文章,但是遗留了一个问题.问题是实现文件的增量式更新,就是给html引入的js和css文件打上标记.每次更新标记更新. 上篇文章想通过开发同时实现标记的实时更新, ...
- 基于gulp 的前端自动化构建方案总结
一,基础篇 先安装nodejs 使用淘宝镜像安装tnpm 安装 cnpm 插件:npm install -g cnpm --registry=https://registry.npm.taobao.o ...
- 基于gulp的前端自动化方案
前言 最近几年前端技术发展日新月异,特别是单页应用的普及.组件化.工程化.自动化成了前端发展的趋势.webpack已经成为了前端打包构建的主流,但是一些老古董的项目还是存在的,也有优化的必要,正好 ...
- 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)
通过前面几节的准备工作,对于 npm / node / gulp 应该已经有了基本的认识,本节主要介绍如何构建一个基本的前端自动化开发环境. 下面将逐步构建一个可以自动编译 sass 文件.压缩 ja ...
- 常用 Gulp 插件汇总 —— 基于 Gulp 的前端集成解决方案(三)
前两篇文章讨论了 Gulp 的安装部署及基本概念,借助于 Gulp 强大的 插件生态 可以完成很多常见的和不常见的任务.本文主要汇总常用的 Gulp 插件及其基本使用,需要读者对 Gulp 有一个基本 ...
- 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一)
相关连接导航 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一) 执行 $Gulp 时发生了什么 —— 基于 Gulp 的前端集成解决方案(二) 常用 Gulp 插件汇总 ...
- 执行 $Gulp 时发生了什么 —— 基于 Gulp 的前端集成解决方案(二)
前言 文章 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一) 中,已经完成对 gulp 的安装,由于是window环境,文中特意提到了可以通过安装 gitbash 来代替 ...
- 基于webpack的前端工程化开发解决方案探索(一):动态生成HTML(转)
1.什么是工程化开发 软件工程的工程化开发概念由来已久,但对于前端开发来说,我们没有像VS或者eclipse这样量身打造的IDE,因为在大多数人眼中,前端代码无需编译,因此只要一个浏览器来运行调试就行 ...
- 基于webpack的前端工程化开发解决方案探索(二):代码分割与图片加载
今天我们继续来进行webpack工程化开发的探索! 首先来验证上一篇文章 基于webpack的前端工程化开发解决方案探索(一):动态生成HTML 中的遗留问题:webpack将如何处理按需加载的 ...
随机推荐
- webpack4的react打包错误
因为之前一直用的是脚手架创建项目,第一次自己学习创建webpack打包.loader我是复制别人的. module: { loaders: [ { test: /\.js?$/, exclude: / ...
- Spark运行模式_基于YARN的Resource Manager的Client模式(集群)
现在越来越多的场景,都是Spark跑在Hadoop集群中,所以为了做到资源能够均衡调度,会使用YARN来做为Spark的Cluster Manager,来为Spark的应用程序分配资源. 在执行Spa ...
- Qt udp 主机和虚拟机无法互相广播
描述: 主机和虚拟机可以ping通,port没被占用,虚拟机可以向主机广播,但是主机不能向虚拟机广播 原因: 虚拟机只配置了一个适配器,而主机有多个适配器,当虚拟机广播时,只能使用和主机连接的适配器, ...
- 后端系统开发之gflags使用规范
任何好用的工具如果使用不当都会带来不好的后果,gflags也是一样.我遇到过一些gflags的“坑”,还从领导和同事那里获得一些好的想法,整理成7条gflags使用规范.有意识的遵循这些规范,对项目的 ...
- 【转】odoo学习之:Environment
Environment类提供了对ORM对象的封装,同时提供了对注册类的访问,记录集的缓存,以及管理重计算的数据结构. 对于继承了Model的类来说可以直接通过self.env对Environment进 ...
- TableView滑动时候出现的卡顿现象
分析 UITableView是UIScrollView的子类,因此它可以自动响应滚动事件(一般为上下滚动). 它内部包含0到多个UITableViewCell对象,每个table cell展示各自的 ...
- 【转】Oracle 如何找回已经删除了的表记录
有的时候我们不小心把数据库表(emp)中重要的记录给删除了,怎么给找回来了,看下面这个例子你就会明白. 某一天,10点钟的时候,张三一不小心给数据库表emp的一条重要记录给删除了并且还提交了,此时也没 ...
- uvaoj 489 - Hangman Judge(逻辑+写代码能力)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- Qt-QML-Slider-滑块-Style-后继
首先了,先把我上篇文章的demo准备好,不过我上次写的被我删除了,这次就重新写了一个,上代码 import QtQuick 2.5 import QtQuick.Controls 1.4 import ...
- 敏捷开发学习笔记-Agile development(AM)
以人为核心,迭代,循序渐进 项目被切分为多个子项目,每个子项目都经过测试,具备集成和可运行的特征 5个价值观:沟通.简单.反馈.勇气.谦逊 敏捷模型与瀑布模型的区别 相对于瀑布模型,提高开发效率和 ...