微信小程序开发探究


Posted in Javascript onDecember 27, 2016

前段时间比较流行的微信小程序,因为一直没有所谓内测码也没具体关注。拖到现在正好借组内分享的时机来仔细了解一下微信小程序。了解一个新的事物无外乎从是什么(本质),怎么用(具体用法),为什么用(优缺点)来学习,首先分析一下微信小程序是什么,听起来比较高大上,说实话原来我确实挺疑惑,到底这一套是什么开发机制,native?hybrid?纯h5?看网上各种教程上来就说api说语法,感觉不先理清楚是什么的问题就去搬api过来纯粹是耍流氓。

一、微信小程序是什么:    

言归正传,微信小程序的本质是什么?个人理解微信小程序本质还是一套前端框架,微信团队基于原来第三方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
 }
 })

app.json(文件中不允许有注释)示例如下:

微信小程序开发探究

{
 "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时候建议拷贝出相关的代码到小程序的目录中这样局限性就比较大了,需要自己手动的东西好多

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript add event remove event
Apr 07 Javascript
JScript中使用ADODB.Stream判断文件编码的代码
Jun 09 Javascript
jQuery实现ichat在线客服插件
Dec 29 Javascript
JS+CSS实现鼠标滑过时动态翻滚的导航条效果
Sep 24 Javascript
javascript实现可键盘控制的抽奖系统
Mar 10 Javascript
深入理解jQuery之防止冒泡事件
May 24 Javascript
JavaScript制作简单分页插件
Sep 11 Javascript
Javascript中 带名 匿名 箭头函数的重要区别(推荐)
Jan 29 Javascript
React 组件转 Vue 组件的命令写法
Feb 28 Javascript
JS实现图片上传多次上传同一张不生效的处理方法
Aug 06 Javascript
微信小程序实现评论功能
Nov 28 Javascript
vue-preview动态获取图片宽高并增加旋转功能的实现
Jul 29 Javascript
javascript replace()第二个参数为函数时的参数用法
Dec 26 #Javascript
javascript prototype原型详解(比较基础)
Dec 26 #Javascript
如何提高数据访问速度
Dec 26 #Javascript
Angular的模块化(代码分享)
Dec 26 #Javascript
详解Angular的数据显示优化处理
Dec 26 #Javascript
easyui combotree加载静态数据问题(选不上)解决方法
Dec 26 #Javascript
手动初始化Angular的模块与控制器
Dec 26 #Javascript
You might like
用PHP实现Ftp用户的在线管理的代码
2007/03/06 PHP
php数组函数序列之in_array() 查找数组值是否存在
2011/10/29 PHP
PHP自动识别字符集并完成转码详解
2013/08/02 PHP
保存到桌面、设为桌面且带图标的PHP代码
2013/11/19 PHP
PHP排序算法之快速排序(Quick Sort)及其优化算法详解
2018/04/21 PHP
laravel5使用freetds连接sql server的方法
2018/12/07 PHP
详解no input file specified 三种解决方法
2019/11/29 PHP
Javascript的IE和Firefox兼容性汇编
2006/07/01 Javascript
jQuery实现鼠标悬停显示提示信息窗口的方法
2015/04/30 Javascript
在Javascript中处理数组之toSource()方法的使用
2015/06/09 Javascript
javascript实现网页背景烟花效果的方法
2015/08/06 Javascript
jQuery实现响应鼠标滚动的动感菜单效果
2015/09/21 Javascript
基于JavaScript实现移动端点击图片查看大图点击大图隐藏
2015/11/04 Javascript
javascript鼠标滑过显示二级菜单特效
2020/11/18 Javascript
vue-cli入门之项目结构分析
2017/04/20 Javascript
浅谈jquery中ajax跨域提交的时候会有2次请求的问题
2017/11/10 jQuery
angular2 ng2-file-upload上传示例代码
2018/08/23 Javascript
[57:55]完美世界DOTA2联赛PWL S3 Magma vs Phoenix 第二场 12.12
2020/12/16 DOTA
python引用DLL文件的方法
2015/05/11 Python
Python 中 list 的各项操作技巧
2017/04/13 Python
python处理csv数据动态显示曲线实例代码
2018/01/23 Python
Python实现带参数与不带参数的多重继承示例
2018/01/30 Python
python构建深度神经网络(续)
2018/03/10 Python
如何基于python实现归一化处理
2020/01/20 Python
基于python3实现倒叙字符串
2020/02/18 Python
Python图像处理库PIL的ImageDraw模块介绍详解
2020/02/26 Python
python 输入字符串生成所有有效的IP地址(LeetCode 93号题)
2020/10/15 Python
使用Canvas操作像素的方法
2018/06/14 HTML / CSS
英国网上花店:Bunches
2016/11/29 全球购物
PatPat德国:妈妈的每日优惠
2019/10/02 全球购物
销售人员自我评价
2014/02/01 职场文书
超市促销活动总结
2014/07/01 职场文书
小学生田径运动会广播稿
2014/09/11 职场文书
2015年检验员工作总结范文
2015/04/30 职场文书
解决Laravel使用验证时跳转到首页的问题
2021/11/17 PHP
win11系统中dhcp服务异常什么意思? Win11 DHCP服务异常修复方法
2022/04/08 数码科技