uni-app之條件編譯解決跨端兼容問(wèn)題

1. 跨端兼容

uni-app 已將常用的組件、JS API 封裝到框架中考传,開(kāi)發(fā)者按照 uni-app 規(guī)范開(kāi)發(fā)即可保證多平臺(tái)兼容,大部分業(yè)務(wù)均可直接滿足。
但每個(gè)平臺(tái)有自己的一些特性臭脓,因此會(huì)存在一些無(wú)法跨平臺(tái)的情況。

  • 大量寫 if else腹忽,會(huì)造成代碼執(zhí)行性能低下和管理混亂来累。
  • 編譯到不同的工程后二次修改,會(huì)讓后續(xù)升級(jí)變的很麻煩窘奏。
    在 C 語(yǔ)言中嘹锁,通過(guò) #ifdef、#ifndef 的方式着裹,為 windows领猾、mac 等不同 os 編譯不同的代碼。 uni-app 參考這個(gè)思路,為 uni-app 提供了條件編譯手段摔竿,在一個(gè)工程里優(yōu)雅的完成了平臺(tái)個(gè)性化實(shí)現(xiàn)面粮。

2. 條件編譯

(1)條件編譯:是用特殊的注釋作為標(biāo)記,在編譯時(shí)根據(jù)這些特殊的注釋继低,將注釋里面的代碼編譯到不同平臺(tái)熬苍。
注意:Android 和 iOS 平臺(tái)不支持通過(guò)條件編譯來(lái)區(qū)分,如果需要區(qū)分 Android袁翁、iOS 平臺(tái)柴底,請(qǐng)通過(guò)調(diào)用 uni.getSystemInfo 來(lái)獲取平臺(tái)信息。
(2)寫法:以 #ifdef 或 #ifndef 加 %PLATFORM% 開(kāi)頭梦裂,以 #endif 結(jié)尾似枕。

#ifdef:if defined 僅在某平臺(tái)存在
#ifndef:if not defined 除了某平臺(tái)均存在
%PLATFORM%:平臺(tái)名稱
條件編譯寫法.png

%PLATFORM%可取值.png

(3)支持的文件

  • .vue
  • .js
  • .css
  • pages.json
  • 各預(yù)編譯語(yǔ)言文件,如:.scss年柠、.less凿歼、.stylus、.ts冗恨、.pug
    注意: 條件編譯是利用注釋實(shí)現(xiàn)的答憔,在不同語(yǔ)法里注釋寫法不一樣,js使用 // 注釋掀抹、css 使用 /* 注釋 */虐拓、vue/nvue 模板里使用 ;

2.1 API 的條件編譯

// #ifdef  %PLATFORM%
平臺(tái)特有的API實(shí)現(xiàn)
// #endif

(1)如下代碼僅在 5+App 下出現(xiàn)


5+App.png

(2)如下代碼不會(huì)在 H5 平臺(tái)上出現(xiàn)


非H5 .png

(3)如下代碼會(huì)在 5+App 和 H5 平臺(tái)上出現(xiàn)
除了支持單個(gè)平臺(tái)的條件編譯外傲武,還支持多平臺(tái)同時(shí)編譯蓉驹,使用 || 來(lái)分隔平臺(tái)名稱。
5+App 和 H5.png

2.2 組件的條件編譯

<!--  #ifdef  %PLATFORM% -->
平臺(tái)特有的組件
<!--  #endif -->

(1)如下廣告組件僅會(huì)在微信小程序中出現(xiàn)


微信小程序.png

2.3 樣式的條件編譯

/*  #ifdef  %PLATFORM%  */
平臺(tái)特有樣式
/*  #endif  */

注意: 樣式的條件編譯揪利,無(wú)論是 css 還是 sass/scss/less/stylus 等預(yù)編譯語(yǔ)言中态兴,必須使用 /注釋/ 的寫法。
(1)正確寫法

正確寫法.png

(2)錯(cuò)誤寫法
錯(cuò)誤寫法.png

2.4 pages.json的條件編譯

下面的頁(yè)面疟位,只有運(yùn)行至 5+App 時(shí)才會(huì)編譯進(jìn)去瞻润。

5+App.png

備注:不同平臺(tái)下的特有功能,以及小程序平臺(tái)的分包甜刻,都可以通過(guò) pages.json 的條件編譯來(lái)更好地實(shí)現(xiàn)绍撞。這樣,就不會(huì)在其它平臺(tái)產(chǎn)生多余的資源得院,進(jìn)而減小包體積傻铣。

2.5 static目錄的條件編譯

在不同平臺(tái),引用的靜態(tài)資源可能也存在差異祥绞,通過(guò) static 的的條件編譯可以解決此問(wèn)題矾柜,static 目錄下新建不同平臺(tái)的專有目錄(目錄名稱同 %PLATFORM% 值域,但字母均為小寫)阱驾,專有目錄下的靜態(tài)資源只有在特定平臺(tái)才會(huì)編譯進(jìn)去就谜。
如以下目錄結(jié)構(gòu)怪蔑,a.png 只有在微信小程序平臺(tái)才會(huì)編譯進(jìn)去,b.png 在所有平臺(tái)都會(huì)被編譯丧荐。

┌─static                
│  ├─mp-weixin
│  │  └─a.png     
│  └─b.png
├─main.js        
├─App.vue      
├─manifest.json 
└─pages.json  

2.6 HBuilderX小技巧

HBuilderX 為 uni-app 的條件編譯提供了豐富的支持:
(1)代碼塊支持:通過(guò)輸入 ifdef 可快速生成條件編譯的代碼片段
(2)語(yǔ)法高亮:對(duì)條件編譯的代碼注釋部分提供了語(yǔ)法高亮
(3)正確注釋和快速選中:ctrl+alt+/ 即可生成正確注釋(js:// 注釋缆瓣、css:/* 注釋 */、vue/nvue模板: )虹统。點(diǎn)擊 ifdef 或 endif 可快速選中條件編譯部分弓坞;點(diǎn)擊左側(cè)的折疊圖標(biāo),可折疊條件編譯部分代碼车荔。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末渡冻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子忧便,更是在濱河造成了極大的恐慌族吻,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件珠增,死亡現(xiàn)場(chǎng)離奇詭異超歌,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)蒂教,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門巍举,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人凝垛,你說(shuō)我怎么就攤上這事懊悯。” “怎么了梦皮?”我有些...
    開(kāi)封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵炭分,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我届氢,道長(zhǎng)欠窒,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任退子,我火速辦了婚禮岖妄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘寂祥。我一直安慰自己荐虐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布丸凭。 她就那樣靜靜地躺著福扬,像睡著了一般腕铸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上铛碑,一...
    開(kāi)封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天狠裹,我揣著相機(jī)與錄音,去河邊找鬼汽烦。 笑死涛菠,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的撇吞。 我是一名探鬼主播俗冻,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼牍颈!你這毒婦竟也來(lái)了迄薄?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤煮岁,失蹤者是張志新(化名)和其女友劉穎讥蔽,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體人乓,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡勤篮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了色罚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碰缔。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖戳护,靈堂內(nèi)的尸體忽然破棺而出金抡,到底是詐尸還是另有隱情,我是刑警寧澤腌且,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布梗肝,位于F島的核電站,受9級(jí)特大地震影響铺董,放射性物質(zhì)發(fā)生泄漏巫击。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一精续、第九天 我趴在偏房一處隱蔽的房頂上張望坝锰。 院中可真熱鬧,春花似錦重付、人聲如沸顷级。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)弓颈。三九已至帽芽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間翔冀,已是汗流浹背导街。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留橘蜜,地道東北人菊匿。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像计福,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子徽职,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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