开发。现在手上的某App,正在同步使用 Cordova + React 和 React Native 分别开发 UI
层(逻辑层代码公用)。当然,都是小型应用,还不需要像 @李维特 写的一样考虑页面切换等问题……
我的结论是:坑、好大的坑、虎纹大坑。
才疏学浅,只总结出以下问题:
1. 性能问题
先是动画。
无论是 CSS3 动画、还是 Canvas 动画,还是 JavaScript 操作 DOM 的动画,都卡;后者尤甚。高端机尚可,低端机是可以卡成幻灯片的。我录过 GIF,使用的设备是台电P88,全志 CPU 。大概就是这样:http://zsxsoft.qiniudn.com/upload_images/2015/08/201508158461_695.gif
其次,是 DOM 性能问题。
感谢 React 带来了 Virtual DOM,部分解决了局部区域 DOM 刷新时的性能问题。不过,一旦涉及到较大区域 DOM 更新,反倒有更大的性能损耗(最终计算出来的结果还是要全部替换掉,多做了一步 Diff )。
因为性能问题,Facebook 2012年离开了 HTML5 App 阵营(Facebook: “Betting on HTML5 Was a Mistake”)。但时至今日,还是没有什么改善。也分享一篇文章,可以看看坑:移动端HTML5游戏性能优化。
这里有个例子:微众银行 App 是 Cordova + Ionic + Angular。微众很行app十分卡顿,大家觉得么?
2. 兼容问题
先只算官方系统。Android系统的 WebView 一般随 Android 版本更新(当然,也可以自己去 Play Store 更新),每个版本所支持的功能均不同。坑的是,在国内的环境下,基本不会再更新了。有的功能,在 PC 上对应版本的Chrome 是有的,到该版本 WebView 就没有了。
比如说,XMLHttpRequest 的 onprogress 在 Android 4.0.4 上不被支持。于是,针对这类系统,只能采用像之前对 IE 的 Hack 一样,用 iframe 来替代进度条。
再比如说,ECMAScript 6 被高版本 WebView 支持。如果开发者写惯了后,引入了 Symbol 等,又忘记了 polyfill 。在低版本 WebView 就会出错。就像我这样:<Table>doesn't support old browsers. · Issue #1685 · callemall/material-ui · GitHub
接着呢,感谢 ROM 厂商乱改系统自带的 WebView ,从而导致在各种小细节上不同手机的显示效果或运算结果不同。更倒霉的是,有的甚至还会全页面混乱。
怎么解决?个人认为,像微信那样自带一个 X5,也许算是一个解决方案吧。
至于兼容问题的例子,还是微众银行好了:https://www.v2ex.com/t/215728 (与新版 iOS 9 的 WebView 不兼容)
3. 调试问题
先吐槽:Android 5.0+ 的系统内的 WebView ,可以用 Chrome for PC 来调试。但需要翻墙。
调试分调试 JavaScript 和界面两方面。
JavaScript
方面,如果 throw 出一个错误,很可能剩下的事情你都干不了了。手机端的表现就是什么操作都没用,也不会崩溃退出之类。在开发时,对于
JavaScript 报错,MUI 和 Cordova 均可以通过 adb logcat 来检查报错;Release 后可就没办法找用户连
USB 了。weinre 等工具对于 JavaScript Debug 没啥用。
那 weinre 干啥用?只是让你看 DOM 层级或动态执行代码罢了。这就是 UI 方面的调试了。这部分的话,考虑到兼容问题,自求多福吧……
Cordova 提供了 Ripple,倒的确是一个很不错的解决方案。但是并不能涵盖所有的手机……
4. 代码安全性问题
正
如.apk ->.dex ->.jar ->.class ->.java一下就能把代码全部拿出来看一样,.apk
->.js 更为方便,解压一下就好了。于是,在 Release 前,必须 gulp / grunt 构建工作流,把 uglify
之类全部一股脑塞进去。这部分和做网页前端没啥区别,差别大概只有不需要考虑代码切分等(毕竟没有网络,全在本地)。
然而,这样的代码,修改成本非常低。比如我做一个付费的本地游戏,只要简单地修改一下.js,轻轻松松破解验证等后重新打包回去,破解版游戏就做好了,比 Java 的简单多了。就算有 C++,我 js 不调用你,你又奈我何?没有服务器验证的话,玩蛋去吧。
5. 功能问题
如果没有 Native Code,一切HTML5 App都是空架子。所以,Java / Objective-C / C#仍然是必须学习的语言;Native App 如何开发也仍然是必修。比如以下代码,就是在 MUI 里用原生浏览器打开一个链接。
function openInBrowser(originalUri) {
var Intent = plus.android.importClass("android.content.Intent")
var main = plus.android.runtimeMainActivity()
var Uri = plus.android.importClass("android.net.Uri")
var uri = Uri.parse(originalUri)
var intent = new Intent(Intent.ACTION_VIEW, uri)
main.startActivity(intent)
}
当然,Cordova 就得写 plugin 了,更为繁杂。
tmall简介:
“天猫”(英文:Tmall,亦称淘宝商城、天猫商城)原名淘宝商城,是一个综合性购物网站。2012年1月11日上午,淘宝商城正式宣布更名为“天猫”。2012年3月29日天猫发布全新Logo形象。2012年11月11日,天猫借光棍节大赚一笔,宣称13小时卖100亿,创世界纪录。天猫是马云淘宝网全新打造的B2C( Business-to-Consumer,商业零售)。其整合数千家品牌商、生产商,为商家和消费者之间提供一站式解决方案。提供100%品质保证的商品,7天无理由退货的售后服务,以及购物积分返现等优质服务。2014年2月19日,阿里集团宣布天猫国际正式上线,为国内消费者直供海外原装进口商品。
2014年11月11日天猫双11再刷全球最大购物日记录,单日交易571亿。
2014年12月11日,针对工商总局曝光天猫1号店双十一售假一事,天猫官方发布回应表示,对假货“零容忍。”已下架3件涉假商品和1件不合格商品,并冻结涉假店铺。待查实后,将对涉及的店铺进行封店、清退。
参见百度百科:http://baike.baidu.com/link?url=MlP0IYeyO2RKrI82CgL4rNSZBrjjHPh6ZbyIxUGm16FGfL9zbONjfC6qxDnc_5jIbSsb8Yjf97eL_h99z3UD0K
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/htmlcharset=utf-8" />
<title>无标题文档</title>
</head>
<body>
第一种实现方法:图片作为背景
<div style="width:110pxheight:110pxbackground-image:url(http://tb.himg.baidu.com/sys/portrait/item/b5ceb7e7d6d0b5c4bcc5c4af5f8909)position:relative">
<div style="width:83pxheight:20pxbackground-image:url(http://tieba.baidu.com/tb/static-money/mall/mall_5.gif)position:absolutebottom:0">
</div>
</div>
第二种实现方法:div使用绝对定位,图片作为div里的对象
<div style="width:110pxheight:110pxposition:absolutetop:180pxleft:0">
<img src="http://tb.himg.baidu.com/sys/portrait/item/b5ceb7e7d6d0b5c4bcc5c4af5f8909"/>
<div style=" position:absoluteleft:0bottom:0">
<img src="http://tieba.baidu.com/tb/static-money/mall/mall_5.gif" />
</div>
</div>
</body>
</html>
两种方法都可以,也可以自己再组合。
演示的图片是直接使用百度贴吧里的图片的,楼主可以换成自己的图片。
代码直接贴过去运行就可以了。