先看下文件指纹添加成功发布后的“成果”。javascript

首先介绍下gulp的文件压缩(压缩css和js)css
(下面介绍的代码移步这里)html
个人文件目录以下:java

(标红部分是生成的处理后的文件)node
如何使用gulp,请移步这里(gulp详细入门)json
Json里面放这些插件就够了:gulp
- {
- "name": "test",
- "version": "1.0.0",
- "description": "文件压缩、文件指纹",
- "main": "gulpfile.js",
- "scripts": {
- "test": "echo \"Error: no test specified\" && exit 1"
- },
- "author": "小工匠",
- "license": "ISC",
- "devDependencies": {
- "gulp": "^3.9.1",
- "gulp-concat": "^2.6.0",
- "gulp-load-plugins": "^1.2.4",
- "gulp-minify-css": "^1.2.4",
- "gulp-uglify": "^1.5.4"
- }
- }
gulpfile.js配置文件以下:浏览器
- var gulp = require('gulp'),
- plugins = require('gulp-load-plugins')();
-
- gulp.task('minifyCss',function() {
- return gulp.src('css/index.css')
- .pipe(plugins.concat('style.min.css'))
- .pipe(plugins.minifyCss())
- .pipe(gulp.dest('./'));
- })
- gulp.task('minifyJs',function(){
- return gulp.src('js/index.js')
- .pipe(plugins.concat('main.min.js'))
- .pipe(plugins.uglify())
- .pipe(gulp.dest('./'));
- })
- gulp.task('watch',function() {
- gulp.watch('css/index.css',['minifyCss']);
- gulp.watch('js/index.js',['minifyJs']);
- })
ok了,能够执行watch监控文件的变化实时执行,也能够分别执行minifyCss、minifyJs压缩CSS、JS缓存
压缩前的CSS代码app
- /*create by cc*/
- body{
- margin: 0;
- padding: 0;
- /*font-family: '宋体';*/
- }
- .main{
- width: 100%;
- }
- .head{
- width: 80%;
- height: 100px;
- margin: 0 auto;
- background: rgba(7, 95,184, 0.5)
- }
- .body{
- width: 80%;
- height: 200px;
- margin: 0 auto;
- background: rgba(239, 228, 176, 0.6)
- }
- .footer{
- width: 80%;
- height: 100px;
- margin:0 auto;
- background: green;
- }
压缩后的CSS代码
- body{margin:0;padding:0}.main{width:100%}.body,.footer,.head{width:80%;margin:0 auto}.head{height:100px;background:rgba(7,95,184,.5)}.body{height:200px;background:rgba(239,228,176,.6)}.footer{height:100px;background:green}
gulpfile文件的配置意义注释的很清晰了。
其次,文件指纹添加。
平时在开发中老是会遇到这样的问题。本身的代码可能有一些小的问题,本身一眼就确认问题所在,可是修改事后却得不到本身想要的结果,而后纠结半天,最后清一下浏览器缓存,发现都是缓存惹的祸。做为开发者你能够找出这样的缘由,可是若是是普通的用户的话,反馈来的问题可能就是这么一个缓存的问题致使不愉快的用户体验。为此,为项目文件添加版本号,清除页面引用缓存,是比较合适合理的,由于你总不可能每次发布更新都要求用户去像开发者那样强刷浏览器吧?
下面介绍三种本身尝试过的添加文件指纹的方法:
第一种:
须要增长的插件:
- "gulp-rev": "^7.1.0",
- "gulp-rev-collector": "^1.0.5"
以修改js名称为例
- gulp.task('minifyJs',function(){ //过程同CSS
- return gulp.src('js/index.js')
- .pipe(plugins.concat('main.min.js'))
- .pipe(plugins.uglify())
- .pipe(plugins.rev()) //为main.min.js增长10位的随机hash值
- .pipe(gulp.dest('./')) //输出修更名称后的文件
- .pipe(plugins.rev.manifest()) //将生成与文件对应的键值对
- .pipe(gulp.dest('rev/js')) //键值对输出
-
- })
- gulp.task('htmlRouter',function() {
- return gulp.src(['rev/**/*.json','index.html']) //
- .pipe(plugins.revCollector()) //替换引入的文件,将修更名称后的文件引入
- .pipe(gulp.dest('./'))
- })
生成的键值对:
- {
- "main.min.js": "main-336a363e91.min.js"
- }
修改文件名称后生成的文件名:

Index.html引入路径的变化:
- <head>
- <meta charset="UTF-8">
- <title>gulp</title>
- <link rel="stylesheet" href="style.min.css">
- <script src="main-336a363e91.min.js"></script>
- </head>
执行后能够看到已经作了版本的修改:

第二种:
修改第一种方法的文件配置,将形式一变成形式二
形式一
- "main.min.js": "main-336a363e91.min.js"
形式二
- "main.min.js": "main.min.js?v=336a363e91"
替换的文件分别是:
- gulp-rev\index.js
- gulp-rev\node_modules\rev-path\index.js
- gulp-rev-collector\index.js
替换文件请移步这里
分别替换这几个文件便可,
将gulpfile.js的配置仍然同上,执行代码后的结果
生成的键值对:
- {
- "main.min.js": "main.min.js?v=336a363e91"
- }
文件的名称不会改变:

Index.html引入路径的变化:
- <head>
- <meta charset="UTF-8">
- <title>gulp</title>
- <link rel="stylesheet" href="style.min.css">
- <script src="main.min.js?v=336a363e91"></script>
- </head>
执行后能够看到已经作了版本的修改:

第三种:使用append
gulp-rev-append 插件将经过正则
- FILE_DECL=/(?:href=|src=|url\()['|"]([^\s>"']+?)\?rev=([^\s>"']+?)['|"]/gi;
查找并给指定连接填加版本号(默认根据文件MD5生成,所以文件未发生改变,此版本号将不会变)
须要增长的插件
- "gulp-rev-append":"^0.1.6"
html引用的方式以下:
- <head>
- <meta charset="UTF-8">
- <title>gulp</title>
- <link rel="stylesheet" href="style.min.css">
- <script src="main.min.js?rev=@@hash"></script>
- </head>
注意:<script src="main.min.js?rev=@@hash"></script>此处src的路径下的文件是须要存在的,不然不会生成MD5值,缘由以下:

gulpfile.js配置
- var gulp = require('gulp'),
- plugins = require('gulp-load-plugins')();
-
- gulp.task('minifyJs',function(){
- return gulp.src('js/index.js')
- .pipe(plugins.concat('main.min.js'))
- .pipe(plugins.uglify())
- .pipe(gulp.dest('./'))
-
-
- })
- gulp.task('htmlRouter',function() {
- return gulp.src('index.html')
- .pipe(plugins.revAppend())
- .pipe(gulp.dest('./'))
- })
执行后的目录结构:

执行后的文件指纹发生变化:
- <head>
- <meta charset="UTF-8">
- <title>gulp</title>
- <link rel="stylesheet" href="style.min.css">
- <script src="main.min.js?rev=336a363e914f0a93aaa403dedf1c7b27"></script>
- </head>
执行后能够看到已经作了版本的修改:

总结:这几种方式均可以保证生产环境文件的惟一性,解决浏览器缓存等问题。
后话:由于这些都是本身在实际项目中尝试过的方式,写博文的时候不方便还原,因此用了简单的demo来作测试用,可是根据实际的项目来作状况会复杂不少,好比生成的文件重复、文件路径没法替换等,这些都须要使用到其余的gulp插件,这个入门级的用法暂时介绍到这里。