微信小程序第三方框架对比 之 wepy / mpvue / taro

众所周知如今市面上端的形态多种多样,手机Web、ReactNative、微信小程序, 支付宝小程序, 快应用等,每一端都是巨大的流量入口,当业务要求同时在不同的端都要求有所表现的时候,针对不同的端去编写多套代码的成本显然非常高,这时候只编写一套代码就能够适配到多端的能力就显得极为需要。

但面对目前市面上成熟的小程序第三方框架如何针对自己的需求进行选择也是一个麻烦事,本文针对当前市面上的三大转译框架进行一个综合对比,希望能对大家的技术选择有所帮助,如有哪里不妥的地方希望指正;

 小程序开发有哪些痛点?

•频繁调用 setData及 setData过程中页面跳闪
 •组件化支持能力太弱(几乎没有)
 •不能使用 less、scss 等预编译器
 •request 并发次数限制

 为什么使用第三方框架?

•只要熟悉vue或react即可快速上手,学习成本低
 •一套代码可在多端编译运行(微信,支付宝,h5,RN)  支付宝小程序暂不完善
•组件化开发,完美解决组件隔离,组件嵌套,组件通信等问题
•支持使用第三方 npm 资源
•使小程序可支持 Promise,解决回调烦恼
 •可使用 Generator Fu-nction / Class / Async Function 等特性,提升开发效率
•对小程序本身的优化,如生命周期的补充,性能的优化等等
 •支持样式编译器: Scss/Less,模板编译器,代码编译器:Babel/Typescript。

第三方框架对比 wepy mpvue taro

  在这里我通过对目前已开源的三种常用小程序框架做一个综合对比, 还有一个叫nanchi的基于react的小程序转译框架,由于没来的及研究暂不做比较;

•WEPY https://tencent.github.io/wepy/document.html

  腾讯团队开源的一款类vue语法规范的小程序框架,借鉴了Vue的语法风格和功能特性,支持了Vue的诸多特征,比如父子组件、组件之间的通信、computed属性计算、wathcer监听器、props传值、slot槽分发,还有很多高级的特征支持:Mixin混合、拦截器等;WePY发布的第一个版本是2016年12月份,也就是小程序刚刚推出的时候,到目前为止,WePY已经发布了52个版本, 最新版本为1.7.2;

•MpVue http://mpvue.com/mpvue/#-html

  美团团队开源的一款使用 Vue.js 开发微信小程序的前端框架。使用此框架,开发者将得到完整的 Vue.js 开发体验,同时为 H5 和小程序提供了代码复用的能力。mpvue在发布后的几天间获得2.7k的star,上升速度飞起,截至目前为止已经有13.7k的star;

•Taro https://taro.aotu.io/

  京东凹凸实验室开源的一款使用 React.js 开发微信小程序的前端框架。它采用与 React 一致的组件化思想,组件生命周期与 React 保持一致,同时支持使用 JSX 语法,让代码具有更丰富的表现力,使用 Taro 进行开发可以获得和 React 一致的开发体验。,同时因为使用了react的原因所以除了能编译h5, 小程序外还可以编译为ReactNative;

Star

 

 生命周期

  同为vue规范的mpvue和wepy的生命周期和各种方法不尽相同

  wepy

  wepy生命周期基本与原生小程序相同,再此基础上糅合了一些vue的特性; 对于WePY中的methods属性,因为与Vue中的使用习惯不一致,非常容易造成误解,这里需要特别强调一下:WePY中的methods属性只能声明页面wxml标签的bind、catch事件,不能声明自定义方法,这与Vue中的用法是不一致的。  

import wepy from 'wepy';
export default class MyPage extends wepy.page {
// export default class MyComponent extends wepy.component {
  customData = {} // 自定义数据
  customFunction () {} //自定义方法
  onLoad () {} // 在Page和Component共用的生命周期函数
  onShow () {} // 只在Page中存在的页面生命周期函数
  config = {}; // 只在Page实例中存在的配置数据,对应于原生的page.json文件
  data = {}; // 页面所需数据均需在这里声明,可用于模板数据绑定
  components = {}; // 声明页面中所引用的组件,或声明组件中所引用的子组件
  mixins = []; // 声明页面所引用的Mixin实例
  computed = {}; // 声明计算属性(详见后文介绍)
  watch = {}; // 声明数据watcher(详见后文介绍)
  methods = {}; // 声明页面wxml中标签的事件处理函数。注意,此处只用于声明页面wxml中标签的bind、catch事件,自定义方法需以自定义方法的方式声明
  events = {}; // 声明组件之间的事件处理函数
}

  mpvue

  mpvue 除了 Vue 本身的生命周期外,还兼容了小程序生命周期,这部分生命周期钩子的来源于微信小程序的 Page, 除特殊情况外,不建议使用小程序的生命周期 钩子。

Vue
 beforeCreate
 created
 beforeMount
 mounted
 beforeUpdate
 updated
 activated
 deactivated
 beforeDestroy
 destroyed
 app 部分
 onLaunch,初始化
 onShow,当小程序启动,或从后台进入前台显示
 onHide,当小程序从前台进入后台
 page 部分
 onLoad,监听页面加载
 onShow,监听页面显示
 onReady,监听页面初次渲染完成
 onHide,监听页面隐藏
 onUnload,监听页面卸载
 onPullDownRefresh,监听用户下拉动作
 onReachBottom,页面上拉触底事件的处理函数
 onShareAppMessage,用户点击右上角分享
 onPageScroll,页面滚动
 onTabItemTap, 当前是 tab 页时,点击 tab 时触发 (mpvue 0.0.16 支持)

简单示例

new Vue({
 data: {
  a: 1
 },
 created () {
  // `this` 指向 vm 实例
  console.log('a is: ' + this.a)
 },
 onShow () {
  // `this` 指向 vm 实例
  console.log('a is: ' + this.a, '小程序触发的 onshow')
 }
})
// => "a is: 1"

taro与react生命周期完全相同

class Clock extends Component {
 constructor (props) {
  super(props)
  this.state = { date: new Date() }
 }
 componentDidMount() {
 }
 componentWillUnmount() {
 }
 render () {
  return (
   <View>
    <Text>Hello, world!</Text>
    <Text>现在的时间是 {this.state.date.toLocaleTimeString()}.</Text>
   </View>
  )
 }
}

列表渲染

在列表渲染上三者也分别有不同的应用方法

wepy当需要循环渲染WePY组件时(类似于通过wx:for循环渲染原生的wxml标签),必须使用WePY定义的辅助标签<repeat>

<template>
  <!-- 注意,使用for属性,而不是使用wx:for属性 -->
  <repeat for="{{list}}" key="index" index="index" item="item">
    <!-- 插入<script>脚本部分所声明的child组件,同时传入item -->
    <child :item="item"></child>
  </repeat>
</template>
<script>
  import wepy from 'wepy';
  // 引入child组件文件
  import Child from '../components/child';
  export default class Index extends wepy.component {
    components = {
      // 声明页面中要使用到的Child组件的ID为child
      child: Child
    }
    data = {
      list: [{id: 1, title: 'title1'}, {id: 2, title: 'title2'}]
    }
  }
</script>

mpvue使用v-for与vue一致,只是需要注意一点,嵌套列表渲染,必须指定不同的索引!

<!-- 在这种嵌套循环的时候, index 和 itemIndex 这种索引是必须指定,且别名不能相同,正确的写法如下 -->
<template>
  <ul v-for="(card, index) in list">
    <li v-for="(item, itemIndex) in card">
      {{item.value}}
    </li>
  </ul>
</template>

taro的列表循环用法基本与react相同,有一点需要注意,在 React 中,JSX 是会编译成普通的 JS 的执行,每一个 JSX 元素,其实会通过 createElement 函数创建成一个 JavaScript 对象(React Element),因此实际上你可以这样写代码 React 也是完全能渲染的:

const list = this.state.list.map(l => {
 if (l.selected) {
  return <li>{l.text}</li>
 }
}).filter(React.isValidElement)

但是 Taro 中,JSX 会编译成微信小程序模板字符串,因此你不能把 map 函数生成的模板当做一个数组来处理。当你需要这么做时,应该先处理需要循环的数组,再用处理好的数组来调用 map 函数。例如上例应该写成:

const list = this.state.list
 .filter(l => l.selected)
 .map(l => {
  return <li>{l.text}</li>
 })

事件处理

mpvue目前全支持小程序的事件处理器,引入了 Vue.js 的虚拟 DOM ,在前文模版中绑定的事件会被挂在到 vnode 上,同时 compiler 在 wxml 上绑定了小程序的事件,并做了相应的映射,所以你在真实点击的时候通过 runtime 中 handleProxy 通过事件类型分发到 vnode 的事件上,同 Vue 在 WEB 的机制一样,所以可以做到无损支持。同时还顺便支持了自定义事件和 $emit 机制

// 事件映射表,左侧为 WEB 事件,右侧为 小程序 对应事件
{
  click: 'tap',
  touchstart: 'touchstart',
  touchmove: 'touchmove',
  touchcancel: 'touchcancel',
  touchend: 'touchend',
  tap: 'tap',
  longtap: 'longtap',
  input: 'input',
  change: 'change',
  submit: 'submit',
  blur: 'blur',
  focus: 'focus',
  reset: 'reset',
  confirm: 'confirm',
  columnchange: 'columnchange',
  linechange: 'linechange',
  error: 'error',
  scrolltoupper: 'scrolltoupper',
  scrolltolower: 'scrolltolower',
  scroll: 'scroll'
}

踩坑注意(官方文档):

•列表中没有的原生事件也可以使用例如 bindregionchange 事件直接在 dom 上将bind改为@ @regionchange,同时这个事件也非常特殊,它的 event type 有 begin 和 end 两个,导致我们无法在handleProxy 中区分到底是什么事件,所以你在监听此类事件的时候同时监听事件名和事件类型既 <map @regionchange="functionName" @end="functionName" @begin="functionName"><map>
•小程序能力所致,bind 和 catch 事件同时绑定时候,只会触发 bind ,catch 不会被触发,要避免踩坑。
•事件修饰符 ◦.stop 的使用会阻止冒泡,但是同时绑定了一个非冒泡事件,会导致该元素上的 catchEventName 失效!
◦.prevent 可以直接干掉,因为小程序里没有什么默认事件,比如submit并不会跳转页面
◦.capture 支持 1.0.9
◦.self 没有可以判断的标识
◦.once 也不能做,因为小程序没有 removeEventListener, 虽然可以直接在 handleProxy 中处理,但非常的不优雅,违背了原意,暂不考虑

•其他 键值修饰符 等在小程序中压根没键盘,所以。。。

wepy事件绑定区别于vue,根据原生小程序事件提供了语法优化

绑定事件

 bindtap="click" 替换为 @tap="click",

取消冒泡

catchtap="click"替换为@tap.stop="click"。

捕获监听事件

 capture-bind:tap="click" 替换为 @tap.capture="click",

中断捕获监听

capture-catch:tap=“click"替换为 @tap.capture.stop="click"。

Taro 元素的事件处理和 DOM 元素的很相似。但是有一点语法上的不同:

Taro 事件绑定属性的命名采用驼峰式写法,而不是小写。 如果采用 JSX 的语法你需要传入一个函数作为事件处理函数,而不是一个字符串 (DOM 元素的写法)。 例如,传统的微信小程序模板:

<button onclick="activateLasers">
 Activate Lasers
</button>

Taro 中稍稍有点不同:

<button onClick={this.activateLasers}>
 Activate Lasers
</button>

在 Taro 中另一个不同是你不能使用 catchEvent 的方式阻止事件冒泡。你必须明确的使用 stopPropagation。例如,阻止事件冒泡你可以这样写:

class Toggle extends React.Component {
 constructor (props) {
  super(props)
  this.state = {isToggleOn: true}
 }
 onClick = (e) => {
  e.stopPropagation()
  this.setState(prevState => ({
   isToggleOn: !prevState.isToggleOn
  }))
 }
 render () {
  return (
   <button onClick={this.onClick}>
    {this.state.isToggleOn ? 'ON' : 'OFF'}
   </button>
  )
 }
}

 request请求

wepy对wx.request做了接受参数的修改,值得一提的是它提供了针对全局的intercapter拦截器

// 原生代码:
wx.request({
  url: 'xxx',
  success: function (data) {
    console.log(data);
  }
});
// WePY 使用方式, 需要开启 Promise 支持,参考开发规范章节
wepy.request('xxxx').then((d) => console.log(d));
// async/await 的使用方式, 需要开启 Promise 和 async/await 支持,参考 WIKI
async function request () {
  let d = await wepy.request('xxxxx');
  console.log(d);
}

拦截器

import wepy from 'wepy';
export default class extends wepy.app {
  constructor () {
    // this is not allowed before super()
    super();
    // 拦截request请求
    this.intercept('request', {
      // 发出请求时的回调函数
      config (p) {
        // 对所有request请求中的OBJECT参数对象统一附加时间戳属性
        p.timestamp = +new Date();
        console.log('config request: ', p);
        // 必须返回OBJECT参数对象,否则无法发送请求到服务端
        return p;
      },
      // 请求成功后的回调函数
      success (p) {
        // 可以在这里对收到的响应数据对象进行加工处理
        console.log('request success: ', p);
        // 必须返回响应数据对象,否则后续无法对响应数据进行处理
        return p;
      },
      //请求失败后的回调函数
      fail (p) {
        console.log('request fail: ', p);
        // 必须返回响应数据对象,否则后续无法对响应数据进行处理
        return p;
      },
      // 请求完成时的回调函数(请求成功或失败都会被执行)
      complete (p) {
        console.log('request complete: ', p);
      }
    });
  }
}

taro对request进行了二次封装,可以使用Taro.request(OBJECT)发起网络请求,支持 Promise 化使用。

import Taro from '@tarojs/taro'
Taro.request({
 url: 'http://localhost:8080/test',
 data: {
  foo: 'foo',
  bar: 10
 },
 header: {
  'content-type': 'application/json'
 }
})
 .then(res => console.log(res.data))

mpvue没有对request做特殊优化,与原生相同,可以自己根据需要进行封装

状态管理

wepy 可引用Redux和Mbox,目前wepy的脚手架内已经集成了redux,选择需要即可;

mpVue使用vuex

taro使用Redux

如何选择适合自己的项目

•如果只需要做一个微信小程序则根据自己的擅长框架选择mpvue或taro
•如果是当前老项目想像向程序迁移同时老项目又是使用vue开发,建议使用mpvue或wepy
•如果是老项目使用react开发且需要部分迁移小程序,建议使用taro
•如果是新项目且新项目需要同时支持微信小程序和支付宝小程序, 建议使用原生开发,因为目前框架的转译支付宝小程序支持并不是很好,且出了问题不好定位修改, 但如果是小demo不涉及太多逻辑的项目都可以使用框架作为尝鲜; 但如果是涉及太多交互逻辑的则不建议使用框架转译,由于支付宝小程序在视图层基本与小程序一致所以建议手动更改替换部分方法和全局替换一些属性或文件名,如wxml替换为axml这种, 手动转换时间比大概是四比一; 当然如果人手足够一端开发一个是最好的...

总结

以上所述是小编给大家介绍的微信小程序第三方框架对比 之 wepy / mpvue / taro,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • 微信小程序 安全包括(框架、功能模块、账户使用)详解

    微信小程序 安全: 本文大白将从小程序的框架.功能模块安全.账户使用安全方面进行剖析,希望能为各位泽友带来不一样的认知. 一.小程序框架概述 小程序抽象框架 视图层 包含WXML.WXSS和页面视图组件. WXML是一种类似XML格式的语言,支持数据绑定.条件渲染.列表渲染.自定义模板.事件回调和外部引用 WXSS是一种类似CSS格式的语言,用于描述WXML的组件样式,决定WXML中的组件如何显示 组件是框架提供的一系列基础模块,是视图层的基本组成单元,包含表单组件.导航.地图.媒体组件等常用元

  • Python使用django框架实现多人在线匿名聊天的小程序

    最近看到好多设计类网站,都提供了多人在线匿名聊天的小功能,感觉很有意思,于是基于python的django框架自己写了一个,支持手动实时更名,最下方提供了完整的源码. 在线聊天地址(无需登录,开一个窗口,代表一个用户): http://zhaozhaoli.vicp.io/chatroom/happy/ 移动端聊天效果图: 网页版聊天效果图: 实现思路: 发送的消息通过ajax先写入数据库,通过ajax的循环请求,将写入数据库的消息显示到前端界面. 前端核心代码: <script> $(fun

  • 使用Vue.js开发微信小程序开源框架mpvue解析

    前言 mpvue是一款使用Vue.js开发微信小程序的前端框架.使用此框架,开发者将得到完整的 Vue.js 开发体验,同时为H5和小程序提供了代码复用的能力.如果想将 H5 项目改造为小程序,或开发小程序后希望将其转换为H5,mpvue将是十分契合的一种解决方案. 目前,mpvue已经在美团点评多个实际业务项目中得到了验证,因此我们决定将其开源,希望更多技术同行一起开发,应用到更广泛的场景里去.github项目地址请参见mpvue .使用文档请参见 http://mpvue.com/. 为了帮

  • 微信小程序wepy框架笔记小结

    该框架是腾讯内部基于小程序的开发框架,设计思路基本参考VUE,开发模式和编码风 格上80%以上接近VUE 优势 组件化开发 小程序虽然有标签可以实现组件复用,但仅限于模板片段层面的复用,业务代码与交互事件 仍需在页面处理.无法实现组件化的松耦合与复用的效果. wepy组件示例 // index.wpy <template> <view> <panel> <h1 slot="title"></h1> </panel>

  • 微信小程序 框架详解及实例应用

    快速了解微信小程序的使用,一个根据小程序的框架开发的todos app 微信官方已经开放微信小程序的官方文档和开发者工具.前两天都是在看相关的新闻来了解小程序该如何开发,这两天官方的文档出来之后,赶紧翻看了几眼,重点了解了一下文档中框架与组件这两个部分,然后根据简易教程,做了一个常规的todo app.这个app基于微信小程序的平台,实现了todo app的常规功能,同时为了让它更接近实际的工作场景,也用到了loading与toast这两个组件来完成一些操作的交互与反馈.这个平台给我的直观感受是

  • 浅谈微信小程序之官方UI框架we-ui使用教程

    WeUI 是一套同微信原生视觉体验一致的基础样式库,由微信官方设计团队为微信内网页和微信小程序量身设计,令用户的使用感知更加统一.包含button.cell.dialog. progress. toast.article.actionsheet.icon等各式元素. 首先先看一下这套框架的GItHub地址 微信小程序UI框架we-ui 1.从git上clone到本地 太简单的东西我就不解释了,直接讲怎么用吧 这是解压后的目录 2.新建一个项目 将 dist/style/目录下的weui.wxss

  • 详解微信小程序框架wepy踩坑记录(与vue对比)

    wepy框架借鉴了vue的语法风格和功能特性,但是在使用过程中还是发现与vue有很大的不同.现在总结一下自己开发中遇到的问题,共大家参考一下.如果第一次用wepy开发,强烈建议仔细阅读一下这篇文章,一定对你有帮助,会帮你节约很多宝贵的时间.开发过程中也建议大家时不时的回来阅读一次,巩固加强记忆. wepy中的组件 组件里面的坑还不是一般的多! 首先来说说组件间的数据共享.在vue中你也能做到这一点,只要把 data 写成一个对象就可以了,当然你不想让所有的子组件都共享同一份数据,vue中的解决方

  • 微信小程序框架wepy之动态控制类名

    本文为大家分享了微信小程序框架wepy之动态控制类名的具体实现方法,供大家参考,具体内容如下 控制类名 style <style lang="less" scoped> .liBkgCor { background-color: red; } </style> template <view class="t_tab"> <li @tap.stop="changeLi({{1}})" class="

  • 微信小程序第三方框架对比 之 wepy / mpvue / taro

    众所周知如今市面上端的形态多种多样,手机Web.ReactNative.微信小程序, 支付宝小程序, 快应用等,每一端都是巨大的流量入口,当业务要求同时在不同的端都要求有所表现的时候,针对不同的端去编写多套代码的成本显然非常高,这时候只编写一套代码就能够适配到多端的能力就显得极为需要. 但面对目前市面上成熟的小程序第三方框架如何针对自己的需求进行选择也是一个麻烦事,本文针对当前市面上的三大转译框架进行一个综合对比,希望能对大家的技术选择有所帮助,如有哪里不妥的地方希望指正; 小程序开发有哪些痛点

  • 基于mpvue搭建微信小程序项目框架的教程详解

    简介: mpvue框架对于从没有接触过小程序又要尝试小程序开发的人员来说,无疑是目前最好的选择.mpvue从底层支持 Vue.js 语法和构建工具体系,同时再结合相关UI组件库,便可以高效的实现小程序开发 前言: 本文讲述如何搭建完整的小程序项目框架,因为是第一次使用,有不完善的地方请大佬指正. 搭建内容包括: 1.使用scss语法:依赖插件sass-loader .node-sass 2.像vue一样使用路由:依赖插件 mpvue-entry 和 mpvue-router-patch 3.使用

  • 手把手带你入门微信小程序新框架Kbone的使用

    Kbone 框架 前些天在微信上收到了微信开发者公众号的文章推送<揭开微信小程序Kbone的神秘面纱>,心想:微信小程序有新框架了?抱着学习的态度点进去看了一眼,看过之后觉得这框架也太宠开发者了吧,不愧是微信团队出品. 原来这个框架早在去年就已经发布了,看完只恨自己没有早点知道消息开始学习这个框架.我写本文的目的也是为了跟个风,想要让更多的人能够知道这个框架,感受它的便利,希望好学的你可以停下脚步看看~ Kbone 是什么? 看到这里我也不多说了,简单介绍一下 Kbone 是什么.用官方高大上

  • 微信小程序 数据交互与渲染实例详解

    微信小程序 数据交互与渲染 实现效果图: 微信小程序的api中提供了网络交互的api,我们只要调用即可和后端进行数据交互,该api为wx.request.,具体代码如下. //list.js //获取应用实例 var app = getApp() Page({ data: { list:[], hiddenLoading: true, url: '' }, loadList: function () { var that = this; that.setData({ hiddenLoading:

  • 微信小程序如何像vue一样在动态绑定类名

    小程序 开发中遇到这样一个问题... 排行榜开发的时候,前三名的样式不同,其余的样式一样.但是都是通过同一元素来遍历的,当时卡了一下.后来发现有module模块化这一概念,于是查了下api,一下子就做出来了. 就是不同名次上边的样式根据实际情况展示效果. 模块化 我们可以将一些公共的代码抽离成为一个单独的 js 文件,作为一个模块.模块只有通过 module.exports 或者 exports 才能对外暴露接口. 通俗的将就是自身独立,作用域只作用于该模块,与js互不影响. 主要代码 modu

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

    小程序MINA框架,及优点 MINA框架: 小程序使用的是MINA框架,目的是通过简单.高效的方式让开发者可以在微信中开发具有原生App体验的服务. MINA的核心是一个响应的数据绑定系统. 整个系统分为两块:视图层(view,描述语言wxml和wxss)和逻辑层(App Serice,基于 JavaScript).这可以让数据与视图非常简单的保持同步.当做数据修改时,只需要在逻辑层改数据,视图层就会做响应的更新.开发者只需要将页面路由.方法.生命周期函数注册进框架,其他的一切复杂的操作都将由框

  • 微信小程序wepy框架学习和使用心得详解

    一.微信小程序wepy框架简介: 微信小程序WePY框架是腾讯官方推出来的框架,类似的框架还有美团的mpvue,京东的Taro等; 目前公司开发小程序主要用到的是微信原生方法和官方的wepy框架; wepy框架在开发过程中参考了 Vue 等现有框架的一些语法风格和功能特性,对原生小程序的开发模式进行了再次封装,更贴近于 MVVM 架构模式, 并支持ES6/7的一些新特性.相对更容易上手,提高开发效率; 二.WePY项目的创建与目录结构 WePY的安装或更新都通过npm进行,全局安装或更新WePY

随机推荐