微信小程式,一個有侷限的類似 React Native 輪子
微信小程式就是一個類似RN的輪子,可以快速開發,有一定的適用場景,但是也有其侷限性。(結論是基於微信小程式的示例程式碼做的解讀,可能存在謬誤。
文末有好奇心日報小程式的二維碼,歡迎圍觀。
2016年11月25日 更新
更新一些最新的認識和進展。
首先微信小程式不是純原生應用,是一種奇怪Hybrid模式,之前的觀點是錯的,那麼為什麼是奇怪的混合模式呢?看下圖:
Paste_Image.png
上圖中的輔助線表示一個單獨的原生view(原生view:原生頁面渲染的最小的元件,webivew、list、imageview都是它的子類),顯然,除了app.json配置的元件之外,內容部只包含一個view,也就是說,內容部分並不是有多個原生view組合而成的,所以內容部分應該是微信定製化的一個webview元件。
更新一些新遇到的微信小程式的問題以及解決方案:
✦ 微信小程式的swiper可以設定vertical,文件不寫也是醉了。
✦ 微信小程式的事件不能阻止,所以不能實現完美效果的fullpage,會出現上下拉扯的感覺,因為無法阻止父節點的touch事件。
✦ 最新的微信開發工具移除了promise,建議手動引入es6-promise。突然移除某些功能略坑啊。
// 將常規的網路請求封裝成promise模式
import Promise from '../vendor/es6-promise.js';
functionrequest(method = 'GET') {
return function (url, data = {}) {
return new Promise(function(resolve, reject) {
wx.request({
url,
data,
method,
header: {
'Content-Type': 'application/json'
},
success: function(res ) {
resolve(res.data)
},
fail: function(err) {
reject(err)
}
});
})
}
}
export const get = request('GET');
export const post = request('POST');
export const put = request('PUT');
export const del = request('DELETE');
✦ 對於原生API,想要promise的話,可以使用如下程式碼
import Promise from '../vendor/es6-promise.js';
module.exports = (api) => {
return (options, ...params) => {
return new Promise((resolve, reject) => {
api(Object.assign({}, options, { success: resolve, fail: reject }), ...params);
});
}
}
// 使用
const getLocation = promisify(wx.getLocation);
2016年11月15日 更新
最近嘗試了下小程式,之前的猜測和判斷完全正確。
早先看到很多“權威人士”說是Hybrid模式,一度懷疑自己部落格的準確性,擔心誤導別人,所以額外備註可能存在謬誤,目前來看,這篇部落格的判斷比市場上大部分部落格的判斷都準確。
簡單總結下觀點:
✦ 微信小程式是原生應用,是React Native和weex類似的模式
✦ 微信小程式的生態除了官方提供的元件和API,幾乎沒有其他的元件。所以部分“複雜”的功能,開發起來真的很複雜。
✦ 微信小程式只能執行在微信中。
✦ 由於微信的限制,微信小程式應用場景極度有限。
大家想知道微信小程式能幹什麼?對比服務號就知道了,比如訂票、航旅資訊、ToDoList、天氣日曆、星座、理財、實時點菜系統等,核心是低頻但重要的需求。而且微信不允許分享(導流),不允許連結(導流或廣告),所以想要靠微信朋友圈爆發的小機靈被徹底被澆滅了,媒體也不適合微信小程式。
此外,不得不吐槽一下微信和微信小程式:
✦ 微信小程式的官方文件寫得不完善,很多方面沒有覆蓋。
如何定義一個元件;
無法使用less或者sass之類的預編譯;
wxml沒得到主流編輯器的支援,導致開發速度偏慢;
想要解決less和wxml問題?可以參考這個:wxapp-redux-starter;
✦ 微信小程式的開發工具極不穩定。
和shadowsocks等VPN衝突;
經常無故卡死;
開發工具和真機表現偶爾會有差異;
有時候程式碼無故不生效,需要重啟才行;
沒有類似HMR的機制導致經常重新整理;
除錯工具不好用等等。
✦ 微信小程式的生態和問答社群幾乎為零。
微信的生態為零,導致部分功能開發起來吃力,比如解析富文字。
微信的問答社群就更差了,遇到問題全靠猜,實在找不到辦法就重啟。
✦ 微信小程式的應用場景太受限,和微信的一貫保守風格很像,或許以後會慢慢放開,慢慢期待吧。
以上觀點是站在一個普通開發者對微信小程式的看法,相反,從微信角度出發,某些限制和規範的確很有必要。希望大家客觀對待微信小程式。
============ 分割線 ============
本文針對微信小程式的示例程式碼進行分析,告訴大家:
微信小程式到底提供了什麼?
開發微信小程式方便麼?
微信小程式具體適用場景?
最後還自作主張的說了點對於微信小程式的個人觀點。
微信小程式都提供了什麼?
微信小程式主要為我們提供了兩部分東西:底層API 和 元件,不僅如此,微信小程式還引入新的檔案格式。
引入了新的檔案格式
微信小程式並不是傳統意義的H5頁面,微信定義了新的檔案格式,然後對這些檔案做編譯解析,所以微信小程式是原生應用!是基於微信的原生應用!微信正式嘗試做一個OS!
微信小程式元件
上圖是一個wx-action-sheet元件,檔案應用了新的字尾。
其中wxml功能和HTML類似,wxss功能和CSS類似,JS包含元件邏輯。這點是不是和RN/weex很像?
微信提供了一套基礎元件庫
微信為微信小程式提供了一套基礎元件庫,可以滿足開發的基礎開發需求,從而實現簡單的快速開發,至於這些基礎元件支援多大程度的自定義,以及能否滿足實際專案的需求,留給後續開發者去體驗吧。
基礎元件庫主要分為四類:
控制元件(controller)主要包括:action-sheet
/ button
/ searchbar
/ modal
/ navigator
/ drawer
表單(form)主要包括:checkbox
/ radio
/ form
,selector
/ switch
/ slider
/ input
/ label
/ picker
媒體(media)主要包括:image
/ audio
/ video
檢視(view)主要包括:progress
/ toast
/ scroll-view
/ text
/ view
/ mask
/ icon
/ spinner
/ swiper
/ slide-tab
恩,這些元件不用介紹大家也都知道大概是什麼功能了,幾乎是每個UI元件庫都必備的。以後大家應該都基於這個元件庫去開發具體的產品,和RN/weex不同的是,微信小程式多半隻能基於微信提供的元件進行個性化封裝了,而不能基於系統元件進行個性化封裝,原因很簡單,因為微信就是一個“系統”。
微信是一個“系統”
我們挑一個稍微複雜的picker元件示例來分析分析:
// wx-picker.wxml檔案
<viewclass="page"><viewclass="page__hd"><textclass="page__title">picker</text><textclass="page__desc">選擇器</text></view><viewclass="page__bd"><viewclass="section"><viewclass="section__title">地區選擇器</view><pickerbindchange="bindPickerChange"value="{{index}}"range="{{array}}"><viewclass="picker">
當前選擇:{{array[index]}}
</view></picker></view><viewclass="section"><viewclass="section__title">日期選擇器</view><pickermode="date"value="{{date}}"start="2015-09-01"end="2017-09-01"bindchange="bindDateChange"><viewclass="picker">
當前選擇: {{date}}
</view></picker></view></view></view>
是的,所有的標籤都是自定義標籤,進一步佐證了微信小程式是原生應用,元件使用很簡單,所以很適合快速開發。
// wx-picker.js 檔案
Page({
data: {
array:["中國","美國","巴西","日本"],
index:0,
date:"2016-09-01"
},
bindPickerChange: function(e) {
console.log('picker傳送選擇改變,攜帶值為', e.detail.value)
this.setData({
index: e.detail.value
})
},
bindDateChange:function(e){
this.setData({
date:e.detail.value
})
},
bindTimeChange:function(e){
this.setData({
time:e.detail.time
})
}
})
也很清晰,通過this.setData來設定屬性,實現action-sheet的顯示與隱藏切換。React的感覺,連API都很像。
// wx-picker.wxss
.picker{
padding: 13px;
background-color: #FFFFFF;
}
可以重新設定微信小程式的元件樣式,和CSS很相似,輕量簡潔。
底層API
沒有提供底層API的基礎元件庫都是流氓庫,有了底層API才能開發真正的原生應用,才能做更多豐富的功能。
其中底層API包括:animation
/ backgronud-audio
/ canvas
/ download-file
/ file
/ get-location
/ get-network-type
/ get-system-info
/ get-user-info
/ image
/ login
/ navigation-bar-loading
/ navigator
/ on-accelerometer-change
/ on-compass-change
/ open-location
/ pull-down-refresh
/ request
/ request-payment
/ set-navigation-bar-title
/ storage
/ upload-file
/ voice
/ web-socket
從名字也能看出大概,提供了比較完整的API,能夠開發更豐富的功能和程式。
我們仍然挑一個稍微複雜點的圖片相關的API使用示例來分析分析:
// image.wxml檔案
<importsrc="../common/header.wxml" /><importsrc="../common/footer.wxml" /><viewclass="container"><templateis="header"data="{{title: 'choose/previewImage'}}"/><viewclass="page-body"><viewclass="page-body-wrapper"><formbindsubmit="openLocation"><viewclass="page-body-form"><pickerrange="{{sourceType}}"bindchange="sourceTypeChange"value="{{sourceTypeIndex}}"><viewclass="page-body-form-picker"><viewclass="page-body-form-picker-key">圖片來源</view><viewclass="page-body-form-picker-value">{{sourceType[sourceTypeIndex]}}</view></view></picker><pickerrange="{{sizeType}}"bindchange="sizeTypeChange"value="{{sizeTypeIndex}}"><viewclass="page-body-form-picker"><viewclass="page-body-form-picker-key">圖片質量</view><viewclass="page-body-form-picker-value">{{sizeType[sizeTypeIndex]}}</view></view></picker><pickerrange="{{count}}"bindchange="countChange"value="{{countIndex}}"><viewclass="page-body-form-picker"style="border-bottom: none;"><viewclass="page-body-form-picker-key">數量限制</view><viewclass="page-body-form-picker-value">{{count[countIndex]}}</view></view></picker></view><viewclass="images-wrapper"><textclass="images-text">請選擇圖片</text><viewclass="images-list"><blockwx:for-items="{{imageList}}"wx:for-item="image"><imagesrc="{{image}}"class="images-image"data-src="{{image}}"bindtap="previewImage"></image></block><imagesrc="/image/plus.png"class="images-image images-image-plus"bindtap="chooseImage"></image></view></view></form></view></view><templateis="footer" /></view>
簡單清晰wxml,居然讓選擇圖片並預覽實現起來這麼簡單。並且可以通過簡單的template語法來引入其他wxml檔案。
// image.js 檔案
var sourceType = [ ['camera'], ['album'], ['camera', 'album'] ]
var sizeType = [ ['compressed'], ['original'], ['compressed', 'original'] ]
Page({
data: {
sourceTypeIndex: 0,
sourceType: ['拍照', '相簿', '拍照或相簿'],
sizeTypeIndex: 0,
sizeType: ['壓縮', '原圖', '壓縮或原圖'],
countIndex: 0,
count: [1, 2, 3, 4, 5, 6, 7, 8, 9]
},
sourceTypeChange: function (e) {
this.setData({
sourceTypeIndex: e.detail.value
})
},
sizeTypeChange: function (e) {
this.setData({
sizeTypeIndex: e.detail.value
})
},
countChange: function (e) {
this.setData({
countIndex: e.detail.value
})
},
chooseImage: function () {
var that = this
wx.chooseImage({
sourceType: sourceType[this.data.sourceTypeIndex],
sizeType: sizeType[this.data.sizeTypeIndex],
count: this.data.count[this.data.countIndex],
success: function (res) {
console.log(res)
that.setData({
imageList: res.tempFilePaths
})
}
})
},
previewImage: function (e) {
var current = e.target.dataset.src
wx.previewImage({
current: current,
urls: this.data.imageList
})
}
})
因為微信對這個API已經封裝得很好了,所以使用起來只需要傳入幾個引數,繫結一下回調函式即可。
// image.css 檔案
.images-wrapper {
padding: 20rpx;
background-color: #fff;
margin-top: 20rpx;
}
.images-wrapper-text {
font-size: 28rpx;
}
.images-list {
display: flex;
margin-top: 20rpx;
flex-wrap: wrap;
}
.images-image {
width: 150rpx;
height: 150rpx;
margin: 10rpx;
}
.images-image-plus {
border: 1px solid #999;
}
同樣,樣式通過類似CSS的語法,從上面的rpx單位可以看出,這不是真正的CSS,我猜測是CSS的子集,類似RN。
開發微信小程式方便麼?
微信小程式的開發目錄結構
WX的開發目錄結構也很清晰簡單。
相關推薦
微信小程式,一個有侷限的類似 React Native 輪子
微信小程式就是一個類似RN的輪子,可以快速開發,有一定的適用場景,但是也有其侷限性。(結論是基於微信小程式的示例程式碼做的解讀,可能存在謬誤。 文末有好奇心日報小程式的二維碼,歡迎圍觀。 2016年11月25日 更新 更新一些最新的認識和進展。 首先微信小程式不是純原生應用
移動開發 微信小程式,一個有侷限的類似 React Native 輪子!
先丟擲結論:微信小程式就是一個類似RN的輪子,可以快速開發,有一定的適用場景,但是也有其侷限性。 本文針對微信小程式的示例程式碼進行分析,告訴大家: 微信小程式到底提供了什麼? 開發微信小程式方便麼? 微信小程式具體適用場景? 最後還自作主張的說了點對於微信小程
7個黑科技十足的微信小程式,每一個都能讓你念念不舍!
微信上最為出名的想必就最為小程式了!基本上與現有的軟體也就相差毫幾,有些人為了免下軟體幾乎都用上了,那為什麼有那麼多人都鍾愛於小程式呢?其關鍵原因就是方便,只要用微信一個軟體,就可以隨意使用任何小程式了! 那麼今天小編在這裡就為大家分享7個非常好用的微信小程式,個個都黑科技十足!讓你念念不舍。
5個伴你成長的微信小程式,每一個都是一等一的小能手!
每個小程式的出現都各有各的用途,而每個小程式也不可能都深受大家的討厭,也不可能大家都會喜歡,各有各的好,用的上就不錯,所以,今天給大家分享5個伴你成長的微信小程式,希望大家能夠喜歡。 1.實驗樓 一款海量學習課程的工具 這款小程式的分類是非常明確的,所包含的課成也是對大家有幫助的,如we
微信小程式,如何在返回前一個頁面時,執行前一個頁面的方法
var pages = getCurrentPages(); // 當前頁面 var beforePage = pages[pages.length - 2]; // 前一個頁面 // console.log("beforePage"); // console.log
【程式碼】微信小程式 簡單一個頁面,網上圖片展示
//wxss/* 基礎樣式 */ view,scroll-view,swiper,swiper-item,icon,text,progress,button,checkbox-group,checkbox,form,input,label,picker,radio-group
微信小程式,返回資料給上一介面
我們知道微信官方文件中教我們如何把當前介面的資料傳輸到要跳轉的下一介面中,那麼如何在下一介面返回當前介面時把資料返回來呢? 假設上一介面為A,對應的A.js中有一段這樣的程式碼: 頁面({ data:{ 物件:'', } }) 下一介面為B,對應的B.js中有這個方法:
推薦一款智慧黑科技微信小程式,簡直不要太良心!
生活中我們會經常用到微信,但是你們知道微信除了用來聊天,裡面的小程式功能也是十分強大的,今天推薦的這款小程式的名字叫做多媒體AI平臺。裡面提供了多種智慧AI能力,不僅能學習還能解決很多生活中的小問題。 我們點開我們的小程式,搜尋“多媒體AI平臺” 這裡面與很多的黑科技應用,裡面的內容識
微信小程式,精選Demo合集,你確定不要嗎?
小編最近在開發小程式,也讀到了不少優秀的小程式原始碼,專案中有些需求可以直接從原始碼裡貼上複製過來,雖然這樣做不利於自己獨立編寫程式碼,但比較是給公司做專案啊,秉著效率第一的原則,簡直沒有什麼比ctrl+c,ctrl+v,更加順手了。為了感恩大家長久以來的關注和支援,小編準備了一些福利,整理了130
5款小巧有趣的微信小程式,個個讓你心花怒放!
自從小程式火爆之後,可謂是無所不知,無所不曉,現在小程式已經走進了千萬家,小程式之所以能夠獲得大家的喜愛,主要還是因為它小巧,方便快捷,不用下載就可以使用,完全不佔用手機空間,所以今天小編給大家分享幾個很實用的微信小程式。 1.動動文字 一款純文字動態表情製作神器 總結:這款微信小程式是聊天、耍
4個無敵好用的微信小程式,用了你都離不開
自從有了微信小程式,平均每天開啟微信的次數在急劇增加,因為微信小程式,無需下載,無需安裝,不佔手機記憶體,卻還有和手機APP同樣強大的功能,讓很多人受益。以下是我手機裡4個無敵好用的微信小程式,用了保證你都離不開。 1.胖次工具箱 一個簡潔、無廣告的多功能工具箱 這個小程式真的是
4個別人都愛用的微信小程式,快來親自體驗一下啦!
自從小程式正式啟用後,小程式可以幫我們解決不少難題了,它的最大好處就是不用下載,使用起來方便快速,因此獲得了很多朋友的喜愛,今天為大家整理了5個超棒的微信小程式,還沒用用過的朋友可以使用一下哦! 1.王大嬸冥想 這是一個與智慧機器人聊天的冥想小程式,王大嬸兒用聊天對話的形式提供多種服務,有煩
微信小程式,圖片上傳在java後端接收不到圖片的問題
在使用小程式的圖片上傳時,發現一直接收不到圖片,最後找到問題是Spring-mvc.xml配置檔案對圖片進行了預處理,所以導致沒有接收到。將配置檔案 <bean id="multipartResolver" class="or
5個功能逆天的微信小程式,每個都相見恨晚!
微信小程式,越來越受到大眾的喜愛,不僅僅是因為它無需下載,不佔記憶體,重要的是它們真的很實用! 強烈推薦5個超實用的微信小程式,值得每一個人收藏! 享物說 一款積分制物品免費贈送平臺,平臺的使用者既包括個人也包括商戶,你既可以贈送你閒置的東西,也可以釋出任務讓別人幫你做,也可以免費領取你需要的
微信小程式,如何去掉或修改button的邊框、圓角
在寫微信小程式的時候遇到了這樣的問題: index.wxml檔案設定按鈕: <button>按鈕</button> i
用微信小程式寫一個類似購物車增減元件
最終效果如圖,這次是寫一個單獨元件,可以多頁面複用 目錄結構如圖 cart是寫的組建,logs引用cart組建 logs.json { "navigationBarTitleText": "檢視啟動日誌", "usingComponents": {
微信小程式,全域性樣式(總的樣式)和區域性樣式(頁面樣式)的用法和區別。
首先,全域性樣式寫在app.wxss裡面, 當然,頁面樣式當然寫在各個頁面的樣式裡, 第二 ,呼叫全域性樣式需要在你寫的類後面或前面加上你全域性樣式定義的類,(樣式的類越排後面,優先順序越高!) 比如: 這是我定義的全域性樣式 然後我要在區域性樣式裡呼叫
微信小程式匯入已有專案
1.雙擊“微信web開發者工具”:2.選擇“小程式專案”:3.會出現管理專案,和一個+號:在管理專案中有個“新增”,也可以點選+號:4.會出現新增頁面,選擇專案目錄,填入專案名稱以及appId5.可以選擇無appId點選確認,就將專案匯入成功了。注:需要選擇目錄為src原始碼
用微信小程式寫一個計算器
下面是用微信小程式寫的一個簡單的計算器,又興趣的小夥伴可以瞭解一下。 頁面部分 <view class='box'> <view class='txt'>{{screenNum}}</view> <v
5個值得信賴的微信小程式,好用到任你挑選!
微信是我們常用工具之一,也是手機中常用的一款軟體,而在微信中,我們都知道里面隱藏一個小程式功能,人們喜歡小程式的原因在於無需下載,點開即可使用,所以了,今天為大家分享5個值得使用微信小程式,都是大家所需要的。 1.慈懷讀書 一款內容豐富的線上閱讀工具 這款小程式中有著豐富的閱讀內容,