Gulp——檔案壓縮和檔案指紋
上週還倒騰了一件事,就是使用gulp給專案的JS和CSS新增版本,主要是控制新版本檔案釋出時瀏覽器快取的問題,我看很多工具稱這中做法叫做新增“檔案指紋”,這裡也這樣叫好了,其中壓縮是新增指紋前的一個步驟。
先看下檔案指紋新增成功釋出後的“成果”。
首先介紹下gulp的檔案壓縮(壓縮css和js)
我的檔案目錄如下:
(標紅部分是生成的處理後的檔案)
Json裡面放這些外掛就夠了:
gulpfile.js配置檔案如下:{ "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" } }
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(){ //過程同CSS 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']); //“監控”index.css檔案的變化,如果發生變化就執行壓縮命令(可批量監控檔案,例如./**/*.css) gulp.watch('js/index.js',['minifyJs']); //“監控”index.js檔案的變化,如果發生變化就執行壓縮命令(可批量監控檔案,例如./**/*.js) })
ok了,可以執行watch監控檔案的變化實時執行,也可以分別執行minifyCss、minifyJs壓縮CSS、JS
壓縮前的CSS程式碼
/*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="[email protected]@hash"></script>
</head>
注意:<script src="[email protected]@hash"></script>此處src的路徑下的檔案是需要存在的,否則不會生成MD5值,原因如下:
gulpfile.js配置
var gulp = require('gulp'),
plugins = require('gulp-load-plugins')();
gulp.task('minifyJs',function(){ //過程同CSS
return gulp.src('js/index.js')
.pipe(plugins.concat('main.min.js'))
.pipe(plugins.uglify())
.pipe(gulp.dest('./')) //需要先生成檔案,否則rev-append()無效
})
gulp.task('htmlRouter',function() {
return gulp.src('index.html')
.pipe(plugins.revAppend()) //查詢[email protected]@hash字串,生成md5值
.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外掛,這個入門級的用法暫時介紹到這裡。
相關推薦
Gulp——檔案壓縮和檔案指紋
上週還倒騰了一件事,就是使用gulp給專案的JS和CSS新增版本,主要是控制新版本檔案釋出時瀏覽器快取的問題,我看很多工具稱這中做法叫做新增“檔案指紋”,這裡也這樣叫好了,其中壓縮是新增指紋前的一個
Linux 檔案壓縮和打包
1. 壓縮打包介紹 常見壓縮檔案 windows .rar .zip .7z Linux .zip, .gz, .bz2, .xz, .tar.gz, .tar.bz2, .tar.xz 2. gzip壓縮工具 2.1 Bullet Points ---- gz
Hive的壓縮和檔案儲存格式
1、壓縮 hive主要包括如下幾種壓縮:Snappy、LZ4/LZO、Gzip和Bzip2。 壓縮格式 壓縮比 檔案格式 檔案是否支援分割 Snappy 50% .
PHP 檔案壓縮和下載相關類的封裝
/** * 打包下載檔案 * @param Request $request * @param $id * */ public function upload_file(Request $request, $id) { $res = $this->obj->wher
javaweb通過介面來實現多個檔案壓縮和下載(包括單檔案下載,多檔案批量下載)
程式設計師在做web等專案的時候,往往都需要新增檔案上傳、下載、刪除的功能,有時是單檔案,有時多檔案批量 操作,而這些功能的程式碼程式設計師可以自己收藏起來當成工具使用,這樣,程式設計師在進行程式設計的時候就會事半功倍 了,那麼接下來的部落格將會介紹各個框架的檔案上傳和下
gulp-htmlmin(壓縮HTML檔案)
功能描述 html檔案壓縮,可以壓縮頁面javascript、css,去除頁面空格、註釋,刪除多餘屬性等操作。 安裝命令 $ cnpm install gulp-htmlmin --s
Linux中檔案的壓縮和檔案傳輸
1)檔案在系統中的傳輸 1 scp ##傳輸速度相對較慢,這屬於一個遠端複製的過程 scp file [email protected]:dir ##上傳 scp [email pr
linux檔案壓縮和壓縮常用命令小結
檔案壓縮和常用命令 zip是目前使用最多的文件壓縮格式。可以跨平臺使用,在linux,windows和mac os上均可使用,但是支援的壓縮率不是很高。 rar雖然普及率和速度上比zip略差一些,但是rar有更好的壓縮率,支援多卷壓縮檔案,比起zip的“跨磁碟”壓縮檔案更加
pyspark讀取檔案路徑 和 檔案
程式碼: #!/usr/bin/env python # -*- coding: utf-8 -*- # @author : 何小義 import sys reload(sys) import nerspark sys.setdefaultencoding('utf8') import
C++ 學習筆記之——檔案操作和檔案流
1. 檔案的概念 對於使用者來說,常用到的檔案有兩大類:程式檔案和資料檔案。而根據檔案中資料的組織方式,則可以將檔案分為 ASCII 檔案和二進位制檔案。 ASCII 檔案,又稱字元檔案或者文字檔案,它的每一個位元組放一個 ASCII 程式碼,代表一個字元。 二進位制檔案,又稱內部格式檔案或位元
檔案讀取和檔案寫入中需要注意的一些小知識
1, is_file()函式:用來判斷 是否是為檔案或者是否存在該檔案 is_dir()函式:用來判斷 是否為目錄(資料夾)或者是夠存在該目錄 file_exists(檔案路徑):作用是判斷對應的路徑下 是否存在對應的檔案 它們的區別是如果已經存在該檔案或者資料夾,
Ubuntu檔案系統和檔案管理
1、在命令列進行檔案管理 1.1複製檔案 cp a b #把a檔案複製到b中 1.2複製目錄 cp -r A B #把A目錄複製到B目錄中 1.3刪除檔案 rm a #刪
檔案包含和檔案上傳組合拳
Target www.xxxxx.com 資訊蒐集 (1)埠掃描 目標開放埠 略 (2)探測服務 80 web 8080 web 8088 web (3)路徑掃描 略 (4)漏洞探測 通過對web服務進行探測,發現8080埠存在檔案包含漏洞,查看回顯自動添加了page_字首和php字
IO流拷貝檔案目錄和檔案
package yn.ngems.cn; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.
python - 檔案系統和檔案
檔案系統和檔案 檔案系統是os用於明確磁碟或分割槽上的檔案的方法和資料結構--即在磁碟上組織檔案的方法 計算機檔案,是儲存在某種長
【Linux Shell指令碼攻略之一】find命令:檔案查詢和檔案列表
find是Unix/Linux命令列工具中最棒的工具之一。該命令對於編寫shell指令碼所起到的功能不可小視,但是多數人卻午飯最大程度發揮它的功效,下面介紹find一些常見的用法。 1.基本用法:
C++中檔案流和檔案的區分
1、檔案的概念 檔案一般是指儲存在外部介質上資料的集合。 外存檔案包括:磁碟檔案、光碟檔案和U盤檔案等,使用最廣泛呢的還是磁碟檔案。 對使用者來說,常用到的檔案有兩類:一類是程式檔案,如.cpp檔案、.obj檔案和.exe檔案。 一類是資料檔案(data
雲伺服器之間實時檔案同步和檔案備份的最簡單高效的免費方案
最新客戶端以後,安裝到Windows server上(目前還未支援Linux),然後執行客戶端登入(如果沒有使用者,可立即註冊一個),然後,如果還沒有組建雲,那麼就給自己的雲取一個名字進行建立(請參考博文),然後,給其他的每一個雲伺服器都註冊一個使用者,並新增為雲成員;最後,您可以根據自己的需要設定同步目錄
Linux查詢檔案內容和檔案位置
find / -amin -10 # 查詢在系統中最後10分鐘訪問的檔案 find / -atime -2 # 查詢在系統中最後48小時訪問的檔案 find / -empty # 查詢在系統中為空的檔案或者資料夾 find / -group cat # 查詢在
linux檔案目錄和檔案連結
linux目錄結構 linux的檔案目錄管理 / /home /root /dev /usr /etc /boot /lib /var /tmp /proc