gulp實(shí)現(xiàn)自動(dòng)化打包双肤、監(jiān)聽文件變化

以往用jq寫頁面施掏,都是在本地直接打開html文件,修改之后在瀏覽器F5刷新才能看到變化茅糜,實(shí)在是相當(dāng)費(fèi)勁七芭。為了以后節(jié)省更多的開發(fā)時(shí)間,實(shí)現(xiàn)能夠監(jiān)聽改動(dòng)蔑赘,最后自動(dòng)構(gòu)建和打包狸驳,我特地學(xué)習(xí)了gulp。

gulp是一款基于stream(流)的自動(dòng)化構(gòu)建工具缩赛,主要用來設(shè)定程序自動(dòng)處理靜態(tài)資源的工作耙箍。簡單的說,gulp就是用來打包項(xiàng)目的酥馍。gulp很容易上手辩昆,只要掌握幾個(gè)api即可。

官網(wǎng):https://gulpjs.com/

中文官網(wǎng):https://www.gulpjs.com.cn/docs/

我使用gulp主要是為了想做css物喷、js卤材、image資源的壓縮和打包遮斥,添加時(shí)間戳。這里我引入gulp的幾個(gè)插件:

images:

gulp-imagemin [ 壓縮圖片 ]

css:

gulp-sass [ sass編譯扇丛,我習(xí)慣用sass寫樣式术吗,這里需要這個(gè)插件幫助轉(zhuǎn)css ]

gulp-postcss、autoprefixer [ 根據(jù)設(shè)置瀏覽器版本自動(dòng)處理瀏覽器前綴帆精,使用她我們可以很瀟灑地寫代碼较屿,不必考慮CSS針對瀏覽器的兼容性問題 ]

postcss-px2rem [ px轉(zhuǎn)rem ]

cssmin [ 壓縮css ]

javascript:

gulp-uglify [ 壓縮js ]

還有其他幾個(gè)插件

gulp-clean [ 刪除文件、文件夾 ]

run-sequence [ 按順序執(zhí)行task 卓练,這個(gè)很重要隘蝎,因?yàn)間ulp中task是異步進(jìn)行的,有時(shí)候有些任務(wù)需要先完成A才能執(zhí)行B襟企,不然會(huì)報(bào)錯(cuò) ]

gulp-rev [ 添加時(shí)間戳 ]

gulp-rev-collector [ 時(shí)間戳添加后再在html?里面替換原有的文件 ]

browser-sync [ 讓瀏覽器實(shí)時(shí)嘱么、快速響應(yīng)文件更改(html、js顽悼、css曼振、sass、less等)并自動(dòng)刷新頁面 ]

gulp可以讓你根據(jù)需要自定義你的工作流蔚龙。在此附上我的項(xiàng)目結(jié)構(gòu)

項(xiàng)目結(jié)構(gòu)

安裝:

首先確認(rèn)你的環(huán)境都準(zhǔn)備好了冰评,安裝gulp∧靖可參考https://gulpjs.com/docs/en/getting-started/quick-start

最后gulp -v # 測試是否安裝成功

在根目錄下創(chuàng)建gulpfile.js甲雅,這個(gè)文件用來配置所有任務(wù)。

首先將需要用到的插件下載安裝:npm install 插件名 --save-dev坑填。

在gulpfile.js中引用所用到的所有插件抛人,注意:gulp要首先被引用。

然后是創(chuàng)建任務(wù)穷遂,如果任務(wù)較多函匕,可以分小任務(wù)創(chuàng)建。


//?壓縮css

????gulp.task('miniCss',?function?()?{

????????return?gulp.src(['src/resource/css/*.scss'])

????????????.pipe(sass().on('error',?function?(err)?{

????????????????console.error('Error',?err.message);

????????????}))

????????????.pipe(postcss([px2rem({remUnit:?100}),?autoprefixer()]))

????????????//?保留一份原文件

????????????//?.pipe(gulp.dest('dist/resource/css'))

????????????.pipe(postcss([?autoprefixer()?]))

????????????.pipe(cssmin())

????????????.pipe(rev())?//css增加md5版本號(hào)蚪黑,6位

????????????.pipe(gulp.dest('dist/resource/css'))

????????????.pipe(rev.manifest())

????????????.pipe(gulp.dest('rev/css'));

????});

????//?壓縮js

????gulp.task('miniScripts',?function?()?{

????????return?gulp.src('src/resource/js/*.js')

????????????//?.pipe(gulp.dest('dist/resource/js'))

????????????.pipe(uglify())

????????????.pipe(rev())?//css增加md5版本號(hào)盅惜,6位

????????????.pipe(gulp.dest('dist/resource/js'))

????????????.pipe(rev.manifest())

????????????.pipe(gulp.dest('rev/js'));

????});

????//?輸出i18n

????gulp.task('copy',??function()?{

????????return?gulp.src('src/resource/i18n/**/*.properties')

????????.pipe(gulp.dest('dist/resource/i18n/'))

????});

????//?輸出字體

????gulp.task('font',?function?()?{

????????return?gulp.src('src/resource/fonts/*.{otf,eot,svg,ttf,woff,woff2}')

????????????.pipe(gulp.dest('dist/resource/fonts'))

????});

????//?輸出html

????gulp.task('html',?function?()?{

????????return?gulp.src(['src/*.html'])

????????????.pipe(gulp.dest('dist'));

????});

????//?壓縮圖片

????gulp.task('miniImages',?function?()?{

????????return?gulp.src('src/resource/images/*.{jpg,png,gif,ico}')

????????????.pipe(imagemin())?

????????????.pipe(gulp.dest('dist/resource/images'))

????});

????//?給有引用靜態(tài)資源的html更改引用的文件名字

????gulp.task('rev',?function()?{

????????gulp.src(['rev/**/*.json',?'src/*.html'])????????????????????

????????.pipe(revCollector())???????????????????????????????????

????????.pipe(gulp.dest('dist'));????????????????????????????????

????});

//?開啟服務(wù),監(jiān)聽代碼改動(dòng)自動(dòng)刷新頁面

gulp.task('browserSyncInit',?function?()?{

????????browserSync.init({

????????????server:?{

????????????????baseDir:?"./dist",

????????????????index:?'/index.html',

????????????},

????????????port:?8989

????????})

????});

????//?清空dist

????gulp.task('clean',?function?()?{

????????return?gulp.src('dist',?{read:?false})

????????????.pipe(clean());//清除dist目錄

????});


上面將多個(gè)任務(wù)分別聲明忌穿,然后通過組合將上面的任務(wù)串起來:

?//?build組合

????gulp.task('build',?function(done)?{

????????runSequence(

????????????['font',?'copy',?'miniImages'],

????????????['miniCss'],

????????????['miniScripts'],

????????????['rev'],

????????????['browserSyncInit'],

????????????done);

????});

?????//?打包命令

????gulp.task('default',?function?(done)?{

????????runSequence(

????????????['clean'],

????????????['build'],

????????????done);

????});

默認(rèn)在命令窗口執(zhí)行g(shù)ulp抒寂,就會(huì)執(zhí)行名為default的task。于是我們命令打包生成了文件夾dist掠剑,并且終端開啟了一個(gè)localhost:8989服務(wù)屈芜。我們可以借此查看生成的dist文件在服務(wù)上能否正常運(yùn)行。

上面實(shí)現(xiàn)了代碼的壓縮打包,gulp實(shí)現(xiàn)監(jiān)聽文件變化其實(shí)也是類似井佑,不多說属铁,附上代碼:


//?監(jiān)聽任務(wù)

????//?監(jiān)聽css

????gulp.task('listenCss',?function?()?{

????????return?gulp.src(['src/resource/css/*.scss'])

????????????.pipe(sass().on('error',?function?(err)?{

????????????????console.error('Error',?err.message);

????????????}))

????????????.pipe(postcss([px2rem({remUnit:?100}),?autoprefixer()]))

????????????.pipe(postcss([?autoprefixer()?]))

????????????.pipe(gulp.dest('test/resource/css'))

????????????.pipe(browserSync.stream());

????})

????//?監(jiān)聽js

????gulp.task('listenScripts',?function()?{

????????return?gulp.src(['src/resource/js/*.js'])

????????????.pipe(gulp.dest('test/resource/js'))

????????????.pipe(browserSync.stream());

????})

????//?輸出i18n

????gulp.task('listenI18n',??function()?{

????????return?gulp.src('src/resource/i18n/**/*.properties')

????????????.pipe(gulp.dest('test/resource/i18n/'))

????????????.pipe(browserSync.stream())

????});

????//?刷新html

????gulp.task('htmlReload',?function?()?{

????????return?gulp.src('src/*.html')

????????????.pipe(gulp.dest('test'))

????????????.pipe(browserSync.stream());

????});

????//?監(jiān)聽圖片

????gulp.task('listenImages',?function?()?{

????????return?gulp.src('src/resource/images/*.{jpg,png,gif,ico}')

????????????.pipe(gulp.dest('test/resource/images'));

????});

????//?輸出字體

????gulp.task('listenFonts',??function()?{

????????return?gulp.src('src/resource/fonts/*.{otf,eot,svg,ttf,woff,woff2}')

????????.pipe(gulp.dest('test/resource/fonts'));

????});

????//?監(jiān)聽

????gulp.task('watch',?function?()?{

????????gulp.watch('src/resource/css/*.scss').on('change',?function?(file)?{

????????????gulp.start('listenCss');

????????});

????????gulp.watch('src/resource/js/*.js').on('change',?function?(file)?{

????????????gulp.start('listenScripts');

????????});

????????gulp.watch('src/*.html').on('change',?function(){

????????????gulp.start('htmlReload');

????????});

????????gulp.watch('src/resource/i18n/**/*.properties').on('change',?function?(file)?{

????????????gulp.start('listenI18n');

????????});

????});

//?清空test

????gulp.task('cleanTest',?function?()?{

????????return?gulp.src('test',?{read:?false})

????????????.pipe(clean());//清除test目錄

????});

gulp.task('browserSyncTestInit',?function?()?{

????????browserSync.init({

????????????server:?{

????????????????baseDir:?"./test",

????????????????index:?'/index.html',

????????????},

????????????port:?8989

????????})

????});

//?dev組合

????gulp.task('develop',?function(done){

????????runSequence(

????????????['listenFonts',?'listenI18n',?'listenImages'],

????????????['listenCss'],

????????????['listenScripts'],

????????????['htmlReload'],

????????????['browserSyncTestInit'],

????????????done);

????});

????//?本地跑命令

????gulp.task('dev',?function?(done)?{

????????runSequence(

????????????['cleanTest'],

????????????['develop'],

????????????['watch'],

????????????done);

????});


在終端輸入“gulp dev”即可。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末躬翁,一起剝皮案震驚了整個(gè)濱河市焦蘑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌盒发,老刑警劉巖例嘱,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異宁舰,居然都是意外死亡拼卵,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門蛮艰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腋腮,“玉大人,你說我怎么就攤上這事壤蚜〉秃” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵仍律,是天一觀的道長。 經(jīng)常有香客問我实柠,道長水泉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任窒盐,我火速辦了婚禮草则,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蟹漓。我一直安慰自己炕横,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布葡粒。 她就那樣靜靜地躺著份殿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嗽交。 梳的紋絲不亂的頭發(fā)上卿嘲,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音夫壁,去河邊找鬼拾枣。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的梅肤。 我是一名探鬼主播司蔬,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼姨蝴!你這毒婦竟也來了俊啼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對情侶失蹤似扔,失蹤者是張志新(化名)和其女友劉穎吨些,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體炒辉,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡豪墅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了黔寇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片偶器。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖缝裤,靈堂內(nèi)的尸體忽然破棺而出屏轰,到底是詐尸還是另有隱情,我是刑警寧澤憋飞,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布霎苗,位于F島的核電站,受9級(jí)特大地震影響榛做,放射性物質(zhì)發(fā)生泄漏唁盏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贸桶,春花似錦、人聲如沸刽严。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽舞萄。三九已至,卻和暖如春管削,著一層夾襖步出監(jiān)牢的瞬間鹏氧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國打工佩谣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留把还,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像吊履,于是被迫代替她去往敵國和親安皱。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容