張小龍是以小程序的價值觀為出發點解釋產品開發的思路的,他認為應用號的形態大致為:“一種新的公眾號形態,這種形態下面用戶關注了一個公眾號,就像安裝了一個 APP 一樣。他要找這個公眾號的時候就像找一個 APP,在平時這個號不會向用戶發東西的,所以 APP 就會很安靜的存在那里,等用戶需要的時候找到它就好了,這樣的話我們可以嘗試做到讓更多的 APP 有一種更輕量的形態,但是又更好使用的一種形態來存在,這是我們在探討的一種新的公眾號形態,叫應用號。”
開發者應該從應用號的價值觀出發去思考產品的可能性。比如商城就太復雜而且不符合“用完即走”的價值觀,而比較成功的案例有摩拜單車、冷氣機的應用、微信支付等一些輕量級的應用。通過在微信里設計一個界面(頁面)或添加一個按鈕就可以去滿足用戶需求。
小程序融合了很多前端開發界的概念,但是并沒有采用任何一個框架,包括流行的REACT、VUE,還有CORDOVA。它不是三者中的任意一個,而是拼湊出一個新的框架。這個過程類似于:
小程序引入了一些很重要的現代化前端開發的概念,包括:
微信小程序一出來,大家都在猜測是基于什么技術,是 H5 還是原生。它的框架看起來既像 H5,又像原生。小程序寫的是 H5 代碼,但是它又不遵從 H5 的標準寫法。它很多方面借用了 Web 技術,但很多細節又不一樣。
前端開發者可以快速開發小程序,因為概念基本相同,如風格、Javascript 是一樣的。但具體接口不同,不能直接套用,一些事件的處理小程序有自己的標準。比如點擊一個按鈕,代碼需要去審核、發布請求等。
微信小程序整體是基于MINA框架,官方提供了很多已經封裝好的組件和API 供開發者調用,不僅包括一些常用的滾動視圖,按鈕,圖片組件,還提供了地圖(map)和畫布(canvas)組件,這讓未來小程序內嵌一些小游戲以及簡單的地圖應用成為可能。
MINA 組件
當然更值得注意的是微信所提供的API, 主要有一些網絡,媒體,數據類的API, 具體可以參照:http://wxopen.bcoder.cn/index-2.htm ,關于API,微信官方文檔是這么介紹的 “可以方便的調起微信提供的能力”, 也許微信會提供何種能力將是小程序發展的關鍵所在。
那么如何寫一個微信小程序呢?下面以一個同性交友平臺為例進行演示:
項目源碼地址:https://git.oschina.net/hayeah/tongxing
開發的首要前提是需要微信登錄,并且確保已經拿到了內側或者公測的資格。
微信開發者工具下載地址:https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/download.html
打開以后你會看到這樣的界面:
選擇小程序進入后就可以添加項目了:
左側為菜單欄,中間是編譯后的預覽界面,可以實時更新,右側是項目目錄。
微信小程序以頁面為主導將樣式,UI,邏輯分別放到這不同的三個文件中, 這樣開發微信小程序就變成了實現設計一個個小的頁面,而每個頁面又變成分別去實現各個組件的樣式,布局,邏輯,這種方式一定程度上減小了代碼的耦合程度。
微信小程序通過 wxss,js, wxml 文件來分別實現每個頁面的樣式,邏輯,視圖(UI),每個頁面都包括或缺省包括以上三個部分,其還有三個類似的全局文件,當某個頁面缺省時,會默認使用全局的樣式,不過建議全局文件只實現統一的風格和邏輯。
三個部分詳細介紹如下:
開發者需要將微信小程序的頁面樣式實現在一個個 .wxss 文件當中,一個頁面對應一個樣式文件,若空缺將使用 app.wxss(全局樣式)定義的默認樣式中的屬性。這里建議每個頁面實現一個樣式,app.wxss中只實現共有的風格。 wxss 支持絕大多數 css 所支持的樣式,還有一些特有的特性,你可以把它當作css 來寫。安卓開發的同學可以將他認為是定義了每個控件的Activity的 style.xml。 例如:
.profile-header__badge { background: #0068FF; color: #FFF; font-size: 10px; padding: 3px; }
則是定義了一個叫 profile-header_badge 的字體樣式,并指定了其背景顏色,字體顏色,字體大小以及字體到邊框的間距。
邏輯代碼主要實現在一個 .js 格式的文件中, 其中定義一些自己的業務邏輯,還可以接收UI傳遞過來的一些事件(參數)并進行處理,從而實現一些用戶交互。比如:
bindinput(e) { console.log("input", e.detail); this.setData({ newMessageText: e.detail.value }); },
就是獲取用戶輸入并且把用戶輸入的內容賦值給 newMessageText 變量, 之后只需要在UI相應控件上把其 binginput 事件鏈接到這個函數即可。
微信小程序還支持將一些通用邏輯抽象出來定義成函數,放在單獨的 js 文件中,只需寫好一個函數,再使用 module.exports 將其暴露給其他 js 文件即可。其他 js 文件使用前調用 require(path) 函數便可以通過類似于 Java 靜態函數(長得像)的方法直接調用了。
function sayHello(name) { console.log('Hello ' + name + '!') } module.exports = { sayHello: sayHello } var common = require('common.js') Page({ helloMINA: function() { common.sayHello('MINA') } })
UI 主要實現在一個以 .wxml 中的文件中,其實現方式與xml,html 類似,主要定義了頁面的控件類型,指定控件交互事件調用的邏輯,控件的風格類型。微信官方目前提供了一些基礎的控件給開發者使用。 使用 Mustache 語法綁定數據,支持條件渲染,列表渲染, 類似邏輯代碼的模塊化,也支持定義UI 模版以及引用,具體可以參考官方文檔。
<view class="profile-input"> <input placeholder="說說你的心情" value="{{newMessageText}}" bindfocus="bindfocus" bindinput="bindinput" bindchange="bindchange" bindblur="bindblur" /> </view>
如上則是設置了一個輸入框,其 bindinput 用戶輸入事件由 js 代碼中的 binginput 函數處理,也指定了 bindfocus,bingchange,bingdblur 的處理事件, 而其顯示的值由 newMessageText 變量決定。
代碼完成后就可以點擊項目選項,在界面上點擊預覽,就會彈出可以用注冊過的微信號真機預覽的二維碼,開發者可以在真機上進行測試。