一、微信小程式是什麼:
言歸正傳,微信小程式的本質是什麼?個人理解微信小程式本質還是一套前端框架,微信團隊基於原來第三方h5頁面在微信裡只能透過h5實現原本可以由native實現的功能,例如上傳圖片等。進而採取的開放部分jsbridge的api來方便開發者。不過既然身為大廠肯定不會只開放部分jsbridge的api就完了,順便微信類似vue、react一樣實作了一套自己的mvvm的框架就是目前的微信小程式。官方文件這樣描述:框架提供了自己的視圖層描述語言WXML 和WXSS,以及基於JavaScript 的邏輯層框架,並在視圖層與邏輯層間提供了資料傳輸和事件系統,可以讓開發者可以方便的聚焦在資料與邏輯上。
本質還是一套前端框架,程式碼最終將會打包成一份 JavaScript並在小程式啟動的時候運行,直到小程式銷毀。模版語法類似vue,接近原生的自訂標籤。 資料綁定和渲染類似vue的語法,不過是以wx:開頭(vue 以v: 作為識別) 事件系統類似react一樣定義了一套自己的事件系統。
二、微信運行環境:
微信小程式運行在三端:iOS、Android 和用於偵錯的開發者工具
在iOS 上,小程式的javascript 程式碼是運行在JavaScriptCore 中
在Android 上,小程式的javascript 程式碼是透過X5 核心來解析
在開發工具上,小程式的javascript 程式碼是運行在nwjs(chrome核心) 中
頁面的腳本邏輯是在JsCore中運行,JsCore是沒有視窗物件的環境,所以不能在腳本中使用window等bom對象。所以類似jquery、zepto等透過window或是document來取得dom物件的函式庫是不能用來使用的。
三、目錄結構:
小程式包含一個描述整體程式的 app 和多個描述各自頁面的 page。
一個小程式主體部分由三個檔案組成,必須放在專案的根目錄,如下:
app.js 邏輯部分,即全域變數或方法
app.json 公共配置,包括頁面配置等,頂部底部tab的設置,背景顏色等
app.wxss 公共樣式表可以被具體page樣式覆蓋
app.js程式碼(程式碼取自微信官方demo)和註解說明如下:
//app.js // 微信小程序就是调用微信开放jsbridge,来完成微信h开发中某些原本比较难的功能的特定的微信前端框架 /** * app 即小程序的生命周期管理。 * */ App({ // 初始化 onLaunch: function () { //调用API从本地缓存中获取数据 var logs = wx.getStorageSync('logs') || [] logs.unshift(Date.now()) wx.setStorageSync('logs', logs) }, // 全局方法或者变量,可在不同page中使用 getUserInfo:function(cb){ var that = this if(this.globalData.userInfo){ typeof cb == "function" && cb(this.globalData.userInfo) }else{ //调用登录接口 wx.login({ success: function () { wx.getUserInfo({ success: function (res) { that.globalData.userInfo = res.userInfo typeof cb == "function" && cb(that.globalData.userInfo) } }) } }) } }, globalData:{ userInfo:null } })
{ "pages":[ "pages/index/index", "pages/logs/logs", "pages/swiper/swiper", "pages/input/input", "pages/form/form" ], "window":{ "navigationBarBackgroundColor": "#ffffff", "navigationBarTextStyle": "black", "navigationBarTitleText": "微信小程序", "backgroundColor": "#eeeeee", "backgroundTextStyle": "light" }, "tabBar":{ "borderStyle": "white", "list": [{ "pagePath": "pages/index/index", "iconPath":"image/icon_API.png", "selectedIconPath":"image/icon_API_HL.png", "text": "首页" },{ "pagePath": "pages/form/form", "iconPath":"image/plus.png", "selectedIconPath":"image/green_tri.png", "text": "更多" }, { "pagePath": "pages/swiper/swiper", "iconPath":"image/icon_COM.png", "selectedIconPath":"image/icon_COM_HL.png", "text": "其他" } ] } }
具體頁面一般包含一下檔案(與全域檔案類似,不過僅僅作用於該頁面):
.js 頁面邏輯就是js沒什麼差別
.wxml 頁面結構對應html,但應用了不少自訂標籤
.wxss 頁面樣式表對應css文件,優先權比appapp.wxss高,css的寫法並未完全支援
.json 頁面配置指定特定頁面的title等元素
#為了方便開發者減少設定項,規定描述頁面的這四個檔案必須具有相同的路徑與檔案名稱。
也就是說,我們不用指定某個頁面對應的js或wxss文件,只需要保持路徑和檔案名稱相同即可。
四、模版語言及事件系統
1):模版語法類似vue,接近原生的自訂標籤。資料綁定與渲染類似vue的語法,不過是以wx:開頭(vue 以v: 作為標識)
/** * 类似vue的条件渲染语法,熟悉vue的话应该不会陌生 **/ <view wx:if="{{condition}}"> </view>
2):事件系統
事件系統類似react:定義了一套自己的事件系統。包含一系列常用事件類型:
touchstart 手指觸摸動作開始
touchmove 手指觸摸後移動
touchcancel 手指觸摸動作被打斷,如來電提醒,彈出窗口
touchend 手指觸摸動作結束
tap 手指觸摸後馬上離開
longtap 手指觸摸後,超過350ms再離開
綁定方式:事件綁定的寫法同元件的屬性,以key+value 的形式:
以bind或catch開頭,然後跟上事件的類型,如bindtap catchtouchstart,
value 是一個字串,需要在對應的Page 中定義同名的函數。不然觸發事件的時候會報錯。
bind事件綁定不會阻止冒泡事件向上冒泡,catch事件綁定可以阻止冒泡事件向上冒泡 。例如:
/** *bind/catch +事件类型,两种事件绑定方式 */ <view id="outter" bindtap="handleTap1"> outer view <view id="middle" catchtap="handleTap2"> middle view <view id="inner" bindtap="handleTap3"> inner view </view> </view> </view>
3):事件對象:包括BaseEvent 基礎事件對象,CustomEvent 自訂事件對象,TouchEvent 觸碰事件對像等。
五、優缺點:
1):優點
1、提供對應的類似jsbridge的支持,使得某些功能更為方便
2、本質是mvvm的前端框架,簡化操作。
3、提供了比較成型的元件庫,建構比較方便
4、基於微信appapp,使得開發成本下降
5.支援模組化
2):缺點
1、由於框架並非運行在瀏覽器中,因此js相關bom的方法無法使用。如 document,window等。不過可以取得當前事件對應的dom物件。相比react還是一樣不建議操作dom,jq,zepto等工具庫也不好使了
2、又是一套自己的語法,需要學習時間,不過學習曲線不陡峭
3、目前不支援直接引入node_modules ,開發者需要使用到node_modules時候建議拷貝出相關的程式碼到小程式的目錄中這樣限制就比較大了,需要自己手動的東西好多
以上是關於微信小程式開發介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!