我們在進行小程式開發時,不可避免的需要根據不同版本,進行相容性處理,可是有百度APP的版本,有swan.js的版本,TA們之間到底有什麼樣的關係,我們又要如何做版本相容呢?今天的文章,將帶領我們一起去探索答案~
百度APP版本 和 swan.js版本的區別和關聯
首先,百度智慧小程式版本相關有百度APP版本和swan.js版本兩個概念。
百度APP版本就是app本身的版本;
swan.js版本是百度智慧小程式前端框架的版本,以客戶端版本為主,這兩者有規定的對映關係。
作為開發者,我們只需要關注 swan.js即可哦~
這裡把百度APP的四位版本定義為a.b.c.d,swan.js的三位版本定義為x.y.z。
在“11.0.x.x”的百度APP版本之前,swan.js版本的第一位與APP版本相差9,即:x=a-9。
第二位與APP版本相同即:y=b。
第三位隨版本遞增。具體對映如下表:
百度APP版本 | swan.js版本 |
---|---|
10.12.x.x | 1.12.x |
10.13.x.x | 1.13.x |
在“11.0.x.x”的百度APP版本之後,對映關係改為swan.js版本的第一位保持不變:x=a-9。
第二位變為百度APP版本的第二位乘10加第三位即:y=b*10+c。
第三位隨版本遞增。具體對映如下表:
百度APP版本 | swan.js版本 |
---|---|
11.0.5.x | 2.5.x |
11.5.5.x | 2.55.x |
如何相容
大多數需要相容的場景有如下兩種,下面會列出解決方法。
1、相容判斷當前環境是否能使用某一API或某一元件或某一元件屬性; 下文簡稱第一種場景。
2、某一API或某一元件屬性在一個版本的返回值或表現與官方文件不一致;下文簡稱第二種場景。
針對第一種場景
可以通過canIUse或getSystemInfo方法判斷想要使用的API或元件屬性在當前環境是否可用。
具體操作如下所示:
1、使用canIUsecanIUse是非常建議大家使用的一種方法 ,一般是針對小程式框架本身的,用來判斷智慧小程式的API、回撥、引數、元件和元件屬性等是否在當前版本可用:
// 判斷scroll-view元件的scroll-x屬性在當前版本能否使用
if (swan.canIUse('scroll-view.scroll-x')) {
// 支援時的程式碼邏輯...
}
else {
// 不支援時的程式碼邏輯...
}複製程式碼
2、使用getSystemInfo或getSystemInfoSyncgetSystemInfo可以獲取系統資訊,包括百度APP版本和swan.js版本,通過獲取當前swan.js版本和想要使用的API或元件屬性支援的版本進行比對,總而得到是否可用的結論。
// swan.request要求swan.js版本大於1.8.5,獲取當前swan.js版本後比對
if (swan.getSystemInfoSync().SDKVersion > '1.8.5') {
// 支援時的程式碼邏輯...
}
else {
// 不支援時的程式碼邏輯...
}複製程式碼
針對第二種場景
若發現在某一swan.js版本API的返回或元件的表現與官方文件不一致,那可能是我們的bug,請儘快反饋給我們。
在我們解決上線之前,有些問題開發者們可以通過使用上面getSystemInfo或getSystemInfoSync方法獲取版本,比對是否是有問題的版本來做一些相容處理。
例如:API返回資料物件的key不統一或返回資料的型別不統一等。
下面假設uploadFile進度回撥中的progress屬性在swan.js的1.10.12版本中傳回是string型別,而不是官方文件上標註的number型別時可以這麼處理:
const uploadTask = swan.uploadFile({
url: 'https://smartprogram.baidu.com/xxx', //開發者伺服器 url
filePath: res.tempFilePaths[0], // 要上傳檔案資源的路徑
name: 'myfile'
});
uploadTask.onProgressUpdate(res => {
let progress = res.progress;
// 判斷如果是1.10.12版本,轉換一下型別
if ('1.10.12' === swan.getSystemInfoSync().SDKVersion) {
progress = +progress;
}
// 拿到獲取的progress做的一系列操作...
});複製程式碼