详解 微信小程序开发框架(MINA)


Posted in Javascript onMay 17, 2019

小程序MINA框架,及优点

MINA框架:

小程序使用的是MINA框架,目的是通过简单、高效的方式让开发者可以在微信中开发具有原生App体验的服务。   

MINA的核心是一个响应的数据绑定系统。

 整个系统分为两块:视图层(view,描述语言wxml和wxss)和逻辑层(App Serice,基于 JavaScript)。这可以让数据与视图非常简单的保持同步。当做数据修改时,只需要在逻辑层改数据,视图层就会做响应的更新。开发者只需要将页面路由、方法、生命周期函数注册进框架,其他的一切复杂的操作都将由框架处理。

小程序优点:

• 方便使用:无需下载,打开即用,用完即走。不占用手机内存,省流量,省安装时间
• 开发简单:开发的本质是MVVM风格的Javascript框架上开发的,有前端经验的程序员可以无缝衔接,无经验的“小白”也可以快速入门。
• 跨平台运行:不用再分别开发IOS和Andriod版本,只需要发布微信小程序平台,所有平台都可以使用。开发成本低
• 快速分发与迭代:无需关心各种发布渠道,也无须担心旧版本升级的兼容问题。 

 打开速度比H5快,体验接近原生APP

小程序开发框架的目标是通过尽可能简单、高效的方式让开发者可以在微信中开发具有原生 APP 体验的服务。

微信团队为小程序提供的框架命名为MINA。MINA框架通过封装微信客户端提供的文件系统、网络通信、任务管理、数据安全等基础功能,对上层提供一整套JavaScript API,让开发者方便的使用微信客户端提供的各种基础功能与能力,快速构建应用。

MINA框架

微信小程序的框架示意图如下所示:

详解 微信小程序开发框架(MINA)

MINA框架主要分为两大部分:

第一部分页面视图层,开发者使用WXML文件来搭建页面的基本视图结构(WXML是类似于HTML标签的语言和一系列基础组件),使用WXSS文件来控制页面的表现样式。

第二部分AppService应用逻辑层,是MINA框架的服务中心,通过微信客户端启动异步线程单独加载运行,页面渲染所需的数据、页面交互处理逻辑都在其中实现。MINA框架中的AppService使用JavaScript来编写交互逻辑、网络请求、数据处理,但不能使用JavaScript中的DOM操作。小程序中的各个页面可以通过AppService实现数据管理、网络通信、生命周期管理和页面路由。

MINA框架为页面组件提供了一系列事件监听相关的属性(比如bindtap、bindtouchstart等),来与AppService中的事件处理函数绑定在一起,来实现页面向AppService层同步用户交互数据。MINA框架同时提供了很多方法将AppService中的数据与页面进行单向绑定(注意数据的绑定方向是单向的),当AppService中的数据变更时,会主动触发对应页面组件的重新渲染。

框架的核心是一个响应式的数据绑定系统,它能让数据与视图很简单的保持同步。只需要在逻辑层修改数据,视图层就会做相应的更新。示例如下:

<!--页面视图层代码--> 
<view class="apptitle">
 <text class="app-avatar">欢迎使用{{appname}}</text>
 <button bindtap="changeAppname">更换名称 </button>
</view>
//AppService应用逻辑层代码
//初始数据
page({
 data:{
  appname:'易投票'
 },
 changeAppname:function(e){
  this.setData({
  appname:'我的小程序'
 })
 }
})

详解 微信小程序开发框架(MINA)详解 微信小程序开发框架(MINA)

图1:初始名称

图2:点击按钮“更换名称”以后

示例中数据是如何更新的呢?首先,开发者通过框架将AppService应用逻辑层数据中的appname与页面视图层名为appname的变更进行了绑定,页面在刚打开的时候会显示“欢迎使用 易投票。然后,当点击按钮“更换名称”之后,视图层会发送changeAppname的tap事件给逻辑层,逻辑层找到事件函数changeAppname。最后,逻辑层changeAppname函数执行了setData操作,将对象appname的值改变为“我的小程序”,因为该对象已经在视图层绑定,所以视图层会显示为图2的名称了。

小程序的MINA框架有着接近原生App的运行速度,在框架层面做了大量的优化,在重功能上(page或tab切换、多媒体、网络连接等)上使用接近于native的组件继承,对安卓和ios端做出了高度一致的呈现,还有近乎完备的开发、调试工具。

目录结构

典型的小程序目录结构非常简洁,一般一个项目包含两个目录(pages和utils)三个文件(app.js、app.json、app.wxss)。pages目录下包括程序所需的各个页面,一个页面对应一个目录,包含2至4个文件(.js、.wxml、.json及.wxss)。utils目录则包含一些公共的js代码文件。当然,我们还可以添加其他的公共目录,如用来存放本地图片资源的images目录。

详解 微信小程序开发框架(MINA)

逻辑层

小程序的逻辑层就是所有.js脚本文件的集合。小程序在逻辑层处理数据并发送至视图层,同时接受视图层发回的事件请求。

MINA框架的逻辑层是由JavaScript编写,在此基础上,微信团队做出了一些优化,以便更高效的开发小程序,这些优化包括:

1、增加app方法用来注册程序,增加page方法用来注册页面;

2、提供丰富的API接口;

3、页面的作用域相对独立,并拥有了模块化的能力;

简单概括,逻辑层就是各个页面的.js脚本文件。

需要注意的是,小程序的逻辑层由js编写,但并不是在浏览器中运行的,所以JavaScript在Web中的一些能力都不能使用,比如 dom、window等,这也是我们开发过程中要克服的阻碍。

视图层

对于微信小程序而言,视图层就是所有的.wxml(WeiXin Markup language)文件与.wxss(WeiXin Style Sheet)文件的集合:.wxml用于描述页面结构而.wxss用于描述页面样式。

视图层以给定的样式来展现数据并反馈事件给逻辑层,而数据展现是以组件来进行的。组件(Component)是视图的基本组成单元。

数据层

数据层包括临时数据或缓存、文件存储、网络存储与调用。

1、页面临时数据或缓存

在页面page()中,我们要使用setData函数来将数据从逻辑层发送到视图层,同时改变对应的this.data的值。this在小程序中一般指调用页面,广泛情况下指的是包含它的函数作为方法被调用时所属的对象。直接修改this.data是无效的,无法改变页面的状态,还会造成数据的不一致。单次设置的数据有一个大小限制,不能超过1024KB,避免一次性设置过多的数据。

setData()函数的参数接受一个对象。以key,value的形式表示,将this.data中的key对应的值改变为value。key可以非常灵活,包括以数据路径的形式表示,如array[0].title,并且无需在this.data中预定义。

2、文件存储(本地存储)

使用微信提供的现成数据API接口,如:

wx.getStorage:获取本地数据缓存

wx.setStorage:设置本地数据缓存

wx.clearStorage:清理本地数据缓存

3、网络存储与调用

上传或下载文件的API接口,如:

wx.request:发起网络请求

wx.uploadFile:上传文件

wx.downloadFile:下载文件

调用URL的API接口如下:

wx.navigateTo:保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面。可返回原页面。

wx.redirectTo:关闭当前页面,跳转到应用内的某个页面。但是不允许跳转到 tabbar 页面。不可返回原页面。

以上就是微信小程序框架的相关描述,微信团队一直在不断的优化框架能力,及时的关注官方提供的小程序开发者文档,了解小程序的最新能力及优化点。

总结

以上所述是小编给大家介绍的微信小程序开发框架(MINA),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
JavaScript DOM 添加事件
Feb 14 Javascript
Javascript中引用示例介绍
Feb 21 Javascript
jquery实现在页面加载的时自动为日期插件添加当前日期
Aug 20 Javascript
将数字转换成大写的人民币表达式的js函数
Sep 21 Javascript
JavaScript简介
Feb 15 Javascript
在JS中操作时间之getUTCMilliseconds()方法的使用
Jun 10 Javascript
理解javascript中的原型和原型链
Jul 30 Javascript
JS实现网页顶部向下滑出的全国城市切换导航效果
Aug 22 Javascript
基于node实现websocket协议
Apr 25 Javascript
react开发教程之React 组件之间的通信方式
Aug 12 Javascript
vue基于Element构建自定义树的示例代码
Sep 19 Javascript
使用JSON格式提交数据到服务端的实例代码
Apr 01 Javascript
Vue模板语法中数据绑定的实例代码
May 17 #Javascript
jQuery控制input只能输入数字和两位小数的方法
May 16 #jQuery
微信小程序云开发详细教程
May 16 #Javascript
atom-design(Vue.js移动端组件库)手势组件使用教程
May 16 #Javascript
小程序scroll-view安卓机隐藏横向滚动条的实现详解
May 16 #Javascript
微信小程序云开发之云函数详解
May 16 #Javascript
微信小程序云开发之模拟后台增删改查
May 16 #Javascript
You might like
收音机术语解释
2021/03/01 无线电
PHP 获取目录下的图片并随机显示的代码
2009/12/28 PHP
PHP Array交叉表实现代码
2010/08/05 PHP
PHP 清空varnish 缓存的详解(包括指定站点下的)
2013/06/20 PHP
php字符串分割函数用法实例
2015/03/17 PHP
php中简单的对称加密算法实现
2017/01/05 PHP
javascript document.images实例
2008/05/27 Javascript
jquery keypress,keyup,onpropertychange键盘事件
2010/06/25 Javascript
Array的push与unshift方法性能比较分析
2011/03/05 Javascript
JS.elementGetStyle(element, style)应用示例
2013/09/24 Javascript
单元选择合并变色示例代码
2014/05/26 Javascript
JavaScript导出Excel实例详解
2014/11/25 Javascript
JavaScript中数组继承的简单示例
2015/07/29 Javascript
浅谈JavaScript的push(),pop(),concat()方法
2016/06/03 Javascript
Angular ng-repeat指令实例以及扩展部分
2016/12/26 Javascript
详解JS去重及字符串奇数位小写转大写
2016/12/29 Javascript
JavaScript实现反转字符串的方法详解
2017/04/27 Javascript
js原生代码实现轮播图的实例讲解
2017/07/28 Javascript
基于Two.js实现星球环绕动画效果的示例
2017/11/06 Javascript
引入外部js脚本加载慢与页面白屏问题的解决
2018/12/10 Javascript
Vue 页面权限控制和登陆验证功能的实例代码
2019/06/20 Javascript
Vue 2.0双向绑定原理的实现方法
2019/10/23 Javascript
element-ui table组件如何使用render属性的实现
2019/11/04 Javascript
详解Vue3中对VDOM的改进
2020/04/23 Javascript
了不起的11个JavaScript代码重构最佳实践小结
2021/01/11 Javascript
[56:18]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#2 MVP.Phx VS Fnatic第二局
2016/03/05 DOTA
Python 2.7.x 和 3.x 版本的重要区别小结
2014/11/28 Python
对Django外键关系的描述
2019/07/26 Python
python 实现手机自动拨打电话的方法(通话压力测试)
2019/08/08 Python
tensorflow mnist 数据加载实现并画图效果
2020/02/05 Python
Keras—embedding嵌入层的用法详解
2020/06/10 Python
Django中使用Celery的方法步骤
2020/12/07 Python
财务会计人员求职的自我评价
2014/01/13 职场文书
校园演讲稿汇总
2014/05/21 职场文书
小学教师师德师风演讲稿
2014/08/22 职场文书
趣味运动会赞词
2015/07/22 职场文书