基于gulp的前端自动化开发构建新
关于gulp的使用,已经在之前写过一篇文章,但是遗留了一个问题。问题是实现文件的增量式更新,就是给html引入的js和css文件打上标记。每次更新标记更新。
上篇文章想通过开发同时实现标记的实时更新,后来借鉴了别人的实现,原来的确是应该将这个过程分为开发和生产两个环境的,于是茅塞顿开。于是有了本文。
代码
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-rev": "^8.1.1",
"gulp-rev-collector": "^1.3.1",
"gulp-sass": "^4.0.1",
"gulp-spriter": "^1.1.5",
"gulp-uglify": "^3.0.0",
"gulp-util": "^3.0.8",
"run-sequence": "^2.2.1"
}
}
gulpfile.js下的代码
var gulp = require('gulp'),
clean = require("gulp-clean"),
htmlmin = require('gulp-htmlmin'),
rev = require('gulp-rev'), //添加时间戳
revCollector = require('gulp-rev-collector'), //时间戳添加后再html 里面替换原有的文件
sass = require('gulp-sass'),
base64 = require('gulp-base64'),
imageMin = require('gulp-imagemin'),
uglify = require('gulp-uglify'),
clean_css = require('gulp-clean-css'),
clean = require('gulp-clean'), //清除原来文件
babel = require("gulp-babel"),
browserSync = require('browser-sync').create(),
plumber = require('gulp-plumber'),
runSequence = require('run-sequence'),
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(gulp.dest('src/css/'))
});
//清除css文件
gulp.task("cleancss", function() {
gulp.src("src/css/", { read: false })
.pipe(clean())
})
//开发环境
gulp.task('dev', ['cleancss','scss'], function(done) {
browserSync.init({
//指定服务器启动根目录
server: "./src"
});
//监听sass编译,修改了才删除
gulp.watch("src/scss/*.scss", ['scss']);
//监听任何文件变化,实时刷新页面
gulp.watch(["src/*.html", "src/imgs/*","src/css/*.css", "src/js/*.js"]).on('change', browserSync.reload);
});
//构建生产环境
//清除图片文件
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())
})
//清除js文件
gulp.task("cleanjs", function() {
gulp.src("dist/js/*.js", { read: false })
.pipe(clean())
})
//清除css文件
gulp.task("cleandistcss", function() {
gulp.src("dist/css/*.css", { 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/'));
})
//转译es6
gulp.task("es6", function() {
gulp.src('src/js/*.js')
.pipe(babel({
presets: ['es2015']
}))
.pipe(uglify())
.pipe(rev())
.pipe(gulp.dest('dist/js/'))
.pipe(rev.manifest())
.pipe(gulp.dest('dist/rev/js'))
})
//给css文件后添加时间戳
gulp.task('revcss', function() {
gulp.src('src/css/*.css')
.pipe(rev())
.pipe(gulp.dest('./dist/css'))
.pipe(rev.manifest())
.pipe(gulp.dest('dist/rev/css'))
});
//给js文件后添加时间戳
gulp.task('rev', function() {
gulp.src(['./dist/rev/*/*.json', './src/*.html'])
//- 读取 rev-manifest.json 文件以及需要进行css名替换的文件
.pipe(revCollector())
//- 执行文件内js名的替换
.pipe(gulp.dest('./dist/'));
//- 替换后的文件输出的目录
});
//生产环境,异步rev
gulp.task('build', ['cleanimgs','cleanhtml','cleanjs','cleandistcss','imgs','html','es6','revcss'],function(){
gulp.start('rev');
});
目录结构

在src中写开发环境代码,在dist中生成html代码。分别执行gulp dev个gulp build。
src的目录结构

dist的目录结构

rev下

本文结束。
基于gulp的前端自动化开发构建新的更多相关文章
- 基于gulp的前端自动化开发构建
就前端的发展而言会越来越朝着后端的标准化靠近,后端的工程化以及模块化都很成熟.基于这样一个思路,开始探索如何优化目前的开发流程.而使用的工具就是gulp. 个人觉得gulp比较webpack更为简单实 ...
- 基于gulp 的前端自动化构建方案总结
一,基础篇 先安装nodejs 使用淘宝镜像安装tnpm 安装 cnpm 插件:npm install -g cnpm --registry=https://registry.npm.taobao.o ...
- 基于gulp的前端自动化方案
前言 最近几年前端技术发展日新月异,特别是单页应用的普及.组件化.工程化.自动化成了前端发展的趋势.webpack已经成为了前端打包构建的主流,但是一些老古董的项目还是存在的,也有优化的必要,正好 ...
- 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)
通过前面几节的准备工作,对于 npm / node / gulp 应该已经有了基本的认识,本节主要介绍如何构建一个基本的前端自动化开发环境. 下面将逐步构建一个可以自动编译 sass 文件.压缩 ja ...
- 执行 $Gulp 时发生了什么 —— 基于 Gulp 的前端集成解决方案(二)
前言 文章 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一) 中,已经完成对 gulp 的安装,由于是window环境,文中特意提到了可以通过安装 gitbash 来代替 ...
- 常用 Gulp 插件汇总 —— 基于 Gulp 的前端集成解决方案(三)
前两篇文章讨论了 Gulp 的安装部署及基本概念,借助于 Gulp 强大的 插件生态 可以完成很多常见的和不常见的任务.本文主要汇总常用的 Gulp 插件及其基本使用,需要读者对 Gulp 有一个基本 ...
- 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一)
相关连接导航 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一) 执行 $Gulp 时发生了什么 —— 基于 Gulp 的前端集成解决方案(二) 常用 Gulp 插件汇总 ...
- 基于webpack的前端工程化开发解决方案探索(一):动态生成HTML(转)
1.什么是工程化开发 软件工程的工程化开发概念由来已久,但对于前端开发来说,我们没有像VS或者eclipse这样量身打造的IDE,因为在大多数人眼中,前端代码无需编译,因此只要一个浏览器来运行调试就行 ...
- 基于webpack的前端工程化开发解决方案探索(二):代码分割与图片加载
今天我们继续来进行webpack工程化开发的探索! 首先来验证上一篇文章 基于webpack的前端工程化开发解决方案探索(一):动态生成HTML 中的遗留问题:webpack将如何处理按需加载的 ...
随机推荐
- asp.net在一般处理程序里面操作Session
1.要在一般处理程序中获取其他页面的session值,需要引用名空间: using System.Web.SessionState; 2.然后继承一个接口:IRequiresSessionState ...
- Python编程从入门到实践,个人笔记
3-9 晚餐嘉宾:在完场练习3-6时编写的程序之一中,使用len()打印一条消息,指出有多少位嘉宾来与你共进晚餐. 自己先写的程序如下: # coding=gbk #邀请一些人吃饭 per_list= ...
- IA64与x86-64的区别
win7 sp1下载地址:https://download.microsoft.com/download/0/A/F/0AFB5316-3062-494A-AB78-7FB0D4461357/wind ...
- 008---vim编辑器
vim 编辑器 三个模式 三个模式之间切换 图 命令模式进入编辑模式 A:行末 a:向后 i:向前 I:行首 o:向上 O:向下 命令模式 复制 yy:复制光标所在行 4yy:向下复制四行 剪切(删除 ...
- swig与python
当你觉得python慢的时候,当你的c/c++代码难以用在python上的时候,你可能会注意这篇文章.swig是一个可以把c/c++代码封装为python库的工具.(本文封装为python3的库) 文 ...
- AIDL 进程间通信的一个小小的总结
需求 项目需要,将做好的项目作为一个服务提供给另一个公司.我们需要提供一个apk,所以设计到进程间交互,不得不了解一下AIDL了. 了解一下AIDL 之前准备面试的时候,或多或少的了解了一点AIDL, ...
- BZOJ1433_假期的宿舍_KEY
题目传送门 二分图匹配的题目. 但建边有一定难度,关系比较复杂. 首先要统计总共需要几张床. 在校且住校的会需要一张床,不住校的需要一张床. 然后对于在校且住校的与自己的床连边,不住校的与认识的住校的 ...
- codechef Table Game(博弈)
题意 题目链接 很难概括.. Sol (因为比赛还没结束,所以下面讲的可能是“非官方”“正解”) maya这题我前前后后 断断续续的做了一个星期才A掉.CC一场challenge出两道打表题可有点过分 ...
- 成都Uber优步司机奖励政策(2月25日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- Git学习系列 (二)
#克隆目录并重命名为newname,默认目录名是使用.git前的grit git clone git://github.com/schacon/grit.git newname #将所有已经跟踪过的文 ...