詳解 微信小程序開發(fā)框架(MINA)
小程序MINA框架,及優(yōu)點(diǎn)
MINA框架:
小程序使用的是MINA框架,目的是通過簡單、高效的方式讓開發(fā)者可以在微信中開發(fā)具有原生App體驗(yàn)的服務(wù)。
MINA的核心是一個(gè)響應(yīng)的數(shù)據(jù)綁定系統(tǒng)。
整個(gè)系統(tǒng)分為兩塊:視圖層(view,描述語言wxml和wxss)和邏輯層(App Serice,基于 JavaScript)。這可以讓數(shù)據(jù)與視圖非常簡單的保持同步。當(dāng)做數(shù)據(jù)修改時(shí),只需要在邏輯層改數(shù)據(jù),視圖層就會(huì)做響應(yīng)的更新。開發(fā)者只需要將頁面路由、方法、生命周期函數(shù)注冊進(jìn)框架,其他的一切復(fù)雜的操作都將由框架處理。
小程序優(yōu)點(diǎn):
• 方便使用:無需下載,打開即用,用完即走。不占用手機(jī)內(nèi)存,省流量,省安裝時(shí)間
• 開發(fā)簡單:開發(fā)的本質(zhì)是MVVM風(fēng)格的Javascript框架上開發(fā)的,有前端經(jīng)驗(yàn)的程序員可以無縫銜接,無經(jīng)驗(yàn)的“小白”也可以快速入門。
• 跨平臺(tái)運(yùn)行:不用再分別開發(fā)IOS和Andriod版本,只需要發(fā)布微信小程序平臺(tái),所有平臺(tái)都可以使用。開發(fā)成本低
• 快速分發(fā)與迭代:無需關(guān)心各種發(fā)布渠道,也無須擔(dān)心舊版本升級(jí)的兼容問題。
打開速度比H5快,體驗(yàn)接近原生APP
小程序開發(fā)框架的目標(biāo)是通過盡可能簡單、高效的方式讓開發(fā)者可以在微信中開發(fā)具有原生 APP 體驗(yàn)的服務(wù)。
微信團(tuán)隊(duì)為小程序提供的框架命名為MINA。MINA框架通過封裝微信客戶端提供的文件系統(tǒng)、網(wǎng)絡(luò)通信、任務(wù)管理、數(shù)據(jù)安全等基礎(chǔ)功能,對(duì)上層提供一整套JavaScript API,讓開發(fā)者方便的使用微信客戶端提供的各種基礎(chǔ)功能與能力,快速構(gòu)建應(yīng)用。
MINA框架
微信小程序的框架示意圖如下所示:
MINA框架主要分為兩大部分:
第一部分頁面視圖層,開發(fā)者使用WXML文件來搭建頁面的基本視圖結(jié)構(gòu)(WXML是類似于HTML標(biāo)簽的語言和一系列基礎(chǔ)組件),使用WXSS文件來控制頁面的表現(xiàn)樣式。
第二部分AppService應(yīng)用邏輯層,是MINA框架的服務(wù)中心,通過微信客戶端啟動(dòng)異步線程單獨(dú)加載運(yùn)行,頁面渲染所需的數(shù)據(jù)、頁面交互處理邏輯都在其中實(shí)現(xiàn)。MINA框架中的AppService使用JavaScript來編寫交互邏輯、網(wǎng)絡(luò)請求、數(shù)據(jù)處理,但不能使用JavaScript中的DOM操作。小程序中的各個(gè)頁面可以通過AppService實(shí)現(xiàn)數(shù)據(jù)管理、網(wǎng)絡(luò)通信、生命周期管理和頁面路由。
MINA框架為頁面組件提供了一系列事件監(jiān)聽相關(guān)的屬性(比如bindtap、bindtouchstart等),來與AppService中的事件處理函數(shù)綁定在一起,來實(shí)現(xiàn)頁面向AppService層同步用戶交互數(shù)據(jù)。MINA框架同時(shí)提供了很多方法將AppService中的數(shù)據(jù)與頁面進(jìn)行單向綁定(注意數(shù)據(jù)的綁定方向是單向的),當(dāng)AppService中的數(shù)據(jù)變更時(shí),會(huì)主動(dòng)觸發(fā)對(duì)應(yīng)頁面組件的重新渲染。
框架的核心是一個(gè)響應(yīng)式的數(shù)據(jù)綁定系統(tǒng),它能讓數(shù)據(jù)與視圖很簡單的保持同步。只需要在邏輯層修改數(shù)據(jù),視圖層就會(huì)做相應(yīng)的更新。示例如下:
<!--頁面視圖層代碼--> <view class="apptitle"> <text class="app-avatar">歡迎使用{{appname}}</text> <button bindtap="changeAppname">更換名稱 </button> </view> //AppService應(yīng)用邏輯層代碼 //初始數(shù)據(jù) page({ data:{ appname:'易投票' }, changeAppname:function(e){ this.setData({ appname:'我的小程序' }) } })
圖1:初始名稱
圖2:點(diǎn)擊按鈕“更換名稱”以后
示例中數(shù)據(jù)是如何更新的呢?首先,開發(fā)者通過框架將AppService應(yīng)用邏輯層數(shù)據(jù)中的appname與頁面視圖層名為appname的變更進(jìn)行了綁定,頁面在剛打開的時(shí)候會(huì)顯示“歡迎使用 易投票。然后,當(dāng)點(diǎn)擊按鈕“更換名稱”之后,視圖層會(huì)發(fā)送changeAppname的tap事件給邏輯層,邏輯層找到事件函數(shù)changeAppname。最后,邏輯層changeAppname函數(shù)執(zhí)行了setData操作,將對(duì)象appname的值改變?yōu)椤拔业男〕绦颉?,因?yàn)樵搶?duì)象已經(jīng)在視圖層綁定,所以視圖層會(huì)顯示為圖2的名稱了。
小程序的MINA框架有著接近原生App的運(yùn)行速度,在框架層面做了大量的優(yōu)化,在重功能上(page或tab切換、多媒體、網(wǎng)絡(luò)連接等)上使用接近于native的組件繼承,對(duì)安卓和ios端做出了高度一致的呈現(xiàn),還有近乎完備的開發(fā)、調(diào)試工具。
目錄結(jié)構(gòu)
典型的小程序目錄結(jié)構(gòu)非常簡潔,一般一個(gè)項(xiàng)目包含兩個(gè)目錄(pages和utils)三個(gè)文件(app.js、app.json、app.wxss)。pages目錄下包括程序所需的各個(gè)頁面,一個(gè)頁面對(duì)應(yīng)一個(gè)目錄,包含2至4個(gè)文件(.js、.wxml、.json及.wxss)。utils目錄則包含一些公共的js代碼文件。當(dāng)然,我們還可以添加其他的公共目錄,如用來存放本地圖片資源的images目錄。
邏輯層
小程序的邏輯層就是所有.js腳本文件的集合。小程序在邏輯層處理數(shù)據(jù)并發(fā)送至視圖層,同時(shí)接受視圖層發(fā)回的事件請求。
MINA框架的邏輯層是由JavaScript編寫,在此基礎(chǔ)上,微信團(tuán)隊(duì)做出了一些優(yōu)化,以便更高效的開發(fā)小程序,這些優(yōu)化包括:
1、增加app方法用來注冊程序,增加page方法用來注冊頁面;
2、提供豐富的API接口;
3、頁面的作用域相對(duì)獨(dú)立,并擁有了模塊化的能力;
簡單概括,邏輯層就是各個(gè)頁面的.js腳本文件。
需要注意的是,小程序的邏輯層由js編寫,但并不是在瀏覽器中運(yùn)行的,所以JavaScript在Web中的一些能力都不能使用,比如 dom、window等,這也是我們開發(fā)過程中要克服的阻礙。
視圖層
對(duì)于微信小程序而言,視圖層就是所有的.wxml(WeiXin Markup language)文件與.wxss(WeiXin Style Sheet)文件的集合:.wxml用于描述頁面結(jié)構(gòu)而.wxss用于描述頁面樣式。
視圖層以給定的樣式來展現(xiàn)數(shù)據(jù)并反饋事件給邏輯層,而數(shù)據(jù)展現(xiàn)是以組件來進(jìn)行的。組件(Component)是視圖的基本組成單元。
數(shù)據(jù)層
數(shù)據(jù)層包括臨時(shí)數(shù)據(jù)或緩存、文件存儲(chǔ)、網(wǎng)絡(luò)存儲(chǔ)與調(diào)用。
1、頁面臨時(shí)數(shù)據(jù)或緩存
在頁面page()中,我們要使用setData函數(shù)來將數(shù)據(jù)從邏輯層發(fā)送到視圖層,同時(shí)改變對(duì)應(yīng)的this.data的值。this在小程序中一般指調(diào)用頁面,廣泛情況下指的是包含它的函數(shù)作為方法被調(diào)用時(shí)所屬的對(duì)象。直接修改this.data是無效的,無法改變頁面的狀態(tài),還會(huì)造成數(shù)據(jù)的不一致。單次設(shè)置的數(shù)據(jù)有一個(gè)大小限制,不能超過1024KB,避免一次性設(shè)置過多的數(shù)據(jù)。
setData()函數(shù)的參數(shù)接受一個(gè)對(duì)象。以key,value的形式表示,將this.data中的key對(duì)應(yīng)的值改變?yōu)関alue。key可以非常靈活,包括以數(shù)據(jù)路徑的形式表示,如array[0].title
,并且無需在this.data中預(yù)定義。
2、文件存儲(chǔ)(本地存儲(chǔ))
使用微信提供的現(xiàn)成數(shù)據(jù)API接口,如:
wx.getStorage:獲取本地?cái)?shù)據(jù)緩存
wx.setStorage:設(shè)置本地?cái)?shù)據(jù)緩存
wx.clearStorage:清理本地?cái)?shù)據(jù)緩存
3、網(wǎng)絡(luò)存儲(chǔ)與調(diào)用
上傳或下載文件的API接口,如:
wx.request:發(fā)起網(wǎng)絡(luò)請求
wx.uploadFile:上傳文件
wx.downloadFile:下載文件
調(diào)用URL的API接口如下:
wx.navigateTo:保留當(dāng)前頁面,跳轉(zhuǎn)到應(yīng)用內(nèi)的某個(gè)頁面。但是不能跳到 tabbar 頁面。可返回原頁面。
wx.redirectTo:關(guān)閉當(dāng)前頁面,跳轉(zhuǎn)到應(yīng)用內(nèi)的某個(gè)頁面。但是不允許跳轉(zhuǎn)到 tabbar 頁面。不可返回原頁面。
以上就是微信小程序框架的相關(guān)描述,微信團(tuán)隊(duì)一直在不斷的優(yōu)化框架能力,及時(shí)的關(guān)注官方提供的小程序開發(fā)者文檔,了解小程序的最新能力及優(yōu)化點(diǎn)。
總結(jié)
以上所述是小編給大家介紹的微信小程序開發(fā)框架(MINA),希望對(duì)大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
如何基于JS實(shí)現(xiàn)Ajax并發(fā)請求的控制詳解
通常為了減少頁面加載時(shí)間,先把核心內(nèi)容顯示處理,頁面加載完成后再發(fā)送ajax請求獲取其他數(shù)據(jù),這時(shí)就可能產(chǎn)生多個(gè)ajax請求,為了用戶體驗(yàn),最好是發(fā)送并行請求,這篇文章主要給大家介紹了關(guān)于如何基于JS實(shí)現(xiàn)Ajax并發(fā)請求控制的相關(guān)文章,需要的朋友可以參考下2021-08-08JS自定義對(duì)象實(shí)現(xiàn)Java中Map對(duì)象功能的方法
這篇文章主要介紹了JS自定義對(duì)象實(shí)現(xiàn)Java中Map對(duì)象功能的方法,可實(shí)現(xiàn)類似Java中Map對(duì)象增刪改查等功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01JS計(jì)算兩個(gè)數(shù)組的交集、差集、并集、補(bǔ)集(多種實(shí)現(xiàn)方式)
本文通過多種實(shí)現(xiàn)方式給大家介紹了JS計(jì)算兩個(gè)數(shù)組的交集、差集、并集、補(bǔ)集 的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-05-05JavaScript中關(guān)于class的調(diào)用方法
下面小編就為大家?guī)硪黄琂avaScript中關(guān)于class的調(diào)用方法。具有很好的參考價(jià)值,希望對(duì)大家有所幫助2017-11-11javaScript 刪除確認(rèn)實(shí)現(xiàn)方法小結(jié)
因?yàn)閷?duì)于內(nèi)容的刪除是件很重要的事,所以一般的系統(tǒng)中,都需要?jiǎng)h除確認(rèn)一下,以免誤刪,具體的方法如下,大家可以參考下。2009-12-12js找出5個(gè)數(shù)中最大的一個(gè)數(shù)和倒數(shù)第二大的數(shù)實(shí)現(xiàn)方法示例小結(jié)
這篇文章主要介紹了js找出5個(gè)數(shù)中最大的一個(gè)數(shù)和倒數(shù)第二大的數(shù)實(shí)現(xiàn)方法,結(jié)合實(shí)例形式總結(jié)分析了JavaScript數(shù)組遍歷、排序、判斷、比較等相關(guān)操作技巧,需要的朋友可以參考下2020-03-03ES6中Array.find()和findIndex()函數(shù)的用法詳解
ES6為Array增加了find(),findIndex函數(shù)。find()函數(shù)用來查找目標(biāo)元素,找到就返回該元素,找不到返回undefined,而findIndex()函數(shù)也是查找目標(biāo)元素,找到就返回元素的位置,找不到就返回-1。下面通過實(shí)例詳解,需要的朋友參考下吧2017-09-09微信小程序?qū)崿F(xiàn)頁面浮動(dòng)導(dǎo)航
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)頁面浮動(dòng)導(dǎo)航,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-01-01JS根據(jù)瀏覽器窗口大小實(shí)時(shí)動(dòng)態(tài)改變網(wǎng)頁文字大小的方法
這篇文章主要介紹了JS根據(jù)瀏覽器窗口大小實(shí)時(shí)動(dòng)態(tài)改變網(wǎng)頁文字大小的方法,涉及JavaScript針對(duì)頁面寬高的動(dòng)態(tài)獲取與元素樣式動(dòng)態(tài)運(yùn)算的相關(guān)技巧,需要的朋友可以參考下2016-02-02