Gulp——文件壓縮和文件指紋

先看下文件指紋添加成功發布后的“成果”。

?

首先介紹下gulp的文件壓縮(壓縮css和js)

(下面介紹的代碼移步這里)

我的文件目錄如下:

(標紅部分是生成的處理后的文件)

如何使用gulp,請移步這里(gulp詳細入門)

Json里面放這些插件就夠了:

[plain]?view plaincopy
  1. {??
  2. ??"name":?"test",??
  3. ??"version":?"1.0.0",??
  4. ??"description":?"文件壓縮、文件指紋",??
  5. ??"main":?"gulpfile.js",??
  6. ??"scripts":?{??
  7. ????"test":?"echo?\"Error:?no?test?specified\"?&&?exit?1"??
  8. ??},??
  9. ??"author":?"小工匠",??
  10. ??"license":?"ISC",??
  11. ??"devDependencies":?{??
  12. ????"gulp":?"^3.9.1",??
  13. ????"gulp-concat":?"^2.6.0",??
  14. ????"gulp-load-plugins":?"^1.2.4",??
  15. ????"gulp-minify-css":?"^1.2.4",??
  16. ????"gulp-uglify":?"^1.5.4"??
  17. ??}??
  18. }??

gulpfile.js配置文件如下:

?

[javascript]?view plaincopy
  1. var?gulp?=?require('gulp'),??
  2. ????plugins?=?require('gulp-load-plugins')();??
  3. ??
  4. gulp.task('minifyCss',function()?{??
  5. ????return?gulp.src('css/index.css')????????????????????//輸入??
  6. ????????????.pipe(plugins.concat('style.min.css'))??????//合并(輸入的文件有多個時或合并成一個)??
  7. ????????????.pipe(plugins.minifyCss())??????????????????//壓縮??
  8. ????????????.pipe(gulp.dest('./'));?????????????????????//輸出??
  9. })??
  10. gulp.task('minifyJs',function(){????????????????????????//過程同CSS??
  11. ????return?gulp.src('js/index.js')??
  12. ????????????.pipe(plugins.concat('main.min.js'))??
  13. ????????????.pipe(plugins.uglify())??
  14. ????????????.pipe(gulp.dest('./'));??
  15. })??
  16. gulp.task('watch',function()?{??
  17. ????????????gulp.watch('css/index.css',['minifyCss']);??//“監控”index.css文件的變化,如果發生變化就執行壓縮命令(可批量監控文件,例如./**/*.css)??
  18. ????????????gulp.watch('js/index.js',['minifyJs']);?????//“監控”index.js文件的變化,如果發生變化就執行壓縮命令(可批量監控文件,例如./**/*.js)??
  19. })??

?

?

ok了,可以執行watch監控文件的變化實時執行,也可以分別執行minifyCss、minifyJs壓縮CSS、JS

?

壓縮前的CSS代碼

?

?

[html]?view plaincopy
  1. /*create?by?cc*/??
  2. body{??
  3. ????margin:?0;??
  4. ????padding:?0;??
  5. ????/*font-family:?'宋體';*/??
  6. }??
  7. .main{??
  8. ????width:?100%;??
  9. }??
  10. .head{??
  11. ????width:?80%;??
  12. ????height:?100px;??
  13. ????margin:?0?auto;??
  14. ????background:?rgba(7,?95,184,?0.5)??
  15. }??
  16. .body{??
  17. ????width:?80%;??
  18. ????height:?200px;??
  19. ????margin:?0?auto;??
  20. ????background:?rgba(239,?228,?176,?0.6)??
  21. }??
  22. .footer{??
  23. ????width:?80%;??
  24. ????height:?100px;???
  25. ????margin:0?auto;???
  26. ????background:?green;??
  27. }??


壓縮后的CSS代碼

?

?

[css]?view plaincopy
  1. 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文件的配置意義注釋的很清晰了。

?

?

其次,文件指紋添加。

平時在開發中總是會遇到這樣的問題。自己的代碼可能有一些小的問題,自己一眼就確認問題所在,但是修改過后卻得不到自己想要的結果,然后糾結半天,最后清一下瀏覽器緩存,發現都是緩存惹的禍。作為開發者你可以找出這樣的原因,但是如果是普通的用戶的話,反饋來的問題可能就是這么一個緩存的問題導致不愉快的用戶體驗。為此,為項目文件添加版本號,清除頁面引用緩存,是比較合適合理的,因為你總不可能每次發布更新都要求用戶去像開發者那樣強刷瀏覽器吧?

下面介紹三種自己嘗試過的添加文件指紋的方法:

第一種:

需要增加的插件:

[html]?view plaincopy
  1. "gulp-rev":?"^7.1.0",??
  2. ?"gulp-rev-collector":?"^1.0.5"??

?

以修改js名稱為例

[html]?view plaincopy
  1. gulp.task('minifyJs',function(){????????????????????????//過程同CSS??
  2. ????return?gulp.src('js/index.js')??
  3. ????????????.pipe(plugins.concat('main.min.js'))??
  4. ????????????.pipe(plugins.uglify())??
  5. ????????????.pipe(plugins.rev())????????????????????????//為main.min.js增加10位的隨機hash值??
  6. ????????????.pipe(gulp.dest('./'))??????????????????????//輸出修改名稱后的文件??
  7. ????????????.pipe(plugins.rev.manifest())???????????????//將生成與文件對應的鍵值對??
  8. ????????????.pipe(gulp.dest('rev/js'))??????????????????//鍵值對輸出??
  9. ??
  10. })??
  11. gulp.task('htmlRouter',function()?{??
  12. ????return?gulp.src(['rev/**/*.json','index.html'])??????//??
  13. ????????????.pipe(plugins.revCollector())????????????????//替換引入的文件,將修改名稱后的文件引入??
  14. ????????????.pipe(gulp.dest('./'))??
  15. })??

生成的鍵值對:

?

[html]?view plaincopy
  1. {??
  2. ??"main.min.js":?"main-336a363e91.min.js"??
  3. }??

?

?

修改文件名稱后生成的文件名:

Index.html引入路徑的變化:

[html]?view plaincopy
  1. <head>??
  2. ????<meta?charset="UTF-8">??
  3. ????<title>gulp</title>??
  4. ????<link?rel="stylesheet"?href="style.min.css">??
  5. ????<script?src="main-336a363e91.min.js"></script>??
  6. </head>??

執行后可以看到已經做了版本的修改:

第二種:

修改第一種方法的文件配置,將形式一變成形式二

形式一

?

[html]?view plaincopy
  1. "main.min.js":?"main-336a363e91.min.js"??

?

形式二

?

[html]?view plaincopy
  1. "main.min.js":?"main.min.js?v=336a363e91"??

?

替換的文件分別是:

?

?

[html]?view plaincopy
  1. gulp-rev\index.js??
  2. gulp-rev\node_modules\rev-path\index.js??
  3. gulp-rev-collector\index.js??

?

替換文件請移步這里

分別替換這幾個文件即可,

將gulpfile.js的配置仍然同上,執行代碼后的結果

生成的鍵值對:

?

[html]?view plaincopy
  1. {??
  2. ?"main.min.js":?"main.min.js?v=336a363e91"??
  3. }??

?

?

文件的名稱不會改變:

?

Index.html引入路徑的變化:

?

[html]?view plaincopy
  1. <head>??
  2. ???<meta?charset="UTF-8">??
  3. ???<title>gulp</title>??
  4. ???<link?rel="stylesheet"?href="style.min.css">??
  5. ???<script?src="main.min.js?v=336a363e91"></script>??
  6. </head>??

?

執行后可以看到已經做了版本的修改:

?

第三種:使用append

gulp-rev-append 插件將通過正則

?

[html]?view plaincopy
  1. FILE_DECL=/(?:href=|src=|url\()['|"]([^\s>"']+?)\?rev=([^\s>"']+?)['|"]/gi;??

?

?

查找并給指定鏈接填加版本號(默認根據文件MD5生成,因此文件未發生改變,此版本號將不會變)

需要增加的插件

?

[html]?view plaincopy
  1. "gulp-rev-append":"^0.1.6"??

?

?

html引用的方式如下:

?

[html]?view plaincopy
  1. <head>??
  2. ???<meta?charset="UTF-8">??
  3. ???<title>gulp</title>??
  4. ???<link?rel="stylesheet"?href="style.min.css">??
  5. ???<script?src="main.min.js?rev=@@hash"></script>??
  6. </head>??

?

注意:<script src="main.min.js?rev=@@hash"></script>此處src的路徑下的文件是需要存在的,否則不會生成MD5值,原因如下:

?

gulpfile.js配置

[javascript]?view plaincopy
  1. var?gulp?=?require('gulp'),??
  2. ????plugins?=?require('gulp-load-plugins')();??
  3. ??
  4. gulp.task('minifyJs',function(){????????????????????????//過程同CSS??
  5. ????return?gulp.src('js/index.js')??
  6. ????????????.pipe(plugins.concat('main.min.js'))??
  7. ????????????.pipe(plugins.uglify())??
  8. ????????????.pipe(gulp.dest('./'))?????????????????????//需要先生成文件,否則rev-append()無效??
  9. ?????????????
  10. ??
  11. })??
  12. gulp.task('htmlRouter',function()?{??
  13. ????return?gulp.src('index.html')???????
  14. ????????????.pipe(plugins.revAppend())?????????????????//查找?rev=@@hash字符串,生成md5值??????????
  15. ????????????.pipe(gulp.dest('./'))??
  16. })??

?

執行后的目錄結構:

?

執行后的文件指紋發生變化:

?

[html]?view plaincopy
  1. <head>??
  2. ???<meta?charset="UTF-8">??
  3. ???<title>gulp</title>??
  4. ???<link?rel="stylesheet"?href="style.min.css">??
  5. ???<script?src="main.min.js?rev=336a363e914f0a93aaa403dedf1c7b27"></script>??
  6. </head>??

?

執行后可以看到已經做了版本的修改:

?

總結:這幾種方式都可以保證生產環境文件的唯一性,解決瀏覽器緩存等問題。

?

后話:因為這些都是自己在實際項目中嘗試過的方式,寫博文的時候不方便還原,所以用了簡單的demo來做測試用,但是根據實際的項目來做情況會復雜很多,比如生成的文件重復、文件路徑無法替換等,這些都需要使用到其他的gulp插件,這個入門級的用法暫時介紹到這里。

轉載于:https://www.cnblogs.com/wangking/p/7001986.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370364.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370364.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370364.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java afconsole_Java ——基礎語法

package myhello; //本類所在的包的路徑import af.util.AfMath;//導入對應的類import java.util.Random;//導入隨機數的類public classHelloWorld{public static voidmain(String[] args){int a 8;inti;int total 0;int score 80;System.out.println(a > 8);//空語句 只有…

Java 7:使用NIO.2進行文件過濾-第2部分

大家好。 這是使用NIO.2系列進行文件過濾的第2部分。 對于那些尚未閱讀第1部分的人 &#xff0c;這里有個回顧。 NIO.2是自Java 7起JDK中包含的用于I / O操作的新API。使用此新API&#xff0c;您可以執行與java.io相同的操作&#xff0c;以及許多出色的功能&#xff0c;例如&a…

js for 循環 添加tr td 算法

StringBuffer sbnew StringBuffer(); int n 5; sb.append("<tr>"); List<MenuBean> chs mb.getChildren(); for(int j 0; chs ! null && j < chs.size(); j){ MenuBean _mb2 chs.get(j); if (i % n 0)//被n整除&#xff0c;即有了n列之后…

1034. 二哥的金鏈

Description 一個陽光明媚的周末&#xff0c;二哥出去游山玩水&#xff0c;然而粗心的二哥在路上把錢包弄丟了。傍晚時分二哥來到了一家小旅店&#xff0c;他翻便全身的口袋也沒翻著多少錢&#xff0c;而他身上唯一值錢的就是一條漂亮的金鏈。這條金鏈散發著奇異的光澤&#xf…

課時76.兄弟選擇器(掌握)

我們先來明確一點&#xff0c;什么是兄弟&#xff1f; 比如&#xff0c;head和body是兄弟&#xff0c;必須是同級關系&#xff0c;如果是嵌套關系&#xff0c;兒子&#xff0c;孫子則不可以。 1.相鄰兄弟選擇器 CSS2 作用&#xff1a;給指定選擇器后面緊跟的那個選擇器選中的…

java中不能定義為變量名稱_Java,“變量名”不能解析為變量

我使用Java使用Eclipse&#xff0c;出現此錯誤&#xff1a;"Variable name" cannot be resolved to a variable.使用此Java程序&#xff1a;public class SalCal {private int hoursWorked;public SalCal(String name, int hours, double hoursRate) {nameEmployee …

24v開關電源維修技巧_康佳LED液晶彩電KPS+L1900C301電源板原理與維修

康佳液晶彩電采用的KPSL1900C3-01型電源板&#xff0c;編號為34007728&#xff0c;版本號為35015686集成電路采用FAN7530FSGM300FSFR1700組合方案&#xff0c;輸出5.1VSB/4A、24V/4A、12V/4A電壓。應用于康佳LED47IS988PD、LED42M11PD、LED46MS92DC、LED42IS988PDE、LED42X5000…

zookeeper集群 新手安裝指南

Zookeeper集群的角色&#xff1a; Leader 和 follower &#xff08;Observer&#xff09;zk集群最好配成奇數個節點只要集群中有半數以上節點存活&#xff0c;集群就能提供服務本事例采用版本:zookeeper-3.4.5 虛擬機:zk1 zk2 zk3/****************************************…

Google Guava并發– ListenableFuture

在上一篇文章中&#xff0c;我介紹了使用番石榴庫中com.google.common.util.concurrent包中的Monitor類。 在本文中&#xff0c;我將繼續介紹Guava并發實用程序&#xff0c;并討論ListenableFuture接口。 ListenableFuture通過添加接受完成偵聽器的方法&#xff0c;從java.util…

課時71.后代選擇器(掌握)

1.什么是后代選擇器&#xff1f; 作用&#xff1a;找到指定標簽的所有后代標簽&#xff0c;設置屬性。 首先你要明確什么是后代&#xff1f; 你的兒子&#xff0c;孫子&#xff0c;重孫子等&#xff0c;只要有你的血脈的&#xff0c;都是你的后代。 我們先來舉個例子 我們想…

java小球碰撞界面設計_JavaScript實現小球碰撞特效

JavaScript實現小球碰撞特效。類似自由落體運動。實現原理非常簡單&#xff0c;就是動態的改變每個元素的坐標。使用radius屬性將圖片圓角化。使用left&#xff0c;top屬性動態的改變小球的位置。碰撞反彈球&#xff0c;當碰撞到容器的邊緣后&#xff0c;進行反彈&#xff0c;反…

es6常用基礎合集

es6常用基礎合集 在實際開發中&#xff0c;ES6已經非常普及了。掌握ES6的知識變成了一種必須。盡管我們在使用時仍然需要經過babel編譯。 ES6徹底改變了前端的編碼風格&#xff0c;可以說對于前端的影響非常巨大。值得高興的是&#xff0c;如果你熟悉ES5&#xff0c;學習ES6并不…

java接口開發_如果你想學好Java,這些你需要了解

01基本知識  在學習Java之前&#xff0c;您需要了解計算機的基本知識&#xff0c;然后再學習Java。同時&#xff0c;您需要熟悉DOS命令、Java概述、JDK環境安裝配置、環境變量配置。JDK和環境變量配置完成后&#xff0c;就可以編寫Java程序了。02編程格式  此時&#xff0c…

從Java程序生成QR碼圖像

如果您精通技術和小工具&#xff0c;則必須了解QR碼。 這些天&#xff0c;到處都可以找到它-在博客&#xff0c;網站&#xff0c;甚至在某些公共場所。 這在移動應用程序中非常流行&#xff0c;在移動應用程序中&#xff0c;您可以使用QR Code掃描儀應用程序掃描QR Code&#x…

LintCode-最長公共子串

給出兩個字符串&#xff0c;找到最長公共子串。并返回其長度。 您在真實的面試中是否遇到過這個題&#xff1f; Yes例子 給出A“ABCD”&#xff0c;B“CBCE”&#xff0c;返回 2 注意 子串的字符應該連續的出如今原字符串中&#xff0c;這與子序列有所不同。標簽 Expand 相關…

課時67.標簽選擇器(掌握)

通過上節課的學習我們明白了如何通過十六進制來表示顏色 例如&#xff1a;紅色的幾種表示方法 我們發現在學習CSS當中的一些屬性的時候&#xff0c;它都有一些套路 只要知道屬性的名稱&#xff0c;屬性有什么作用&#xff0c;它有哪些取值&#xff0c;這個屬性有什么注意點 …

計算幾何問題 java_【轉載】ACM計算幾何題目推薦

2107 Quoit Design 典型最近點對問題POJ 3714 Raid 變種最近點對問題B&#xff0c;最小包圍圓最小包圍圓的算法是一種增量算法&#xff0c;期望是O(n)。ZOJ 1450 Minimal CircleHDU 3007 Buried memoryC&#xff0c;旋轉卡殼POJ 3608 Bridge Acr…

jdbc連接oracle的幾種格式

1. SID的方式。已經不推薦使用這種方式了。 jdbc:oracle:thin:[<user>/<password>]<host>[:<port>]:<SID> 2.Service Name的方式。 jdbc:oracle:thin:[<user>/<password>]//<host>[:<port>]/<service> 3.TNSNames…

Java 7:使用NIO.2進行文件過濾-第1部分

NIO.2是自Java 7起JDK中包含的用于I / O操作的新API。使用此新API&#xff0c;您可以執行與 java.io以及許多出色的功能&#xff0c;例如&#xff1a;訪問文件元數據和監視目錄更改等。 顯然&#xff0c;由于向后兼容&#xff0c;java.io包不會消失&#xff0c;但是我們鼓勵為…

第十三周活動進度表

學習進度表&#xff1a; 第三周內容時間周一&#xff08;4&#xff1a;10-6&#xff1a;00&#xff09;上課&#xff0c;周二晚上&#xff08;8&#xff1a;00-9&#xff1a;00&#xff09;&#xff0c;周四晚上&#xff08;8&#xff1a;00-8&#xff1a;30&#xff09;&#…