一般,js寫在單獨的文件,而後頁面引用js文件,好比javascript
<script type='text/javascript' src="a.js"></script>
在開發時或者上線後,你確定遇到過,明明修改了js,可是不起做用,由於瀏覽器緩存了舊js,只能狂摁ctrl+f5。爲了fix這個問題,一般會添加版本號。如css
<script type='text/javascript' src="a.js?2017080121231"></script>
這會帶來兩個問題html
知道了,靜態資源版本號的由來,咱們再確認一下優化目標,也能夠說是需求,前端
目標肯定後,打算從grunt/webpack/gulp中,選取一種實現功能。java
建立package.json,這是nodejs的配置文件node
npm init -y
大致目錄是這樣的webpack
{
"name": "myapp", "version": "1.0.0", "description": "", "main": "gulpfile.js", "dependencies": {}, "devDependencies": { "gulp": "^3.9.1", "gulp-clean": "^0.3.2", "gulp-clean-css": "^3.9.0", "gulp-jshint": "^2.0.4", "gulp-rename": "^1.2.2", "gulp-rev": "^7.1.2", "gulp-rev-collector": "^1.2.2", "gulp-uglify": "^3.0.0", "gulp-watch": "^4.3.11", "jshint": "^2.9.5", "pump": "^1.0.2", "run-sequence": "^2.2.0" }, "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC" }
能夠看見有個devDependencies,每安裝一個插件,這裏就添加一個,回頭提交時,只提交這個文件就能夠,團隊其餘人執行npm install
就能夠下載package.json中全部的dependencies。爲了接下來能順利執行,全部的依賴已經配置在devDependencies。web
gulpfile.js是gulp的配置文件,在裏邊能夠配置不少任務,每一個任務乾的活不同,每一個任務就是一個線程,若是任務之間有依賴,那麼須要指定執行順序。npm
根據設想,分爲src源文件目錄、dist目的文件目錄也就是編譯後後的目錄,rev就是revision修改版本意思,這裏存放着版本插件生成的json文件,裏邊的key值就是要替換文件的路徑json
D:\GULP_WORKSPACE\MYAPP
└─webapp
|---gulpfile.js ├─dist ├─rev │ ├─css │ └─js └─src ├─css ├─js │ ├─a │ └─b │ └─a.js └─pages └─a.html
其它的就很少說了,就是經常使用的幾個插件,思路就是將源文件的js、css根據內容生成添加了版本號的文件,而後搜索html文件,將名字替換爲版本號名字,而後將其它文件copy到目的目錄,還能夠監聽文件變化,若是變化自動執行任務,相似intellij的編譯後觸發熱替換,配置以下
//引入gulp和gulp插件 var gulp = require('gulp'), runSequence = require('run-sequence'), rev = require('gulp-rev'), revCollector = require('gulp-rev-collector'), rename = require('gulp-rename'), uglify = require('gulp-uglify'), clean = require('gulp-clean'), pump = require('pump'), watch = require('gulp-watch'), jshint = require('gulp-jshint') cleanCSS = require('gulp-clean-css');; //定義css、js源文件路徑 var cssSrc = 'src/**/*.css', jsSrc = ['src/**/*.js','!gulpfile*.js']; //監控文件變化 gulp.task('watch', function () { gulp.watch([jsSrc,cssSrc], ['default']); }); //檢查js語法 gulp.task('jslint', function() { return gulp.src(jsSrc) .pipe(jshint()) .pipe(jshint.reporter('default')); }); //清空目標文件 gulp.task('cleanDst', function () { return gulp.src(['dist','rev'], {read: false}) .pipe(clean()); }); //CSS生成文件hash編碼並生成 rev-manifest.json文件名對照映射 gulp.task('revCss', function(){ return gulp.src(cssSrc) .pipe(rev()) // 壓縮css .pipe(cleanCSS({compatibility: 'ie8'})) .pipe(gulp.dest('dist')) .pipe(rev.manifest()) .pipe(gulp.dest('rev/css')); }); //js生成文件hash編碼並生成 rev-manifest.json文件名對照映射 gulp.task('revJs', function(){ return gulp.src(jsSrc) .pipe(rev()) //壓縮 .pipe(uglify()) .pipe(gulp.dest('dist')) //生成rev-manifest.json .pipe(rev.manifest()) .pipe(gulp.dest('rev/js')); }); //Html替換css、js文件版本 gulp.task('revHtml', function () { return gulp.src(['rev/**/*.json', 'src/**/*.html']) .pipe(revCollector({ replaceReved: true })) .pipe(gulp.dest('dist')); }); // 將非js、非css移動到目標目錄 gulp.task('mvNotDealAsset', function () { return gulp.src(['src/**/*','!src/**/*.css', '!src/**/*.js','!src/**/*.html']) .pipe(gulp.dest('dist')); }); //開發構建 gulp.task('dev', function (done) { condition = false; runSequence( ['jslint'], ['cleanDst'], ['revCss'], ['revJs'], ['revHtml'], ['mvNotDealAsset'], ['watch'], done); }); gulp.task('default', ['dev']);
有時須要區分開發環境和正式環境,好比開發環境下,不須要壓縮、不要混淆,方便調試。而正式環境,須要壓縮、混淆、合併,減少文件大小。幸運的是,gulp提供了參數控制,
--env production --env development
好比
還有一塊沒寫,就是gulp與intellij的結合,intellij中tomcat啓動時,自動執行gulp任務,並監聽文件變化,這樣的話,開發時就不用狂摁ctrl+f5了
在html/jsp中爲引用的css、js根據內容信息摘要自動添加版本號,若是內容不變則維持原版本號。
<script type='text/javascript' src="a-1df23s4.js"></script>