HTML5和原生方式差距有多大,有多少坑?
发展。现在手里的一个App正在分别用Cordova+React和React Native开发UI。
层(逻辑层代码通用)。当然都是小应用,不需要像@ Levitt写的那样考虑页面切换...
我的结论是:坑,好大的坑,老虎坑。
一知半解,只总结了以下几个问题:
1.性能问题
第一部动画。
无论是CSS3动画、Canvas动画还是JavaScript操作DOM动画,都卡死了;后者尤其如此。高端机还可以,低端机可以卡成幻灯片。我录过GIF,用的设备是台电P88和全志CPU。大概就是这样:/upload _ images/2015/08/201508158461 _ 695 . gif。
其次,就是DOM性能问题。
得益于React带来的虚拟DOM,部分解决了局部区域DOM刷新的性能问题。但是一旦涉及到大面积的DOM更新,性能损失会更大(最终的计算结果还是会被替换,多做一步Diff)。
脸书在2012年因为性能问题离开了HTML5应用阵营(脸书:“押注html 5是个错误”)。但时至今日,依然没有任何改善。另外分享一篇文章,可以看看坑:移动HTML5游戏性能优化。
这里举个例子:微众银行App是Cordova+Ionic+Angular。微众很好,app很卡。你怎么想呢?
2.兼容性问题
目前只是官方系统。安卓系统的WebView一般都是用安卓版本更新的(当然你也可以自己去Play商店更新),每个版本支持的功能都不一样。陷阱是在国内环境下,基本不会更新。有些功能在PC上相应版本的Chrome中有,但在这个版本的WebView中没有。
比如Android 4.0.4不支持XMLHttpRequest的onprogress。所以对于这种系统,我们只能用iframe代替进度条,就像之前黑IE一样。
再比如,更高版本的WebView支持ECMAScript 6。如果开发人员习惯了书写,他们会引入Symbol而忘记polyfill。在WebView的较低版本中,您会得到一个错误。就像我一样:
然后,得益于ROM厂商对系统自带的WebView的篡改,不同手机在各种小细节上的显示效果或计算结果是不一样的。更糟糕的是,有些人甚至有一整页的困惑。
怎么解决?个人认为,带一个类似微信的X5可能是一个解决方案。
至于兼容性问题的例子,最好用微众银行:/t/215728(不兼容iOS 9新版本的WebView)。
3.调试问题
先吐槽:Android 5.0+系统中的WebView可以用Chrome进行PC调试。但是它需要翻墙。
调试包括调试JavaScript和接口。
Java Script语言
另一方面,如果throw出错,您可能无法完成其余操作。手机的表现就是什么都没用,不会死机退出。在开发的时候,对于
JavaScript报错,MUI和Cordova都可以通过adb logcat检查错误;发布后,没有办法找到用户连接。
USB。weinre等工具对于JavaScript调试毫无用处。
那温纳是干什么的?只是向您展示DOM层次结构或动态执行代码。这是UI的调试。在这一部分,考虑到兼容性问题,为自己谋福...
Cordova提供了Ripple,这确实是一个非常好的解决方案。但是它并没有覆盖所有的手机...
4.代码安全问题
直的
比如。apk->;。dex->;。jar-& gt;。class->;。java可以一次性把所有代码拿出来,就像。apk
-& gt;。js更方便,解压就好。因此,在发布之前,gulp/grunt必须建立工作流,并进行丑化。
然后全部塞进去。这部分和做网页前端没什么区别,只是不需要考虑代码分段(毕竟没有网络,都是本地的)。
但是,这种代码的修改成本非常低。比如我做一个付费的本地游戏,只需要简单的修改。js,轻松破解验证,然后重新打包回去,破解版游戏就做好了,比Java简单多了。就算有C++,我的js也不会调用你,那你能怎么办?如果没有服务器验证,就去玩彩蛋吧。
5.功能问题
如果没有原生代码,所有HTML5 App都是空架子。所以Java/Objective-C/C#还是一门必须要学的语言;如何开发Native App还是必修。例如,下面的代码将在MUI中使用原生浏览器打开一个链接。
函数openInBrowser(originalUri) {
var Intent = plus . Android . import class(" Android . content . Intent ");
var main = plus . Android . runtimemainactivity();
var Uri = plus . Android . import class(" Android . net . Uri ");
var uri = uri . parse(original uri);
var intent =新意向(intent。ACTION_VIEW,uri);
main . start activity(intent);
}
当然Cordova还要写plugin,比较复杂。