为了节省http请求次数、节约带宽,加速页面渲染速度,达到更好用户体验的目的。现在普遍的做法是在上线之前做静态资源的打包构建,也就是静态资源的合并压缩;

  这里使用的是gulp,当然现在有更强大的模块化构建工具webpack,大家可以尝试一下,但是不管用什么工具,只要能解决对应的问题,就是好工具;

  大家注意,使用gulp需要先安装node哦,具体安装教程请百度一下

完整的配置和demo在github上:https://github.com/hj1226104386/gulp-workflow.git,欢迎大家star一下啦

资源构建无非就是下面几个步骤:

  1. css、js、image的合并压缩
  2. 给css、js、image合并后添加版本号(hash),生成对应的manifest文件,这一步非常重要
  3. 根据manifest文件来替换HTML文件和css文件中的对应资源路径

看起来就几个步骤,做起来还是挺麻烦的:

1、首先先在根目录打开命令行做项目依赖初始化:

npm init -y

2、在根目录创建一个gulpfile.js文件

3、安装gulp的依赖,通过npm来安装,如下,并在gulpfile中引入(commonjs规范,使用require来引入模块)

var gulp = require('gulp');
var rev = require('gulp-rev'); // 创建版本号(hash)值
var revCollector = require('gulp-rev-collector'); // 将版本号添加到文件后
var sequence = require('run-sequence'); // 让gulp任务同步运行
var clean = require('gulp-clean'); // 清除dist构建目录
var htmlmin = require('gulp-htmlmin'); // 压缩html
var cssnano = require('gulp-cssnano'); // css压缩
var autoprefixer = require('gulp-autoprefixer'); // 自动处理css兼容后缀
var babel = require('gulp-babel'); // es6转es5
var concat = require('gulp-concat'); // 文件合并
var uglify = require('gulp-uglify'); // js混淆
var imagemin = require('gulp-imagemin'); // 图片压缩
var browserSync = require('browser-sync').create(); // 启动本地服务,修改免F5刷新
var useref = require('gulp-useref'); // 替换HTML中资源的引用路径

4、在开始编写任务之前,先新建一个path对象,用来统一配置和保存静态资源路径

// 路径配置
var path = {
// 静态资源输入路径
input: {
html: ['./src/*.html'],
css: ['./src/css/*.css'],
js: ['./src/js/*.js'],
images: ['./src/images/*'],
lib: ['./src/lib/**/*']
},
// 静态资源输出路径
output: {
html: './dist',
css: './dist/css',
js: './dist/js',
images: './dist/images',
lib: './dist/lib',
},
// manifest文件保存路径
rev:{
baseRev:'./rev',
css:'./rev/css',
js:'./rev/js',
images:'./rev/images'
}
};

5、编写gulp任务

 // 1、统一将html中的资源替换成压缩合并后的文件名并将HTML特定标签中的文件合并
gulp.task('html',function () {
var options = {
removeComments: true, //清除HTML注释
collapseWhitespace: true, //压缩HTML
removeScriptTypeAttributes: true, //删除<script>的type="text/javascript"
removeStyleLinkTypeAttributes: true, //删除<style>和<link>的type="text/css"
minifyJS: true, //压缩页面JS
minifyCSS: true //压缩页面CSS
};
return gulp.src(path.input.html)
.pipe(useref())
.pipe(htmlmin(options))
.pipe(gulp.dest(path.output.html))
})
// 2、删除掉上一步操作生成的css、js合并文件(因为在后面的添加版本号过程中也会生成,避免重复)
gulp.task('del',function () {
return gulp.src([path.output.css,path.output.js])
.pipe(clean());
});
// 2、css合并压缩并加版本号
gulp.task('css', function () {
return gulp.src(path.input.css)
.pipe(concat('all.min.css'))
.pipe(autoprefixer())
.pipe(cssnano())
.pipe(rev())
.pipe(gulp.dest(path.output.css))
.pipe(rev.manifest())
.pipe(gulp.dest(path.rev.css))
});
// 3、js合并压缩并加版本号
gulp.task('js', function () {
return gulp.src(path.input.js)
.pipe(concat('all.min.js')) // 合并
.pipe(babel({ // 转es5
presets: ['es2015']
}))
.pipe(uglify()) // 混淆
.pipe(rev())
.pipe(gulp.dest(path.output.js))
.pipe(rev.manifest())
.pipe(gulp.dest(path.rev.js))
});
// 4、图片压缩并加版本号
gulp.task('img', function () {
return gulp.src(path.input.images)
// .pipe(imagemin()) // 压缩图片
.pipe(rev())
.pipe(gulp.dest(path.output.images))
.pipe(rev.manifest())
.pipe(gulp.dest(path.rev.images))
});
// 5、给文件添加版本号,针对于已经替换引用路径的HTML文件,在dist目录下
gulp.task('rev', function () {
return gulp.src([path.rev.baseRev+'/**/*.json', path.output.html+'/**/*.html', path.output.html+'/**/*.css'])
.pipe(revCollector({
replaceReved: true, // 一定要添加,不然只能首次能成功添加hash
dirReplacements: {
'css': 'css/',
'js': 'js/',
'images': 'images/',
'lib': 'lib/',
}
}))
.pipe(gulp.dest('dist'));
}); // 6、复制其他库到构建目录(只要保持html和库的相对路径一致,就可以不用替换路径)
gulp.task('copy',function () {
return gulp.src(path.input.lib)
.pipe(gulp.dest(path.output.lib))
}); // 7、移除rev目录和dist构建目录
gulp.task('clean', function() {
return gulp.src(['./dist','./rev'])
.pipe(clean());
});
// 8、监控文件的改变,页面动态刷新
/*gulp.task('serve', function() {
browserSync.init({
port: 3000,
server: {
baseDir: ['./src/'], // 启动服务的目录 默认 index.html
index: 'index.html' // 自定义启动文件名
}
});
});*/
// 9、监控文件变化,自动重新构建
/*gulp.task('watch',function () {
gulp.watch('./src/!**!/!*', ['clean','html','del','css','js','img','rev','copy']);
})*/
// 9、build
gulp.task('default',function (callback) {
// sequence的作用是让所有任务同步执行,gulp默认的是异步执行
sequence('clean','html','del','css','js','img','rev','copy',function () {
console.log('构建完成');
})
})

好了,以上就是差不多比较全的配置了,gulp的话入门比较简单,一共就5个api,其他的都是一些插件来帮助我们实现强大的功能;

附上gulp的文档:gulp文档

另外还有不懂的小伙伴,欢迎留言哦!

前端gulp自动化构建配置的更多相关文章

  1. gulp自动化构建工具的使用

    gulp自动化构建工具: 把前端开发常见的处理(“搬砖”)程序,通过一个工具模块管理起来,只需配置一次,达到自动处理目的,简化开发,提高效率!! 安装: 1.全局安装(全局安装一个gulp命令) A. ...

  2. 亚信UED前端流程自动化构建工具

    亚信UED前端流程自动化构建工具 .wmd-input, .wmd-input:focus, #md-section-helper {font-size: 14px !important;line-h ...

  3. gulp 自动化构建html项目--自动刷新

    使用gulp自动化构建项目是前端学习的重要部分,gulp依赖于node.js.首选电脑要配置node和npm. 查看node版本号 node --version 查看npm 版本 npm --vers ...

  4. gulp自动化构建教程

    gulp及gulpfile.js编写示例    本文主要记录一个gulpfile.js示例,以免以后用的时候遗忘.但首先还是要了解gulp是什么以及如何使用. 一.什么是gulp 简单来说:就是压缩前 ...

  5. 前端项目自动化构建工具——Webpack入门教程

    参考资料:https://www.webpackjs.com/(中文文档)   https://www.webpackjs.com/(官方文档) 首先有必要说明一下,本文侧重讲解webpack基本配置 ...

  6. 构建前端gulp自动化

    看了很多关于Gulp自动化的相关教程,很感谢大神们的教程, 因为担心自己会忘记啥的,所以就把自己搭建gulp自动化的过程记录下来~~~ gulp是依赖于Nodejs的,所以最好是有点nodejs的基础 ...

  7. gulp自动化构建

    最近正在使用gulp去帮我自动化构建一些技术块,感觉很爽,所以把gulp操作步骤给写笔记,记录下来... 首先了解什么是gulp? 我的理解是一个工具并且自动化的,能帮你把一些前端技术的语法转换成当前 ...

  8. Gulp自动化构建的基本使用

    Study Notes 本博主会持续更新各种前端的技术,如果各位道友喜欢,可以关注.收藏.点赞下本博主的文章. Gulp 用自动化构建工具增强你的工作流程! gulp 将开发流程中让人痛苦或耗时的任务 ...

  9. Gulp(自动化构建工具 )

    前言 Gulp,简而言之,就是前端自动化开发工具,利用它,我们可以提高开发效率. 比如: 1.  压缩js 2.  压缩css 3.  压缩less 4.  压缩图片 等等… 我们完全可以利用Gulp ...

随机推荐

  1. jquery 图片自动切换

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. PHP开发学习门户第三版UI正式上线

    官网:http://www.phpthinking.com/ 论坛:http://bbs.phpthinking.com/ 迭代.迭代,似魔鬼的步伐.似魔鬼的步伐-- PHP开发学习门户第二版UI用了 ...

  3. TCP 中的Push flag 的作用

    发送方使用该标志通知接收方将所收到的数据全部提交给接收进程.这里的数据包括接收方已经接收放在接收缓存的数据和刚刚收到的PUSH位置一的TCP报文中封装的应用数据.还是看一个简单明了的图示吧:

  4. windows在与time.windows.com进行同步时出错

      windows在与time.windows.com进行同步时出错 CreateTime--2017年6月29日10:28:16Author:Marydon 参考地址:http://www.jb51 ...

  5. 点击div和某些控件之外的地方隐藏div,点击div不隐藏。对象 click和document click冲突有关问题

    帮朋友解决这个问题,我发现用以往想想像的方式来实现,貌似不太可行,所以从网上找了一些解决办法,进行优化,这篇比较详细,所以拿来备忘,另一方面也希望可以帮助需要的同学! 问题背景:jQuery事件问题! ...

  6. java 动态代理(模式) InvocationHandler(为类中方法执行前或后添加内容)

    动态代理属于Java反射的一种. 当我们得到一个对象,想动态的为其一些方法每次被调用前后追加一些操作时,我们将会用到java动态代理. 下边上代码: 首先定义一个接口: package com.liu ...

  7. 偏最小二乘回归(PLSR)- 1 概览

    1. 概览 偏最小二乘算法,因其仅仅利用数据X和Y中部分信息(partial information)来建模,所以得此名字.其总体处理框架体现在下面两图中. 建议先看第2部分,对pls算法有初步了解后 ...

  8. 【LeetCode】114. Flatten Binary Tree to Linked List

    Flatten Binary Tree to Linked List Given a binary tree, flatten it to a linked list in-place. For ex ...

  9. PHP权限控制(转)

    PHP: 我这里说到的权限管理办法是一个普遍采用的方法,主要是使用到"位运行符"操作,& 位与运算符.| 位或运行符.参与运算的如果是10进制数,则会被转换至2进制数参与运 ...

  10. jQuery通过text值来设置选定,以及遍历select的选项个数和遍历

    真是醉了,网上搜了很久,全都是千篇一律的. 大家都拷贝来拷贝去,全是错的. 通过text值来设置select选定 $("#CompanyID").find("option ...