uni-app-條件註釋
<!-- #ifdef %PLATFORM% -->
平臺特有的元件
<!-- #endif -->
示例,如下公眾號關注元件僅會在微信小程式中出現:
<view>
<view>微信公眾號關注元件</view>
<view>
<!-- uni-app未封裝,但可直接使用微信原生的official-account元件-->
<!-- #ifdef MP-WEIXIN -->
<official-account></official-account>
<!-- #endif -->
</view>
</view>
樣式的條件編譯
/* #ifdef %PLATFORM% */
平臺特有樣式
/* #endif */
注意:樣式的條件編譯,無論是 css 還是 sass/scss/less/stylus 等預編譯語言中,必須使用/*註釋*/
的寫法。
正確寫法
錯誤寫法
pages.json 的條件編譯
下面的頁面,只有執行至 App 時才會編譯進去。
不同平臺下的特有功能,以及小程式平臺的分包,都可以通過 pages.json 的條件編譯來更好地實現。這樣,就不會在其它平臺產生多餘的資源,進而減小包體積。
json的條件編譯,如不同平臺的key名稱相同,cli專案下開發者自己安裝的校驗器會報錯,需自行關閉這些校驗器對json相同key的校驗規則。如果使用HBuilderX的校驗器,無需在意此問題,HBuilderX的語法校驗器為此優化過。
static 目錄的條件編譯
在不同平臺,引用的靜態資源可能也存在差異,通過 static 的的條件編譯可以解決此問題,static 目錄下新建不同平臺的專有目錄(目錄名稱同%PLATFORM%
值域,但字母均為小寫),專有目錄下的靜態資源只有在特定平臺才會編譯進去。
如以下目錄結構,a.png
只有在微信小程式平臺才會編譯進去,b.png
在所有平臺都會被編譯。
┌─static │ ├─mp-weixin │ │ └─a.png │ └─b.png ├─main.js ├─App.vue ├─manifest.json └─pages.json
整體目錄條件編譯
如果想把各平臺的頁面檔案更徹底的分開,也可以在uni-app專案根目錄建立platforms
目錄,然後在下面進一步建立app-plus
、mp-weixin
等子目錄,存放不同平臺的檔案。
注意
platforms
目錄下只支援放置頁面檔案(即頁面vue檔案),如果需要對其他資源條件編譯建議使用static 目錄的條件編譯
HBuilderX 支援
HBuilderX 為uni-app
的條件編譯提供了豐富的支援:
程式碼塊支援
在 HBuilderX 中開發uni-app
時,通過輸入ifdef可快速生成條件編譯的程式碼片段
語法高亮
在 HBuilderX 中對條件編譯的程式碼註釋部分提供了語法高亮,可分辨出寫法是否正確,使得程式碼更加清晰(獨立js檔案需在編輯器右下角切換javascript es6+編輯器,獨立css檔案暫不支援高亮,但不高亮不影響使用)
正確註釋和快速選中
在 HBuilderX 中,ctrl+alt+/ 即可生成正確註釋(js:// 註釋
、css:/* 註釋 */
、vue/nvue模板:<!-- 註釋 -->
)。
點選ifdef或endif可快速選中條件編譯部分;點選左側的摺疊圖示,可摺疊條件編譯部分程式碼。
注意
- Android 和 iOS 平臺不支援通過條件編譯來區分,如果需要區分 Android、iOS 平臺,請通過呼叫 uni.getSystemInfo 來獲取平臺資訊。支援
ifios
、ifAndroid
程式碼塊,可方便編寫判斷。 - 有些跨端工具可以提供js的條件編譯或多型,但這對於實際開發遠遠不夠。uni-app不止是處理js,任何程式碼都可以多端條件編譯,才能真正解決實際專案的跨端問題。另外所謂多型在實際開發中會造成大量冗餘程式碼,很不利於複用和維護。舉例,微信小程式主題色是綠色,而百度支付寶小程式是藍色,你的應用想分平臺適配顏色,只有條件編譯是程式碼量最低、最容易維護的。
- 有些公司的產品運營總是給不同平臺提不同需求,但這不是拒絕uni-app的理由。關鍵在於專案裡,複用的程式碼多還是個性的程式碼多,正常都是複用的程式碼多,所以仍然應該多端。而個性的程式碼放到不同平臺的目錄下,差異化維護。
<template> <view> <button type="primary" @click="upload">上傳圖片</button> <image v-for="item in img_arr" :src="item" @click="preview(item)"></image> <!-- #ifdef H5 --> <view>旨在h5</view> <!-- #endif --> <!-- #ifdef MP-WEIXIN --> <view>旨在小程式</view> <!-- #endif --> </view> </template>