ionic代碼壓縮與代碼混淆

ionic工程發(fā)布之前的最后一步,即代碼壓縮(獲取更好的性能)以及代碼混淆(以免源碼被有心者輕易獲嚷呈弧)俱两。包括以下步驟:

(cordova hook)檢查javascript:這一步需要在代碼壓縮和代碼混淆之前進(jìn)行以保證javascript代碼無(wú)錯(cuò)誤

(gulp task)將html頁(yè)面代碼轉(zhuǎn)換為angular的JS代碼:這一步起到了混淆html頁(yè)面代碼的作用

(gulp task)啟用angular嚴(yán)格依賴注入:這一步需要在代碼混淆之前進(jìn)行以保證angular的依賴注入沒(méi)有問(wèn)題

(gulp task)組合js代碼以及組合css代碼:這一步起到了混淆js代碼以及css代碼的作用

(cordova hook)代碼丑化、壓縮痛侍、混淆:最后一步 -

為完成上述任務(wù)朝氓,我們需要同時(shí)使用gulp tasks以及cordova hooks魔市。當(dāng)執(zhí)行ionic serve時(shí),gulp tasks會(huì)被執(zhí)行赵哲。當(dāng)執(zhí)行ionic buildAndroid/iOS或ionic run android/ios時(shí)待德,cordova hooks會(huì)被執(zhí)行。


首先注意枫夺,本文說(shuō)明的工程目錄結(jié)構(gòu)如下将宪,讀者需要根據(jù)不同的工程進(jìn)行路徑修改


檢查javascript

1.這一步需要用到j(luò)shint以及async,可以使用npm安裝:

$ npm install jshint --save-dev

$ npm install async --save-dev

2.復(fù)制cordova hooks文件:

此文件下載橡庞,并復(fù)制到$PROJECT_DIR/hooks/before_prepare文件夾里较坛。特別注意需要給予此文件“可執(zhí)行”的權(quán)限,即

$ chmod +x file_name

注意:此文件負(fù)責(zé)檢測(cè)$PROJECT_DIR/www/js/目錄下的js文件是否有誤扒最,請(qǐng)根據(jù)自己工程的實(shí)際情況對(duì)此文件進(jìn)行修改:

如我的工程中有2個(gè)存放js文件的路徑:$PROJECT_DIR/www/js目錄和$PROJECT_DIR/www/patchjs目錄丑勤,則我需要對(duì)上述文件進(jìn)行如下修改:

varfoldersToProcess = ['js'];

替換為:

varfoldersToProcess = ['js','patchjs'];

3.測(cè)試:

終端執(zhí)行:

$ ionic build android/ios

若成功,則可在終端輸出中看到工程中js文件是否有錯(cuò)誤吧趣,并指出錯(cuò)誤/警告的行法竞、列數(shù)以及錯(cuò)誤/警告的原因:

檢查無(wú)誤


將html頁(yè)面代碼轉(zhuǎn)換為angular的JS代碼

這一步對(duì)html頁(yè)面代碼的混淆是將html頁(yè)面代碼處理成angular的js代碼(保存到一個(gè)js文件中)。

1.這一步需要用到gulp-angular-templatecache强挫〔戆裕可以使用npm安裝:

npm install gulp-angular-templatecache --save-dev

2.修改gulpfile.js文件:

vartemplateCache =require('gulp-angular-templatecache');

varpaths = {? ? sass: ['./scss/**/*.scss'],? ? templatecache: ['./www/templates/**/*.html']};

gulp.task('templatecache',function(done){gulp.src('./www/templates/**/*.html')? ? ? .pipe(templateCache({standalone:true}))? ? ? .pipe(gulp.dest('./www/js'))? ? ? .on('end', done);});

gulp.task('default', ['sass','templatecache']);

gulp.task('watch',function(){gulp.watch(paths.sass, ['sass']);? gulp.watch(paths.templatecache, ['templatecache']);});

3.修改ionic.project文件:

"gulpStartupTasks": ["sass","templatecache","watch"]

4.在app.js中增加templates模塊依賴:

angular.module('starter', ['ionic','starter.controllers','templates'])

5.在index.html中引入templates.js文件:

注意:這里的templates.js文件是下一步生成的。

6.測(cè)試:

$ ionic serve

或者

$ gulp templatecache

執(zhí)行完畢俯渤,在$PROJECT_DIR/www/js目錄下將生成templates.js文件呆细,此文件中將包含對(duì)html頁(yè)面代碼的轉(zhuǎn)換結(jié)果。

7.改變templateUrl路徑:

打開$PROJECT_DIR/www/js/templates.js文件稠诲,我們可以看到類似于下面的代碼:

$templateCache.put("login.html", ...

大家可以看到侦鹏,此時(shí)的login.html前面沒(méi)有templates路徑前綴,其他的html文件也是類似的臀叙,所以我們之前在js中使用templateUrl指定的html文件路徑便需要作出相應(yīng)變化—-去除templates路徑前綴:

首先略水,我們要知道哪里會(huì)使用到templateUrl屬性,可能有如下幾種情況:

1.app.js中使用$stateProvider.state()定義路由時(shí);

2.類似于$ionicPopover的控件或自定義的directives中到;

我們以情況1為例說(shuō)明修改的過(guò)程:

app.js之前可能的情況:

.state('login', {? ? url:"/",? ? templateUrl:"templates/login.html",? ? controller:'LoginCtrl'});

修改之后則為:

.state('login', {? ? url:"/",? ? templateUrl:"login.html",? ? controller:'LoginCtrl'});

其他的也類似地進(jìn)行修改劝萤。


啟用angular ng-strict-di

在我們進(jìn)行代碼壓縮之前渊涝,我們需要啟用angular的ng-strict-di,即嚴(yán)格依賴注入床嫌,使用ng-strict-di使得工程中依賴注入不會(huì)有問(wèn)題跨释,更多關(guān)于ng-strict-di可以看這里

1.首先通過(guò)npm安裝gulp-ng-annotate

$ npm install gulp-ng-annotate --save-dev

2.其次厌处,修改gulpfile.js文件:

varngAnnotate =require('gulp-ng-annotate');

varpaths = {? ? sass: ['./scss/**/*.scss'],? ? ? templatecache: ['./www/templates/**/*.html'],? ? ? ng_annotate: ['./www/js/*.js']};

gulp.task('ng_annotate',function(done){gulp.src('./www/js/*.js')? ? ? .pipe(ngAnnotate({single_quotes:true}))? ? ? .pipe(gulp.dest('./www/dist/dist_js/app'))? ? ? .on('end', done);});

gulp.task('default', ['sass','templatecache','ng_annotate']);

gulp.task('watch',function(){gulp.watch(paths.sass, ['sass']);? ? gulp.watch(paths.templatecache, ['templatecache']);? ? gulp.watch(paths.ng_annotate, ['ng_annotate']);});

3.修改ionic.project文件:

"gulpStartupTasks": ["sass","templatecache","ng_annotate","watch"]

4.重新定位index.html里js的文件:

5.在ng-app標(biāo)簽下加入directive:ng-strict-di:

6.測(cè)試

$ ionic serve

$ gulp ng_annotate

上面的執(zhí)行過(guò)程將會(huì)生成$PROJECT_DIR/www/dist/dist_js/app文件夾鳖谈,并且其中包含了嚴(yán)格符合注入標(biāo)準(zhǔn)的工程js文件。


合并js文件以及css文件

1.通過(guò)npm安裝gulp-useref

$ npm install gulp-useref --save-dev

2.其次阔涉,修改gulpfile.js文件:

varuseref =require('gulp-useref');

varpaths = {? ? sass: ['./scss/**/*.scss'],? ? ? templatecache: ['./www/templates/**/*.html'],? ? ? ng_annotate: ['./www/js/*.js'],? ? ? useref: ['./www/*.html']};

gulp.task('useref',function(done){varassets = useref.assets();? ? gulp.src('./www/*.html')? ? ? .pipe(assets)? ? ? .pipe(assets.restore())? ? ? .pipe(useref())? ? ? .pipe(gulp.dest('./www/dist'))? ? ? .on('end', done);? });

gulp.task('default', ['sass','templatecache','ng_annotate','useref']);

gulp.task('watch',function(){gulp.watch(paths.sass, ['sass']);? ? gulp.watch(paths.templatecache, ['templatecache']);? ? gulp.watch(paths.ng_annotate, ['ng_annotate']);? ? gulp.watch(paths.useref, ['useref']);? });

3.修改ionic.project文件:

"gulpStartupTasks": ["sass","templatecache","ng_annotate","useref","watch"]

4.修改index.html文件缆娃,對(duì)需要合并的js文件和css文件進(jìn)行處理:

注意:可能有些外部的css文件或js文件不想被處理捷绒,那么就保持原狀即可。

5.測(cè)試

$ ionic serve

$ gulp useref

上面的執(zhí)行過(guò)程會(huì)生成以下文件:

$PROJECT_DIR/www/dist/index.html

$PROJECT_DIR/www/dist/dist_css/styles.css

$PROJECT_DIR/www/dist/dist_js/app.js

其中后面2個(gè)文件贯要,即是被合并過(guò)后的文件暖侨。

注意:新版本的gulp-useref沒(méi)有assets()方法,所以可能會(huì)出現(xiàn)錯(cuò)誤崇渗,大家可以用gulp-useref的2.1.0版本字逗,即第一步安裝時(shí)使用:

$ npm install gulp-useref@2.1.0--save-dev


最后一步

1.使用npm安裝cordova-uglify以及mv:

$ npm install cordova-uglify --save-dev

$ npm instal mv --save-dev

2.復(fù)制cordova hooks文件:

這些文件添加至$PROJECT_DIR/hooks/after_prepare文件夾中。并且要注意這些文件中的有關(guān)路徑的操作宅广,是對(duì)應(yīng)于前幾步中的路徑的葫掉,如果工程結(jié)構(gòu)不一樣,請(qǐng)自行調(diào)整這些文件中有關(guān)路徑的部分乘碑。特別注意需要給予此文件“可執(zhí)行”的權(quán)限挖息,即

$ chmod +x file_name

1

1

現(xiàn)在,我們就可以生成處理完成的文件了:

$ ionic build android/ios

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末兽肤,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子绪抛,更是在濱河造成了極大的恐慌资铡,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件幢码,死亡現(xiàn)場(chǎng)離奇詭異笤休,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)症副,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門店雅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人贞铣,你說(shuō)我怎么就攤上這事闹啦。” “怎么了辕坝?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵窍奋,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我酱畅,道長(zhǎng)琳袄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任纺酸,我火速辦了婚禮窖逗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘餐蔬。我一直安慰自己碎紊,他們只是感情好在张,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著矮慕,像睡著了一般帮匾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上痴鳄,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天瘟斜,我揣著相機(jī)與錄音,去河邊找鬼痪寻。 笑死螺句,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的橡类。 我是一名探鬼主播蛇尚,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼顾画!你這毒婦竟也來(lái)了取劫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤研侣,失蹤者是張志新(化名)和其女友劉穎谱邪,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體庶诡,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惦银,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了末誓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扯俱。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖喇澡,靈堂內(nèi)的尸體忽然破棺而出迅栅,到底是詐尸還是另有隱情,我是刑警寧澤撩幽,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布库继,位于F島的核電站,受9級(jí)特大地震影響窜醉,放射性物質(zhì)發(fā)生泄漏宪萄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一榨惰、第九天 我趴在偏房一處隱蔽的房頂上張望拜英。 院中可真熱鬧,春花似錦琅催、人聲如沸居凶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)侠碧。三九已至抹估,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間弄兜,已是汗流浹背药蜻。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留替饿,地道東北人语泽。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像视卢,于是被迫代替她去往敵國(guó)和親踱卵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

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

  • gulpjs是一個(gè)前端構(gòu)建工具据过,與gruntjs相比惋砂,gulpjs無(wú)需寫一大堆繁雜的配置參數(shù),API也非常簡(jiǎn)單蝶俱,學(xué)...
    井皮皮閱讀 1,305評(píng)論 0 10
  • gulpjs是一個(gè)前端構(gòu)建工具班利,與gruntjs相比,gulpjs無(wú)需寫一大堆繁雜的配置參數(shù)榨呆,API也非常簡(jiǎn)單,學(xué)...
    依依玖玥閱讀 3,157評(píng)論 7 55
  • gulpjs是一個(gè)前端構(gòu)建工具庸队,與gruntjs相比积蜻,gulpjs無(wú)需寫一大堆繁雜的配置參數(shù),API也非常簡(jiǎn)單彻消,學(xué)...
    小裁縫sun閱讀 931評(píng)論 0 3
  • 安裝Gulp首先需要安裝Node.js竿拆,并在控制臺(tái)輸入$ npm install gulp -gMac端需要寫成$...
    LaBaby_閱讀 929評(píng)論 0 1
  • 前言 本文默認(rèn)你已經(jīng)安裝好node環(huán)境,并且熟悉node命令宾尚,和window cd命令丙笋。 gulp簡(jiǎn)介 基于nod...
    9I閱讀 1,985評(píng)論 4 50