使用Gulp打包ionic1項目

這篇文章算是對上一篇文章《在微信中使用ionic1之填坑總結》的一個補充,是項目在微信瀏覽器中使用出現(xiàn)緩存問題的一個解決方案喷橙。

在上篇文章的最后提出來了還可以做得更好的一個點就是關于緩存這個問題的優(yōu)化隔箍。當時提出來的做法是在每個頁面的ur后面加上一個時間戳來實現(xiàn)去緩存贪染,但是最后通過實踐發(fā)現(xiàn)這個辦法并不可行物蝙。最后的最后泛啸,選擇使用Gulp來完成了這個任務边琉。

關于Gulp

Gulp是一個前端的自動化構建工具属百,做前端的同學應該都知道。比如之前的Grunt变姨,以及現(xiàn)在流行的Webpack族扰。
但是作為一個從做原生(Native APP)開發(fā)到做混合(Hybrid APP)開發(fā)再到把混合開發(fā)的APP移植到微信公眾號程序猿來說,這是一個新的知識點定欧。
通過自動化構建工具渔呵,我們可以完成對代碼的合并、壓縮以及混淆砍鸠,這里的代碼包含JS扩氢、HTML、CSS甚至還有圖片文件爷辱。
其實原生開發(fā)的IDE已經幫我們做了大部分的自動化構建的工作录豺,以至于在原生開發(fā)的時候并不是很關心這方面朦肘。

為什么是Gulp?

最簡單的原因就是ionic1本身就是支持Gulp的双饥,在創(chuàng)建好的ionic1項目中就已經包含了gulpfile.js文件媒抠。
使用Gulp的前期準備工作這里就不再多講,請自行參考--Gulp中文網(wǎng)--咏花。

使用Gulp打包之后的優(yōu)缺點:

優(yōu)點:
  1. 無需引入其他第三方的框架(比如RequireJS)即可拆分js文件趴生,避免了出現(xiàn)超級js文件
  2. 打包壓縮之后,代碼體積減小昏翰,文件數(shù)量減少苍匆,節(jié)省了加載時間
  3. 在引用文件是配合參數(shù)的使用,解決了微信瀏覽器中的緩存問題
缺點:
  1. 每次代碼修改之后都必須要打包之后才能看到修改的結果棚菊,不能像之前代碼修改之后馬上就能看到效果浸踩。這是目前最大的一個缺點,暫時未發(fā)現(xiàn)解決辦法

在項目中使用Gulp

在項目中使用Gulp窍株,需要完成3個工作:

  1. 配置gulpgile.js文件民轴,以及安裝相關Gulp插件
  2. angularJS代碼的改造
  3. 修改index.html中對文件的引用
在gulpfile.js中引入相關插件(ps:記得在項目中安裝相關Gulp的插件!)
var concat = require('gulp-concat');
var minifyCss = require('gulp-minify-css');
var rename = require('gulp-rename');
var sh = require('shelljs');
var ngmin = require('gulp-ngmin');
var uglify = require('gulp-uglify');
var stripDebug = require('gulp-strip-debug');
var ngAnnotate = require('gulp-ng-annotate');
var ngHtml2Js = require('gulp-ng-html2js');// ng模板合并壓縮成js
合并壓縮 js

這里要合并壓縮的js是我們自己寫的那些js代碼球订,也就是www/js目錄下的文件后裸。對于本地的第三方js文件,最好是放到lib目錄中去冒滩,第三方的js基本不會怎么改變微驶,而且大部分第三方的js代碼都是已經打包過了的。

gulp.task('minifyJs', function () {
  return gulp.src('./www/js/**/*.js')      // 需要操作的文件
    .pipe(concat('myionic.js')) // 合并需要操作的文件為一個文件myionic.js
    .pipe(gulp.dest('./www/dist')) // 輸出myionic.js到www/dist目錄
    .pipe(rename('myionic.min.js')) // 文件重命名為myionic.min.js
    .pipe(ngAnnotate())
    .pipe(ngmin({dynamic: false}))//Pre-minify AngularJS apps with ngmin
    .pipe(stripDebug())//除去js代碼中的console和debugger輸出
    .pipe(uglify({compress: true})) // 壓縮
    .pipe(gulp.dest('./www/dist')); // 輸出
});
合并壓縮angularjs模板
gulp.task('html2js', function () {
  return gulp.src("./www/templates/**/*.html")//原路徑
    .pipe(ngHtml2Js({
      moduleName: "myionic.templates"
    }))//html模板轉js文件
    .pipe(concat("templates.min.js"))//合并
    .pipe(uglify({compress: false}))//壓縮
    .pipe(gulp.dest("./www/dist"));//目標路徑
});
合并壓縮css
gulp.task('minifyCss', function () {
  return gulp.src("./www/css/*.css")
    .pipe(concat('myionic.min.css'))
    .pipe(minifyCss())
    .pipe(gulp.dest("./www/dist"));
});

對js代碼的改造开睡,首先是app.js
var myionic = angular.module('imcyz', ['ionic', 'myionic.controllers', 'myionic.services', 'myionic.directives', 'myionic.filters', 'ngCordova', 'ionicLazyLoad', 'ngTouch', 'myionic.templates']);

// 這里的myionic.templates對應合并壓縮angularjs模板中的moduleName

var controllers = angular.module('myionic.controllers', []);
var services = angular.module('myionic.services', []);
var directives = angular.module('myionic.directives', []);
var filters = angular.module('myionic.filters', []);

myionic.run(['$ionicPlatform', '$rootScope', '$timeout', '$http', '$ionicPopup', '$ionicHistory', '$location', '$ionicLoading', function ($ionicPlatform, $rootScope, $timeout, $http, $ionicPopup, $ionicHistory, $location) {
  // TODO
}

myionic.config(['$stateProvider', '$urlRouterProvider', '$ionicConfigProvider', '$httpProvider', '$locationProvider', function ($stateProvider, $urlRouterProvider, $ionicConfigProvider, $httpProvider, $locationProvider) {

  $ionicConfigProvider.platform.android.tabs.style('standard');
  $ionicConfigProvider.platform.android.tabs.position('standard');
  $ionicConfigProvider.platform.android.navBar.alignTitle('center');
  $ionicConfigProvider.platform.android.backButton.previousTitleText('ion-android-arrow-back');
  $ionicConfigProvider.platform.android.views.transition('android');
  $ionicConfigProvider.views.swipeBackEnabled(false);

  // TODO
}

因為我們已經打包了項目中的模板文件因苹,所以在配置路由的templateUrl,甚至是其他(比如modal)的templateUrl篇恒,也就只需要配置為templates之后的路徑扶檐。

然后,是controller胁艰、service款筑、factory、directive腾么、filter文件的改造

所有的依賴注入都必須嚴格按照下面的樣式來寫奈梳,包括在app.js中的依賴注入,不然在打包之后運行項目會報錯解虱。

controllers.controller('AboutUsCtrl', ['$scope',  '$cordovaAppVersion', function ($scope, $cordovaAppVersion,) {
  // TODO
}]);

services.service("MyService", ['$http', function ($http) {
  // TODO
}]);

services.factory("MyFactory", ['$http', '$injector', function ($http, $injector) {
  // TODO
}]);

directives.directive('setFocus', ['$timeout', function ($timeout) {
  return {
    link: function (scope, element) {
      $timeout(function () {
        element[0].focus();
      }, 500);
    }
  };
}]);

filters.filter('trustedAsRes', ['$sce', function ($sce) {
  return function (url) {
    return $sce.trustAsResourceUrl(url);
  };
}]);
至此也就完成了代碼的改造以及Gulp的配置攘须。

可以單個的執(zhí)行gulp html2js這樣的命令來合并壓縮模板文件,也可以通過把任務加到default里面去殴泰,直接一個gulp命令執(zhí)行所有要執(zhí)行的任務于宙。

gulp.task('default', ['html2js','minifyCss','minifyJs']);

改造index.html

在命令行運行gulp命令之后浮驳,在項目的www目錄下就會多出一個dist目錄,里面包含4個文件限煞。

www/
../dist/
../../myionic.js
../../myionic.min.js
../../myionic.min.css
../../templates.min.js

在index.html中對文件的引用抹恳,也就只需引用以上四個文件即可。
myionic.js只是所有js文件的合并署驻,可以在開發(fā)的時候使用方便調試。
myionic.min.js做了混淆健霹,適合用于正式上線的生產環(huán)境旺上。
在每個文件引用里面加入一個版本參數(shù)v,每次代碼改變之后都需要變更v的值糖埋,這樣就可以達到去緩存的效果了Pā!瞳别!

  <!--開發(fā)環(huán)境使用-->
  <script src="dist/myionic.js?v=201711110000"></script>

  <!--生產環(huán)境使用-->
  <!--<script src="dist/myionic.min.js?v=201711110000"></script>-->

  <script src="dist/templates.min.js?v=201711110000"></script>
  <link href="dist/myionic.min.css?v=201711110000" rel="stylesheet">
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末征候,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子祟敛,更是在濱河造成了極大的恐慌疤坝,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件馆铁,死亡現(xiàn)場離奇詭異跑揉,居然都是意外死亡,警方通過查閱死者的電腦和手機埠巨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門历谍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人辣垒,你說我怎么就攤上這事望侈。” “怎么了勋桶?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵脱衙,是天一觀的道長。 經常有香客問我哥遮,道長岂丘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任眠饮,我火速辦了婚禮奥帘,結果婚禮上,老公的妹妹穿的比我還像新娘仪召。我一直安慰自己寨蹋,他們只是感情好松蒜,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著已旧,像睡著了一般秸苗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上运褪,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天惊楼,我揣著相機與錄音,去河邊找鬼秸讹。 笑死檀咙,一個胖子當著我的面吹牛,可吹牛的內容都是我干的璃诀。 我是一名探鬼主播弧可,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼劣欢!你這毒婦竟也來了棕诵?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤凿将,失蹤者是張志新(化名)和其女友劉穎校套,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丸相,經...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡搔确,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了灭忠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膳算。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖弛作,靈堂內的尸體忽然破棺而出涕蜂,到底是詐尸還是另有隱情,我是刑警寧澤映琳,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布机隙,位于F島的核電站,受9級特大地震影響萨西,放射性物質發(fā)生泄漏有鹿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一谎脯、第九天 我趴在偏房一處隱蔽的房頂上張望葱跋。 院中可真熱鬧,春花似錦、人聲如沸娱俺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽荠卷。三九已至模庐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間油宜,已是汗流浹背掂碱。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留慎冤,地道東北人顶吮。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像粪薛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子搏恤,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內容

  • 在現(xiàn)在的前端開發(fā)中违寿,前后端分離、模塊化開發(fā)熟空、版本控制藤巢、文件合并與壓縮、mock數(shù)據(jù)等等一些原本后端的思想開始...
    Charlot閱讀 5,443評論 1 32
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,171評論 25 707
  • gulpjs是一個前端構建工具息罗,與gruntjs相比掂咒,gulpjs無需寫一大堆繁雜的配置參數(shù),API也非常簡單迈喉,學...
    依依玖玥閱讀 3,155評論 7 55
  • gulpjs是一個前端構建工具绍刮,與gruntjs相比,gulpjs無需寫一大堆繁雜的配置參數(shù)挨摸,API也非常簡單孩革,學...
    井皮皮閱讀 1,299評論 0 10
  • 懷孕6周多了。拜那個姐所賜得运,我有了這漫漫假期膝蜈。買夠了吃飽了的下午,一個人在小區(qū)里散步熔掺。 無事一身輕的感覺好難得饱搏。天...
    我就是大魔王閱讀 564評論 0 0