我用 Weex 重写了一个应用

2017/1/8 17:37 下午 posted in  iOS comments

我司的一个应用一直有被 Apple 拒的传统,今年的情况更糟糕,已经好几个月没通过了😢。正好最近我的一个项目结束了(这又是另外一个悲伤的故事🙊……),有时间来研究一下热更新技术,绕过 Apple 的审核。

热更新现在大热的两个方案是 React Native 和 Weex。这两个方案的比较文章网上有很多,我就不多赘述了。大家应该已经知道我选择了 Weex(废话,标题都说了=_=),我就说下为什么选这个:

  1. Weex 的语法上手容易,会基本的 html 和 javascript 就能写;
  2. 国人写的大作,支持一下😄;

嘿嘿,就这么简单的理由,是不是有点拍脑袋?
嗯,是的。因为当时对于我来说也看不出哪个更好,所以先简单选一个试试。结果发现……坑好多……

Weex 的优点我就不说了,他们自己天天宣传。我就说说我发现的缺点吧。

Weex 的坑

当前我用的是 0.9.4,Weex项目还在不断的迭代,我下面说的有些问题以后会解决。

不支持页面之间直接相互传递数据

Weex以页面来划分功能,所有接口基本都是为一个页面服务。每个页面之间是相互独立,互相不知道对方,没法直接相互传递数据。
怎么理解这个逻辑?你可以把整个应用想象成一个网站,每个页面都是一个网页。每个单独网页之间当然不能直接传递数据。Weex界面也是这个情况。
为什么这么设计?因为 Weex 支持 H5。H5 页面之间可没发直接传递数据。
当然了,Weex 还是提供了方法来解决这个问题。

如果你有两个页面,A 页面和 B 页面
1. A -> B,使用 getConfig api 和 storage module 传递数据;
2. B -> A,使用 storage module 传递数据。

白话点,就是传递下一个页面,可以把数据拼接点 B 页面的 url。也可以选择把数据序列化成字符串保存到 storage, 返回的前面一个页面,则只能用 storage

你看,好麻烦。

不支持全局对象和变量

意思就是不能声明单例对象。原因嘛上一点都说了。这点就造成每个页面都要自己去获取登陆状态,用户信息等。很浪费。
对客户端还有一点就是,导致没个页面都得有处理推送消息之类的全局性代码……

不支持 z-index

这个主要影响动画,没法做一些手势动画。

不支持 scrollView 的滚动事件

这个同样影响动效实现。当然在 sdk 里提供了客户端代码监听的方法,想在 Weex 的代码里有就只能自己想办法。

不能动态创建 html 标签

严格说,应该说是不能方便的动态创建 html 标签,因为 Weex 提供了底层的 Virtual Dom API。但是呢,你看了就知道,聊胜于无。解决这个问题的办法就是所有界面组件都先写上,然后通过 if 属性来控制显示与否。

文档缺乏

Weex文档写得相当简单,很多东西需要自己去摸索。更新也慢,sdk 里有好些内容文档没有体现。所以遇到问题都我都是去看 iOS sdk的源码来解决……

以上就是写了两个多月的体会到主要问题。虽然问题多,但 Weex 的扩展性还行,遇到解决不了的问题就自己撸一个就好,你看我撸了多少:
custom module

经验分享

既然已经探了这么多坑,我准备写一系列的教程分享出来。我是一个 iOS 开发者,所以主要以 iOS 的角度来写。我不打算写太具体的细节,入门的内容官方文档已经有了,我主要根据开发过程中会遇到的问题来写。
这是一个文章目录:
写给 iOS 程序员的 Weex 教程(1):环境搭建
写给 iOS 程序员的 Weex 教程(2):打造自己的 iOS工程
写给 iOS 程序员的 Weex 教程(3):界面布局和业务逻辑开发
写给 iOS 程序员的 Weex 教程(4):构建自己的工作流,提高研发打包发布效率
写给 iOS 程序员的 Weex 教程(5):增量更新实现
写给 iOS 程序员的 Weex 教程(6):本地图片加载和上传