gulp是一個自動化構建工具,開發者能夠用它來自動執行一些常見的任務。這裏以我以前作的一個demo爲例,簡要介紹如何使用gulp實現前端工程自動化。css
其中src
目錄下表示的是項目的源代碼,能夠看到其中有less、js、html等,而dist
目錄則是保存的是gulp
編譯後生成的代碼,至關於生產環境。最後也最重要的是gulpfile.js
,這個文件用於設置gulp
相關的配置,相似於webpack
中的webpack.config.js
。html
這裏使用的gulp
爲v3.9.1,語法和最新的v4.x有所出入,想學習最新的gulp
語法,能夠參考gulp.js - The streaming build system 。前端
3.9.1 安裝以下:jquery
npm install --save-dev gulp
複製代碼
gulp.task()
用於定義一個gulp
任務,在命令行中可使用gulp [任務名]
開啓該任務。gulp.src()
會返回符合匹配的文件流,能夠被pipe()
到其餘插件中。gulp.dest()
:輸出全部數據。gulp.watch()
用於監測文件的變更。在這個項目中,有一些常見的需求,這裏使用gulp
來實現自動化:webpack
在gulpfile.js
中首先須要導入gulp
和一些經常使用的插件,本次demo使用到的插件以下:git
var gulp = require('gulp'),
less = require('gulp-less'), //less 轉 css
csso = require('gulp-csso'), //css壓縮
concat = require('gulp-concat'), //合併文件
uglify = require('gulp-uglify'), //js 壓縮
jshint = require('gulp-jshint'), //js 檢查
clean = require('gulp-clean'), //清除文件
imagemin = require('gulp-imagemin'), //圖片壓縮
rev = require('gulp-rev'), //添加版本號
revReplace = require('gulp-rev-replace'), //版本號替換
useref = require('gulp-useref'), //解析html資源定位
gulpif = require('gulp-if'), //if語句
connect = require('gulp-connect'); //建立web服務器
複製代碼
獲取到src
下全部以.jpg
或.png
結尾的圖片,將其壓縮後輸出到dist
目錄下。github
gulp.task('dist:img', () => {
gulp.src(['./src/**/*.jpg', './src/**/*.png'])
.pipe(imagemin())
.pipe(gulp.dest('dist/'))
})
複製代碼
先清除已存在的css,而後將src
下以.less
結尾的文件經過less()
轉爲css文件,再經過csso()
以及concat()
實現對css的壓縮合並。web
gulp.task('dist:css', () => {
gulp.src('dist/css/*.css').pipe(clean());
return gulp.src('./src/less/*.less')
.pipe(less())
.pipe(csso())
.pipe(concat('public.css'))
.pipe(gulp.dest('dist/css/'));
});
複製代碼
js壓縮合並的過程大同小異,增長了一個jshint()
代碼審查的過程,它會將不符合規範的錯誤代碼輸出到控制檯。npm
gulp.task('dist:js', () => {
gulp.src('dist/js/*.js').pipe(clean());
return gulp.src('./src/js/*.js')
.pipe(jshint())
.pipe(jshint.reporter('default'))
.pipe(uglify())
.pipe(concat('public.js'))
.pipe(gulp.dest('dist/js/'))
});
複製代碼
在開發過程當中,由於html
不能直接引入.less
文件,所以還須要生成開發環境的.css
。json
gulp.task('src:css', () => {
gulp.src('src/css/*.css').pipe(clean());
return gulp.src('./src/less/*.less')
.pipe(less())
.pipe(gulp.dest('src/css/'));
});
複製代碼
爲了防止瀏覽器對文件進行緩存,須要對文件添加版本號,保證每次獲取到的都是最新的代碼。
gulp.task('revision', ['dist:css', 'dist:js'], () => {
return gulp.src(["dist/css/*.css", "dist/js/*.js"])
.pipe(rev())
.pipe(gulpif('*.css', gulp.dest('dist/css'), gulp.dest('dist/js')))
.pipe(rev.manifest())
.pipe(gulp.dest('dist'))
})
gulp.task('build', ['dist:img'], () => {
var manifest = gulp.src('dist/rev-manifest.json');
return gulp.src('src/index.html')
.pipe(revReplace({
manifest: manifest
}))
.pipe(useref())
.pipe(gulp.dest('dist/'))
})
複製代碼
在revision
中,首先經過rev()
對dist
目錄下的.css/.js
生成一個文件名帶版本號的文件,例如本例中public.css
生成public-5c001c53f6.css
,而後分別輸出到不一樣的目錄下,最後生成一個rev-manifest.json
文件,存儲了原文件和帶版本號文件之間的映射關係,以下:
{
"public.css": "public-5c001c53f6.css",
"public.js": "public-93c275a836.js"
}
複製代碼
在build
中,先獲取到rev-manifest.json
中的對象,而後利用revReplace()
來替換版本號,再使用useref()
來進行資源的解析定位,最後輸出便可。
以引入js文件爲例,源html文件中對文件的引入則要改寫爲如下形式,即以註釋的形式寫入構建後生成的文件路徑,以下:
<!-- build:js ./js/public.js -->
<script src="./js/jquery-1.12.4.min.js"></script>
<script src="./js/myAlbum.js"></script>
<!-- endbuild -->
複製代碼
最後生成的html爲:
<script src="./js/public-93c275a836.js"></script>
複製代碼
具體的語法規則能夠參見gulp-useref。
使用connet.server()
來建立一個本地服務器,利用gulp.watch()
來對src
下的文件進行監測,若是發生變化,則執行編譯less
爲css
和刷新頁面的任務。
gulp.task('connect', () => {
connect.server({
root: 'src',
livereload: true,
port: 8888
})
})
gulp.task('reload', () => {
gulp.src('src/*.html')
.pipe(connect.reload())
})
gulp.task('watch', () => {
gulp.watch('src/**/*', ['src:css', 'reload'])
})
複製代碼
完整的代碼能夠參見github。
原文地址: