uni-app開發中的#ifdef MP是什么意思?條件編譯


跨端兼容https://uniapp.dcloud.io/platform

uni-app 已將常用的組件、JS API 封裝到框架中,開發者按照 uni-app 規范開發即可保證多平台兼容,大部分業務均可直接滿足。

但每個平台有自己的一些特性,因此會存在一些無法跨平台的情況。

大量寫 if else,會造成代碼執行性能低下和管理混亂。編譯到不同的工程后二次修改,會讓后續升級變的很麻煩。在 C 語言中,通過 #ifdef#ifndef的方式,為 windowsmac 等不同 os 編譯不同的代碼。 uni-app 參考這個思路,為 uni-app 提供了條件編譯手段,在一個工程里優雅的完成了平台個性化實現。

條件編譯條件編譯是用特殊的注釋作為標記,在編譯時根據這些特殊的注釋,將注釋里面的代碼編譯到不同平台。

寫法:以 #ifdef 或 #ifndef 加 %PLATFORM% 開頭,以 #endif 結尾。

#ifdef:if defined 僅在某平台存在
#ifndef:if not defined 除了某平台均存在
%PLATFORM%:平台名稱

#ifdef APP-PLUS
需條件編譯的代碼
#endif
僅出現在 App 平台下的代碼
#ifndef H5
需條件編譯的代碼
#endif
除了 H5 平台,其它平台均存在的代碼
#ifdef H5 || MP-WEIXIN
需條件編譯的代碼
#endif

APP-PLUS App HTML5 規范APP-PLUS-NVUE App nvue Weex 規范H5 H5
MP-WEIXIN 微信小程序 微信小程序MP-ALIPAY 支付寶小程序 支付寶小程序MP-BAIDU 百度小程序 百度小程序MP-TOUTIAO 頭條小程序 頭條小程序MP-QQ QQ小程序 (目前僅cli版支持)MP 微信小程序/支付寶小程序/百度小程序/頭條小程序/QQ小程序

支持的文件

.vue.js.csspages.json各預編譯語言文件,如:.scss、.less、.stylus、.ts、.pug

注意: 條件編譯是利用注釋實現的,在不同語法里注釋寫法不一樣,js使用 // 注釋、css 使用 /* 注釋 */、vue/nvue 模板里使用 <!-- 注釋 -->;

API 的條件編譯

// #ifdef  %PLATFORM%

平台特有的API實現

// #endif

示例,如下代碼僅在 App 下出現:

file

示例,如下代碼不會在 H5 平台上出現:

file

除了支持單個平台的條件編譯外,還支持多平台同時編譯,使用 || 來分隔平台名稱。

示例,如下代碼會在 App 和 H5 平台上出現:

file

組件的條件編譯

<!--  #ifdef  %PLATFORM% -->
平台特有的組件
<!--  #endif -->

示例,如下廣告組件僅會在微信小程序中出現:

file

樣式的條件編譯

/*  #ifdef  %PLATFORM%  */
平台特有樣式
/*  #endif  */

注意: 樣式的條件編譯,無論是 css 還是 sass/scss/less/stylus 等預編譯語言中,必須使用 /注釋/ 的寫法。

pages.json 的條件編譯下面的頁面,只有運行至 App 時才會編譯進去。

file

static 目錄的條件編譯在不同平台,引用的靜態資源可能也存在差異,通過 static 的的條件編譯可以解決此問題,static 目錄下新建不同平台的專有目錄(目錄名稱同 %PLATFORM% 值域,但字母均為小寫),專有目錄下的靜態資源只有在特定平台才會編譯進去。

如以下目錄結構,a.png 只有在微信小程序平台才會編譯進去,b.png 在所有平台都會被編譯。

整體目錄條件編譯如果想把各平台的頁面文件更徹底的分開,也可以在uni-app項目根目錄創建platforms目錄,然后在下面進一步創建APP-PLUS、MP-WEIXIN等子目錄,存放不同平台的文件。

HBuilderX 支持HBuilderX 為 uni-app 的條件編譯提供了豐富的支持:

代碼塊支持

在 HBuilderX 中開發 uni-app 時,通過輸入 ifdef 可快速生成條件編譯的代碼片段正確注釋和快速選中

在 HBuilderX 中,ctrl alt / 即可生成正確注釋(js:// 注釋、css:/* 注釋 */、vue/nvue模板: )。

正確注釋和快速選中

在 HBuilderX 中,ctrl alt / 即可生成正確注釋(js:// 注釋、css:/* 注釋 */、vue/nvue模板: )。

注意Android 和 iOS 平台不支持通過條件編譯來區分,如果需要區分 Android、iOS 平台,請通過調用 uni.getSystemInfo 來獲取平台信息。在HBuilderX1.9.10起,支持ifios、ifAndroid代碼塊,可方便編寫判斷。

有些跨端工具可以提供js的條件編譯或多態,但這對於實際開發遠遠不夠。uni-app不止是處理js,任何代碼都可以多端條件編譯,才能真正解決實際項目的跨端問題。另外所謂多態在實際開發中會造成大量冗余代碼,很不利於復用和維護。舉例,微信小程序主題色是綠色,而百度支付寶小程序是藍色,你的應用想分平台適配顏色,只有條件編譯是代碼量最低、最容易維護的。

有些公司的產品運營總是給不同平台提不同需求,但這不是拒絕uni-app的理由。關鍵在於項目里,復用的代碼多還是個性的代碼多,正常都是復用的代碼多,所以仍然應該多端。而個性的代碼放到不同平台的目錄下,差異化維護。

❤️ 不要忘記留下你學習的腳印 [點贊 收藏 評論]

作者Info:

【作者】:Jeskson

【原創公眾號】:達達前端

【福利】:公眾號回復 “資料” 送自學資料大禮包(進群分享,想要啥就說哈,看我有沒有)!

【轉載說明】:轉載請說明出處,謝謝合作!~

大前端開發,定位前端開發技術棧博客,PHP后台知識點,web全棧技術領域,數據結構與算法、網絡原理等通俗易懂的呈現給小伙伴。謝謝支持,承蒙厚愛!!!

若本號內容有做得不到位的地方(比如:涉及版權或其他問題),請及時聯系我們進行整改即可,會在第一時間進行處理。

請點贊!因為你們的贊同/鼓勵是我寫作的最大動力!

歡迎關注達達的CSDN!

這是一個有質量,有態度的博客

前端技術棧


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM