使用gulp構(gòu)建前端自動化的方法示例
gulp是一個(gè)自動化構(gòu)建工具,開發(fā)者可以用它來自動執(zhí)行一些常見的任務(wù)。這里以我之前做的一個(gè)demo為例,簡要介紹如何使用gulp實(shí)現(xiàn)前端工程自動化。
項(xiàng)目結(jié)構(gòu)

其中src目錄下表示的是項(xiàng)目的源代碼,可以看到其中有l(wèi)ess、js、html等,而dist目錄則是保存的是gulp編譯后生成的代碼,相當(dāng)于生產(chǎn)環(huán)境。最后也最重要的是gulpfile.js,這個(gè)文件用于設(shè)置gulp相關(guān)的配置,類似于webpack中的webpack.config.js。
安裝
這里使用的gulp為v3.9.1,語法和最新的v4.x有所出入,想學(xué)習(xí)最新的gulp語法,可以參考gulp.js - The streaming build system 。
3.9.1 安裝如下:
npm install --save-dev gulp
語法
- gulp.task()用于定義一個(gè)gulp任務(wù),在命令行中可以使用gulp [任務(wù)名]開啟該任務(wù)。
- gulp.src()會返回符合匹配的文件流,可以被pipe()到其他插件中。
- gulp.dest():輸出所有數(shù)據(jù)。
- gulp.watch()用于監(jiān)測文件的變動。
實(shí)踐
在這個(gè)項(xiàng)目中,有一些常見的需求,這里使用gulp來實(shí)現(xiàn)自動化:
- less轉(zhuǎn)css
- css壓縮合并
- js壓縮合并
- 圖片壓縮
在gulpfile.js中首先需要導(dǎo)入gulp和一些常用的插件,本次demo使用到的插件如下:
var gulp = require('gulp'),
less = require('gulp-less'), //less 轉(zhuǎn) 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'); //創(chuàng)建web服務(wù)器
圖片壓縮
獲取到src下所有以.jpg或.png結(jié)尾的圖片,將其壓縮后輸出到dist目錄下。
gulp.task('dist:img', () => {
gulp.src(['./src/**/*.jpg', './src/**/*.png'])
.pipe(imagemin())
.pipe(gulp.dest('dist/'))
})
less壓縮合并為css
先清除已存在的css,然后將src下以.less結(jié)尾的文件通過less()轉(zhuǎn)為css文件,再通過csso()以及concat()實(shí)現(xiàn)對css的壓縮合并。
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壓縮合并
js壓縮合并的過程大同小異,增加了一個(gè)jshint()代碼審查的過程,它會將不符合規(guī)范的錯(cuò)誤代碼輸出到控制臺。
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/'))
});
less=>css
在開發(fā)過程中,因?yàn)閔tml不能直接引入.less文件,因此還需要生成開發(fā)環(huán)境的.css。
gulp.task('src:css', () => {
gulp.src('src/css/*.css').pipe(clean());
return gulp.src('./src/less/*.less')
.pipe(less())
.pipe(gulp.dest('src/css/'));
});
添加版本號
為了防止瀏覽器對文件進(jìn)行緩存,需要對文件添加版本號,保證每次獲取到的都是最新的代碼。
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生成一個(gè)文件名帶版本號的文件,例如本例中public.css生成public-5c001c53f6.css,然后分別輸出到不同的目錄下,最后生成一個(gè)rev-manifest.json文件,存儲了原文件和帶版本號文件之間的映射關(guān)系,如下:
{
"public.css": "public-5c001c53f6.css",
"public.js": "public-93c275a836.js"
}
在build中,先獲取到rev-manifest.json中的對象,然后利用revReplace()來替換版本號,再使用useref()來進(jìn)行資源的解析定位,最后輸出即可。
以引入js文件為例,源html文件中對文件的引入則要改寫為以下形式,即以注釋的形式寫入構(gòu)建后生成的文件路徑,如下:
<!-- 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>
具體的語法規(guī)則可以參見gulp-useref。
創(chuàng)建本地服務(wù)器并實(shí)現(xiàn)自動刷新
使用connet.server()來創(chuàng)建一個(gè)本地服務(wù)器,利用gulp.watch()來對src下的文件進(jìn)行監(jiān)測,如果發(fā)生變化,則執(zhí)行編譯less為css和刷新頁面的任務(wù)。
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。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
原生JavaScript實(shí)現(xiàn)Ajax的方法
這篇文章主要介紹了原生JavaScript實(shí)現(xiàn)Ajax的幾種方法,感興趣的小伙伴們可以參考一下2016-04-04
JavaScript Ajax實(shí)現(xiàn)異步通信
這篇文章主要為大家詳細(xì)介紹了JavaScript Ajax實(shí)現(xiàn)異步通信的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12
微信小程序以ssm做后臺開發(fā)的實(shí)現(xiàn)示例
這篇文章主要介紹了微信小程序以ssm做后臺開發(fā)的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
JS利用正則表達(dá)式實(shí)現(xiàn)簡單的密碼強(qiáng)弱判斷實(shí)例
這篇文章主要給大家介紹了關(guān)于JS利用正則表達(dá)式實(shí)現(xiàn)簡單的密碼強(qiáng)弱判斷的相關(guān)資料,實(shí)現(xiàn)后的效果非常簡單,但也挺實(shí)用的,文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),需要的朋友們下面來一起看看吧。2017-06-06
js實(shí)現(xiàn)用戶離開頁面前提示是否離開此頁面的方法(包括瀏覽器按鈕事件)
這篇文章主要介紹了js實(shí)現(xiàn)用戶離開頁面前提示是否離開此頁面的方法,較為詳細(xì)的分析了javascript針對瀏覽器事件的操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07
js實(shí)現(xiàn)限定區(qū)域范圍拖拉拽效果
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)限定區(qū)域范圍拖拉拽,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11
js與css實(shí)現(xiàn)彈出層覆蓋整個(gè)頁面的方法
這篇文章主要介紹了js與css實(shí)現(xiàn)彈出層覆蓋整個(gè)頁面的方法,分別以實(shí)例形式展示了彈出層覆蓋整個(gè)頁面的css樣式與js控制的實(shí)現(xiàn)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-12-12
JavaScript基于對象方法實(shí)現(xiàn)數(shù)組去重及排序操作示例
這篇文章主要介紹了JavaScript基于對象方法實(shí)現(xiàn)數(shù)組去重及排序操作,涉及javascript基于對象方法的數(shù)組遍歷、比較、去重、排序等相關(guān)操作技巧,需要的朋友可以參考下2018-07-07

