運用gulp管理項目

推薦安裝軟件:node,webstorm

通過npm安裝gulp

初始化npm撬腾,生成package.json:npm init

可以選擇只安裝在項目中:npm install --save-dev gulp

也可以選擇全局安裝:npm install -g gulp

安裝相應(yīng)模塊:npm install m

gulpfile配置示例:

/**

* Created by WUQD on 2016/12/22.

*/

/**

*組件安裝

* npm install gulp-util gulp-imagemin gulp-ruby-sass gulp-minify-css gulp-jshint gulp-uglify gulp-rename gulp-concat gulp-clean gulp-livereload tiny-lr --save-dev

*/

//引入gulp及組件

vargulp=require('gulp'),//基礎(chǔ)庫

runsequence=require('run-sequence'),//順序執(zhí)行任務(wù),gulp默認(rèn)是異步的

sass=require('gulp-sass'),

minifycss=require('gulp-minify-css'),//css壓縮

jshint=require('gulp-jshint'),//js檢查

uglify=require('gulp-uglify'),//js壓縮

ngmin=require('gulp-ngmin'),//Angularjs項目壓縮

ngannotate=require('gulp-ng-annotate'),

htmlmin=require('gulp-htmlmin'),//html壓縮

rename=require('gulp-rename'),//重命名

concat? =require('gulp-concat'),//合并文件

clean =require('gulp-clean'),//清空文件夾

tinylr=require('tiny-lr'),//livereload,自動刷新頁面

flatten=require('gulp-flatten'),//拷貝文件不拷貝目錄

wiredep =require('wiredep').stream,//動態(tài)引入bower

rev=require('gulp-rev'),//-對文件名加MD5后綴

revcollector=require('gulp-rev-collector'),//-路徑替換

replace=require('gulp-replace'),//文本替換

server =tinylr(),

port =35729,

livereload=require('gulp-livereload'),//實時保存刷新

tar=require('gulp-tar'),

gzip =require('gulp-gzip'),//壓縮,打包

ftpdeploy =require('ftp-deploy'),//上傳ftp

del =require('del'),//刪除文件

combiner=require("stream-combiner2");//stream

// HTML處理

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

varoptions = {

removeComments:true,//清除HTML注釋

collapseWhitespace:true,//壓縮HTML

collapseBooleanAttributes:true,//省略布爾屬性的值

removeEmptyAttributes:true,//刪除所有空格作屬性值

removeScriptTypeAttributes:true,//刪除的type="text/javascript"

removeStyleLinkTypeAttributes:true,//刪除和的type="text/css"

minifyJS:true,//壓縮頁面JS

minifyCSS:true//壓縮頁面CSS

};

gulp.src('./src/views/**/*.html')

.pipe(htmlmin(options))

.pipe(gulp.dest('./dist/views'));

});

//樣式處理

gulp.task('css',function() {

varcssSrc ='./src/contents/**/*.css',

cssDst ='./dist/contents';

gulp.src(cssSrc)//壓縮的文件

.pipe(rename({suffix:'.min'}))

.pipe(minifycss())//執(zhí)行壓縮

.pipe(livereload(server))

.pipe(gulp.dest(cssDst))//輸出文件夾

});

//編譯sass

gulp.task('sass',function(){

varsassSrc ='./src/contents/**/*.scss',

sassDst ='./src/contents/';

returngulp.src(sassSrc)

.pipe(sass().on('error',sass.logError) )

.pipe( gulp.dest(sassDst));

});

//合并js

gulp.task('scripts',function() {

varbase ='./src/scripts/lib/';

varjsSrc = [base+'jquery-1.11.3.min.js',

base+'json2.js',

base+'common.js',

base+'jadann.db.manage.js',

base+'user.db.js',

base+'jadann.promptbox.js'

];

returngulp.src(jsSrc)

.pipe(concat('jadann.js'))

.pipe(gulp.dest('./dist/scripts/lib/'));

});

// js處理

gulp.task('js',function() {

varjsSrc ='./src/scripts/*.js',

jsDst ='./dist/scripts';

varcombined =combiner.obj([

gulp.src(jsSrc)

.pipe(jshint())

.pipe(jshint.reporter('default'))

.pipe(ngannotate())

.pipe(ngmin({dynamic:false}))

.pipe(rename({suffix:'.min'}))

.pipe(uglify())

// .pipe(livereload(server))

.pipe(gulp.dest(jsDst))

]);

//任何在上面的stream中發(fā)生的錯誤,都不會拋出漓踢,

//而是會被監(jiān)聽器捕獲

combined.on('error',console.error.bind(console));

returncombined;

});

// jslib處理:將bower_components目錄下文件拷貝到src/js/lib下

gulp.task('bowerjslib',function() {

gulp.src('bower_components/**/*.min.js')

.pipe(flatten())

.pipe(gulp.dest('./src/scripts/lib'));

});

// jslib處理:將src/js/lib目錄下文件拷貝到dist/js/lib下

gulp.task('jslib',function() {

gulp.src('./src/scripts/lib/**/*.min.js')

.pipe(flatten())

.pipe(gulp.dest('./dist/scripts/lib'));

});

//清空dist

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

returngulp.src('./dist')

.pipe(clean({force:true}));

});

//備份build目錄下的舊版本打包文件

gulp.task('clean:build',function() {

//備份舊文件

gulp.src('build/*.tar.gz')

.pipe(rename(function(path) {

console.log(path);

path.extname+=".old";

}))

.pipe(gulp.dest('build/old'))

del(['build/*.tar.gz','!build/old/*'])

});

//gizp壓縮待發(fā)布文件

gulp.task('tar',function() {

vardate =newDate().getTime();

gulp.src('dist/**/*')

.pipe(tar('web_app_build_'+ date +".tar"))

.pipe(gzip())

.pipe(gulp.dest('build'))

});

//上傳壓縮包至ftp

gulp.task('ftp:deploy',function() {

varftpDeploy =newftpdeploy();

varconfig = {

username:"open",

password:"open123",// optional, prompted if none given

host:"172.0.0.1",

port:20,

localRoot:"build/",

remoteRoot:"/dist/",

exclude: ['*.old']

}

ftpDeploy.deploy(config,function(err) {

if(err) console.log(err)

elseconsole.log('finished');

})

});

//發(fā)布測試

gulp.task('dist:test',function() {

varftpDeploy =newftpdeploy();

varconfig = {

username:"open",

password:"open123",// optional, prompted if none given

host:"172.0.0.1",

port:20,

localRoot:"dist",

remoteRoot:"/product/appdownload",

exclude: ['*.old']

}

ftpDeploy.deploy(config,function(err) {

if(err) console.log(err)

elseconsole.log('finished');

})

});

//自動引入bower導(dǎo)入的庫

gulp.task('bower',function() {

gulp.src('./src/index.html')

.pipe(wiredep({

optional:'configuration',

goes:'here'

}))

.pipe(gulp.dest('./src'));

});

//修改引入的文件

gulp.task("replace",function() {

vardate =newDate().getTime();

console.log(date);

gulp.src('./dist/index.html')

.pipe(replace('.css','.min.css'))

.pipe(replace('.js','.min.js'))

.pipe(gulp.dest('./dist/'))

});

//監(jiān)聽任務(wù) 運行語句gulp watch

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

server.listen(port,function(err){

if(err) {

returnconsole.log(err);

}

//監(jiān)聽scss

gulp.watch('./src/contents/**/*.scss',['sass']);

//監(jiān)聽css

gulp.watch('./src/css/*.css',function(){

gulp.run('css');

});

//監(jiān)聽js

gulp.watch('./src/scripts/**/*.js',function(){

gulp.run('js');

});

gulp.watch('./src/scripts/lib/**/*.js',['scripts','jslib']);

//監(jiān)聽bowerjslib

gulp.watch('bower_components/**/*.min.js',function(){

gulp.run('bowerjslib');

});

//監(jiān)聽html

gulp.watch('./src/**/*.html',function(event){

gulp.run('html');

})

});

});

//整合streams來處理錯誤

//默認(rèn)任務(wù) 清空圖片、樣式挺据、js并重建 運行語句gulp

gulp.task('default',['clean'],function(){

gulp.start('bowerjslib','js','jslib','scripts','sass','css','html','watch');

});

gulp.task('build',function(callback) {

runsequence('clean','bowerjslib','js','jslib','scripts','sass','css','html','watch');

});

gulp.task('build:nowatch',function(callback) {

runsequence('clean','bowerjslib','js','jslib','scripts','css','html');

});

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吴菠,一起剝皮案震驚了整個濱河市浩村,隨后出現(xiàn)的幾起案子心墅,更是在濱河造成了極大的恐慌榨乎,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铐姚,死亡現(xiàn)場離奇詭異隐绵,居然都是意外死亡拙毫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門峭跳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人悬襟,你說我怎么就攤上這事拯刁。” “怎么了筛璧?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長夭谤。 經(jīng)常有香客問我,道長颊乘,這世上最難降的妖魔是什么醉锄? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任恳不,我火速辦了婚禮,結(jié)果婚禮上规求,老公的妹妹穿的比我還像新娘卵惦。我一直安慰自己,他們只是感情好丛塌,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布赴邻。 她就那樣靜靜地躺著,像睡著了一般乍楚。 火紅的嫁衣襯著肌膚如雪届慈。 梳的紋絲不亂的頭發(fā)上忿偷,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天鲤桥,我揣著相機與錄音茶凳,去河邊找鬼播揪。 笑死,一個胖子當(dāng)著我的面吹牛猪狈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谓形,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼寒跳,長吁一口氣:“原來是場噩夢啊……” “哼竹椒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起康愤,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤舶吗,失蹤者是張志新(化名)和其女友劉穎誓琼,沒想到半個月后肴捉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡傲隶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年窃页,在試婚紗的時候發(fā)現(xiàn)自己被綠了复濒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巧颈。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡砸泛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出唇礁,到底是詐尸還是另有隱情惨篱,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布机断,位于F島的核電站绣夺,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏奋蔚。R本人自食惡果不足惜烈钞,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一毯欣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧酗钞,春花似錦、人聲如沸窘奏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽米同。三九已至摔竿,卻和暖如春拯坟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背郁季。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工梦裂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留盖淡,地道東北人。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓冗恨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親掀抹。 傳聞我的和親對象是個殘疾皇子心俗,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355

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