最近开发微信小程序的时候,想尝试转移到 Tencent/wepy 这个腾讯官方的小程序框架中。官方介绍它的优势在于:
- 支持 Promise
- 开发语法接近于 Vue.js(组件化开发)
- 支持使用第三方 npm 资源
看起来非常诱人!抱着试一试的心态,只先生(就是我,我的ID是只准周末喝饮料),作为一个入门小程序一个学期左右的小白,开始了 wepy 框架的初体验。由于我之前的小程序逻辑并不复杂,所以迁移看起来好像并不是特别困难的事情。
但是,真正迁移过去之后,我意识到了很多问题,这让我对 wepy 有了一个更加客观的认识。下面我从 wepy 官方主打的几个特性来分析 wepy 和小程序原生框架
Promise
没得吹,Promise 的确很好用。
比如要发起 HTTP 请求,小程序原生的写法可能是
wx.request({
url: url,
method: 'GET',
data: {},
header: {
'Accept': 'application/json'
},
success: function (res) {
// ...
}
});
但是通常一个项目中会有很多 HTTP 请求,这样大段的代码在逻辑上并不是很清晰。我们自然是希望可以独立成一个组件(比如说叫 api
),然后所有的请求都通过这个组件来实现。可是由于不支持 Promise,小程序请求内容无法用 .then
进行传递,这样就不能抽象成函数来独立返回了。
而在 wepy 中,这个问题得到了很好的解决。比如我独立出来的一个组件 wxRequest
// wxRequest.js
import wepy from 'wepy'
const wxRequest = async (params = {}, url) => {
let data = params.query || {}
let res = await wepy.request({
url: url,
method: params.method || 'GET',
data: data,
header: {
'Content-Type': 'application/json'
}
})
return res
}
module.exports = {
wxRequest
}
这里用到了 await 异步操作,非常优雅的抽象出一个请求的函数。当我们要发起 HTTP 请求的时候,就直接很简单一句话就 OK 了
const getRecommendationList = (params) => wxRequest(params, apiRoot + 'recommendation')
网络请求对比结果,因为目前主流前端框架都支持这个功能,所以小程序不支持只能得两星!
- wepy ⭐⭐⭐⭐⭐
- 小程序原生 ⭐⭐
开发语法
说实话,我觉得小程序开发语法已经无限接近于 Vue.js 了,只不过没有显式的写到一个文件里面而已...并且开法语法这个问题见仁见智,我觉得并不是特别重要。小程序原生在上手难度上还是很友好的。
但是,在实际操作的过程中,我发现了 wepy 一个很致命的缺点!那就是自定义组件不可以动态绑定属性!这意味着,如果你自己写了一个组件,想要用一个 wx-for
来循环渲染生成的的话,wepy 是不能办到的!
下面是一个错误示范
// 错误示范!
更坑爹的是,自定义组件在循环内共享数据!wepy 官方的解决方案是,用不同的组件。也就是说,上面的代码正确的写法是
显然影响到正常开发了
这点上小程序原生完胜
- wepy ⭐
- 小程序原生 ⭐⭐⭐⭐⭐
组件化开发
当然是很爽的!小程序因为在上传文件大小有限制,所以那么一大堆的 node_modules
肯定是不能在移动端进行操作的。但是 wepy 不知道怎么优化就变得可以这样操作了。
对于大部分开发者来说,这意味着小程序开发和前端开发又拉近了不少距离!那些喜欢的插件像是 Redux,通通都可以用!
这点不用多说,我觉得这个是 wepy 的核心竞争力。
- wepy ⭐⭐⭐⭐⭐
- 小程序原生 ⭐
总结
总的来说,wepy 的确有很多改进的地方。并且熟悉的 npm install 等等指令都无限拉近了小程序和 web 开发之间的距离。虽然有一些问题,但是腾讯肯定会好好的维护这个框架的!
那么我的建议是,如果你的项目迫切的需要状态管理机制(需要 Redux),请用 wepy。其他的朋友,就直接用小程序原生吧!所以最后,我把我们的项目又切换回到小程序原生了。