先看下文件指紋添加成功發佈後的「成果」。javascript
![](http://static.javashuo.com/static/loading.gif)
首先介紹下gulp的文件壓縮(壓縮css和js)css
(下面介紹的代碼移步這裏)html
個人文件目錄以下:java
![](http://static.javashuo.com/static/loading.gif)
(標紅部分是生成的處理後的文件)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"
- }
修改文件名稱後生成的文件名:
![](http://static.javashuo.com/static/loading.gif)
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>
執行後能夠看到已經作了版本的修改:
![](http://static.javashuo.com/static/loading.gif)
第二種:
修改第一種方法的文件配置,將形式一變成形式二
形式一
- "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"
- }
文件的名稱不會改變:
![](http://static.javashuo.com/static/loading.gif)
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>
執行後能夠看到已經作了版本的修改:
![](http://static.javashuo.com/static/loading.gif)
第三種:使用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值,緣由以下:
![](http://static.javashuo.com/static/loading.gif)
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('./'))
- })
執行後的目錄結構:
![](http://static.javashuo.com/static/loading.gif)
執行後的文件指紋發生變化:
- <head>
- <meta charset="UTF-8">
- <title>gulp</title>
- <link rel="stylesheet" href="style.min.css">
- <script src="main.min.js?rev=336a363e914f0a93aaa403dedf1c7b27"></script>
- </head>
執行後能夠看到已經作了版本的修改:
![](http://static.javashuo.com/static/loading.gif)
總結:這幾種方式均可以保證生產環境文件的惟一性,解決瀏覽器緩存等問題。
後話:由於這些都是本身在實際項目中嘗試過的方式,寫博文的時候不方便還原,因此用了簡單的demo來作測試用,可是根據實際的項目來作狀況會複雜不少,好比生成的文件重複、文件路徑沒法替換等,這些都須要使用到其餘的gulp插件,這個入門級的用法暫時介紹到這裏。