hero移动开发方案源起于点融网LB业务部门的一次无心的尝试,在点融的黑帮文化中发展出来的一个业界领先的开发方案。
先来一个类似产品的对比
react native | weex | 小程序 | ionic | hero |
---|---|---|---|---|
性能 | 良 | 良 | 尚可 | 尚可 |
布局 | 无序性能差 | 无序性能差 | 尚可 | 无序 |
设备能力 | 完全 | 完全 | 不完全 | 完全 |
开发成本 | 高级跨平台工程师 | 不详 | 高级web工程师 | 高级web工程师 |
开发工具 | 多种 | 不详 | 微信web开发工具 | 多种 |
框架代码量 | 巨大 | 巨大 | 非开源 | 大 |
入门难度 | 难 | 难 | 普通 | 有点难 |
{
class:"HeroLabel",
name:"name",
textColor:"ffffff",
text:"Hello hero !",
size:22,
frame:{"w":"1x",h:"80"},
alignment:"center"
},
class 一个界面元素必须包含的部分是,这指定了使用原生类的类型,
frame 指定了元素在界面中的布局,这个布局是三个平台上统一实现的
name 如果这个元素需要接收数据,那么给它设置一个name
其它option的属性,取决于元素是否实现
setTimeout(function() {
API.out({command:'refresh'});
}, 2000);
开发过程中使用定时刷新实现即时性效果,开发完成后注释掉
setTimeout(function() {
API.out({globle:{key:'finishLoading'}});
}, 100);
每个APP的第一个页面需要使用通过globle通知发送finishLoading告诉app关闭封面,上新功能的时候也可以发送一个showLoading来展示一个新功能slider,展示期间可以缓存新的HTML页面
@implementation HeroLabel
-(void)on:(NSDictionary *)json{
[super on:json];
if (json[@"text"]) {
self.text = json[@"text"];
}
if (json[@"alignment"]) {
NSString *alignment = json[@"alignment"];
if ([alignment isEqualToString:@"center"]) {
self.textAlignment = NSTextAlignmentCenter;
}else if ([alignment isEqualToString:@"left"]){
self.textAlignment = NSTextAlignmentLeft;
}else if ([alignment isEqualToString:@"right"]){
self.textAlignment = NSTextAlignmentRight;
}
}
if (json[@"size"]) {
double size = ((NSNumber*)json[@"size"]).doubleValue;
self.font = [UIFont systemFontOfSize:size];
}
if (json[@"textColor"]) {
self.textColor = UIColorFromStr(json[@"textColor"]);
}
if (json[@"font"]) {
double size = ((NSNumber*)json[@"size"]).doubleValue;
if ([@"bold" isEqualToString:json[@"font"]]) {
self.font = [UIFont boldSystemFontOfSize:size];
}
}
}
@end
**android的实现稍微有一点不同,由于java没法多继承,也没办法往系统库中注入方法,所以在android中实现一个基础类需要在on方法中调用的HeroView的静态方法on(view,json)来完成view的初始化。如果新元素继承了Hero元素则只需要和iOS一样调用super.on(json)即可。**
{
class:"MyLabel", //新功能的元素名
p1:"xxxxx", //新熟悉接受什么样的参数,结果如何
text:"Hello hero !",
size:22,
frame:{"w":"1x",h:"80"},
alignment:"center"
},
测试系统会自动为这个元素生成测试用例,如果各个平台上打开此测试用例结果都正确,表明这个元素实现完成。单元测试如下图
在Hero框架中有一个理念,页面上不应该有任何的逻辑,页面(view controller\activity\page)只负责显示元素,元素本身只接json数据,界面显示成什么样子完全由接收到的json数据来决定,而且页面本身只有 in 和 out 两个函数分别对应元素反馈数据,和给元素的数据。我们在js中重载这两个函数,并将数据发送到日志服务器。就可以知道一个用户的所有操作,并可以对操作进行完整的回放。我们截取了一段不包含敏感数据的截屏如下图:
Hero的核心理念是任何一个功能元素有且只有一个接口与外界交换数据。我曾经写了一个工具去检测一般项目中类之间的关系,方法是先找出当前项目的类列表,如果一个类中出现其它列表中的类就加1,结果是50个类平均结果是200左右,100个类平均结果是800左右,而且这个数以大于正比例曲线增长。大家可以想象一下一个新人面对一个大项目时候的囧迫,这简直是一张大网。传统的面向对象编程也许本身没有问题,但是在实际的的实践中遭遇了巨大的挑战,函数式编程是一种,而Hero是另外一种。
在服务端,Hero也有一个初步但是完整的实践,目录在hero-js/server当中。这里不再展开叙述。
提交到
https://github.com/dianrong/Hero
https://github.com/dianrong/Hero-ios
https://github.com/dianrong/Hero-android