使用依賴管理工具(bower)和自動化構建工具(gulp)搭建AngularJs開發環境

bower的安裝和使用

使用bower要求先安裝node,請先安裝node。

全局安裝bower

打開cmd,運行命令npm -i -g bower

image.png

創建bower配置文件

控制臺進入你項目所在文件的目錄,執行bower init創建一個bower的配置文件。

image.png

填寫name,其他項可一路回車忽略。

使用bower來安裝AngularJs

執行命令bower install --save angular(記得加上 --save,不然bower默認不添加到配置文件中)

image.png

構建工具需要操作的目錄說明

src:源碼所在目錄
build:存放src中的源碼編譯之后的文件(用于調試)
dist:用于產品發布的目錄(用于部署上線)

全局安裝gulp

命令:npm i -g gulp

image.png

  • 使用自動化構建工具的目的:源碼合并(減少http請求)和壓縮(節省帶寬)
  • gulp的常用函數:
    src(讀取文件和文件夾)
    dest(寫文件)
    watch(監控文件)
    task(定制任務)
    pipe(使用流的方式來操縱文件)

初始化一個配置文件

命令:npm init
得到一個名為package.json的配置文件。

在當前目錄下安裝一個gulp(保存到配置文件中)

命令:npm i --save-dev gulp

安裝編寫配置文件要用到的模塊

gulp
gulp-clean
gulp-concat
gulp-connect
gulp-cssmin
gulp-imagemin
gulp-less
gulp-load-plugins
gulp-uglify
open
批量安裝命令:npm i --save-dev gulp-clean gulp-concat gulp-connect gulp-cssmin gulp-imagemin gulp-less gulp-load-plugins gulp-uglify open

image.png

編寫配置文件

1、創建一個名叫gulpfile.js的文件。
2、引入模塊、定義全局變量:

var gulp = require('gulp');
var $ = require('gulp-load-plugins')();//引入這個模塊并實例化,concat、cssmin等模塊就可一并引入,不用一個一個去聲明
var open = require('open');

//聲明一個全局變量
//src目錄:源代碼放置的目錄
//build目錄:整合之后的文件
//dist目錄:用于生產、部署
var app = {
    srcPath: 'src/',
    devPath: 'build/',
    prdPath: 'dist/'
};

3、編寫拷貝第三方資源的任務:

//把第三方依賴拷貝到build和dist目錄下
gulp.task('lib',function(){//task:定制任務,lib是任務名
    //src(xxx):訪問xxx文件
    //pipe(gulp.dest(xxx)):把文件拷貝到xxx目錄
    //我們用bower下載的第三方依賴文件都默認下載到bower_components文件夾中
    gulp.src('bower_components/**/*.js')
    .pipe(gulp.dest(app.devPath + 'vendor'))
    .pipe(gulp.dest(app.prdPath + 'vendor'));
})

4、如何使用?
打開cmd,進入gulpfile.js所在目錄,輸入gulp lib命令:

image.png

可以看到文件夾下多了兩個路徑(build/vendor和dest/vendor),引入的第三方js文件已全部拷貝到這兩個目錄下。
image.png

5、創建src文件夾、操作html、js、less、image文件,需要用到編譯與壓縮:

gulp.task('html',function(){
    //app.srcPath是我們開發時的源碼路徑
    gulp.src(app.srcPath + '**/*.html')
    .pipe(gulp.dest(app.devPath))
    .pipe(gulp.dest(app.prdPath));
})

gulp.task('js',function(){
    //$.concat:把所有js代碼合并到一個js文件中
    //$.uglify:拷貝到生產環境之前先壓縮
    gulp.src(app.srcPath + 'script/**/*.js')
    .pipe($.concat('index.js'))
    .pipe(gulp.dest(app.devPath + 'js'))
    .pipe($.uglify())
    .pipe(gulp.dest(app.prdPath + 'js'));
})

gulp.task('less',function(){
    //用一個style/index.less文件引入所有的less文件
    //$.less():編譯less
    //$.cssmin():用于生產環境之前先壓縮一下
    gulp.src(app.srcPath + 'style/index.less')
    .pipe($.less())
    .pipe(gulp.dest(app.devPath + 'css'))
    .pipe($.cssmin())
    .pipe(gulp.dest(app.prdPath + 'css'));
})

gulp.task('image',function(){
    //$.imagemin():壓縮圖片
    gulp.src(app.srcPath + 'image/**/*')
    .pipe(gulp.dest(app.devPath + 'image'))
    .pipe($.imagemin())
    .pipe(gulp.dest(app.prdPath + 'image'));
})

6、編寫清除命令(清除測試目錄和發布目錄):

gulp.task('clean',function(){
    gulp.src([app.devPath,app.prdPath])
    .pipe($.clean());
})

7、整合一個總的任務

gulp.task('build',['image','js','less','lib','html'])

運行gulp build命令:

image.png

8、編寫啟動服務器的任務:

//啟動一個服務
gulp.task('serve',['build'],function(){//記得引入build,否則啟動服務時不編譯代碼
    //root:定義文件路徑
    //livereload:true:自動刷新瀏覽器頁面
    //port:端口號
    $.connect.server({
        root:[app.devPath],
        livereload:true,
        port:1222
    });

    //打開瀏覽器窗口
    open('http://localhost:1222');

    //gulp.watch:監控文件變化
    gulp.watch(app.srcPath + 'script/**/*.js',['js']);
    gulp.watch('bower_components/**/*',['lib']);
    gulp.watch(app.srcPath + '**/*.html',['html']);
    gulp.watch(app.srcPath + 'image/**/*',['image']);
    gulp.watch(app.srcPath + 'style/**/*.less',['less']);
})

9、實現實時刷新瀏覽器頁面:
在js、image、less、lib、html任務后面加上.pipe($.connect.reload()),但是低級瀏覽器不支持(IE8以下)。

10、在cmd中使用gulp serve命令實現自動編譯代碼并啟動瀏覽器:

image.png

啟動瀏覽器成功:
image.png

11、停止:
按Crel+C停止服務:


image.png

配置文件代碼:

var gulp = require('gulp');
var $ = require('gulp-load-plugins')();//引入這個模塊并實例化,concat、cssmin等模塊就可一并引入,不用一個一個去聲明
var open = require('open');

//聲明一個全局變量
//src目錄:源代碼放置的目錄
//build目錄:整合之后的文件
//dist目錄:用于生產、部署
var app = {
    srcPath: 'src/',
    devPath: 'build/',
    prdPath: 'dist/'
};

//把第三方依賴拷貝到build和dist目錄下
gulp.task('lib',function(){//task:定制任務
    //src(xxx):訪問xxx文件
    //pipe(gulp.dest(xxx)):把文件拷貝到xxx目錄
    //我們用bower下載的第三方依賴文件都默認下載到bower_components文件夾中
    gulp.src('bower_components/**/*.js')
    .pipe(gulp.dest(app.devPath + 'vendor'))
    .pipe(gulp.dest(app.prdPath + 'vendor'))
    .pipe($.connect.reload());
})

gulp.task('html',function(){
    //srcPath是我們開發時的源碼路徑
    gulp.src(app.srcPath + '**/*.html')
    .pipe(gulp.dest(app.devPath))
    .pipe(gulp.dest(app.prdPath))
    .pipe($.connect.reload());
})

gulp.task('js',function(){
    //$.concat:把所有js代碼合并到一個js文件中
    //$.uglify:拷貝到生產環境之前先壓縮
    gulp.src(app.srcPath + 'script/**/*.js')
    .pipe($.concat('index.js'))
    .pipe(gulp.dest(app.devPath + 'js'))
    .pipe($.uglify())
    .pipe(gulp.dest(app.prdPath + 'js'))
    .pipe($.connect.reload());
})

gulp.task('less',function(){
    //用一個style/index.less文件引入所有的less文件
    //$.less():編譯less
    //$.cssmin():用于生產環境之前先壓縮一下
    gulp.src(app.srcPath + 'style/index.less')
    .pipe($.less())
    .pipe(gulp.dest(app.devPath + 'css'))
    .pipe($.cssmin())
    .pipe(gulp.dest(app.prdPath + 'css'))
    .pipe($.connect.reload());
})

gulp.task('image',function(){
    //$.imagemin():壓縮圖片
    gulp.src(app.srcPath + 'image/**/*')
    .pipe(gulp.dest(app.devPath + 'image'))
    .pipe($.imagemin())
    .pipe(gulp.dest(app.prdPath + 'image'))
    .pipe($.connect.reload());
})

gulp.task('clean',function(){
    gulp.src([app.devPath,app.prdPath])
    .pipe($.clean());
})

gulp.task('build',['image','js','less','lib','html'])

//啟動一個服務
gulp.task('serve',['build'],function(){
    //root:定義文件路徑
    //livereload:true:保存源碼后即可自動刷新瀏覽器頁面
    //port:端口號
    $.connect.server({
        root:[app.devPath],
        livereload:true,
        port:1222
    });

    //打開瀏覽器窗口
    open('http://localhost:1222');

    //gulp.watch:監控文件變化
    gulp.watch(app.srcPath + 'script/**/*.js',['js']);
    gulp.watch('bower_components/**/*',['lib']);
    gulp.watch(app.srcPath + '**/*.html',['html']);
    gulp.watch(app.srcPath + 'image/**/*',['image']);
    gulp.watch(app.srcPath + 'style/**/*.less',['less']);
})
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,156評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,401評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,069評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,873評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,635評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,128評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,203評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,365評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,881評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,733評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,935評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,475評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,172評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,582評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,821評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,595評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,908評論 2 372

推薦閱讀更多精彩內容