在PhoneGap/Cordova应用程序中使用像RequireJS这样的AMD加载器是明智的吗?



我们都知道使用RequireJS的好处。我想知道在开发Cordova应用程序时是否需要考虑性能因素(特别是在Android 2这样的平台上)。X可能很慢)。假设我正在编写SPA并在导航到新视图时动态加载模块-即使我从文件系统加载,也不会有延迟问题吗?而不是加载我所有的JavaScript资产时,应用程序最初加载?

是的,我知道我可以自己测试——我只是想知道是否有人已经测试过性能了!

如果您使用rjs至少连接(如果不优化,当所有资产都在本地时,这可能是值得怀疑的好处)您的模块,您将不会从文件系统加载,而是从应用程序的初始加载。通过使用加载器插件,如"text"等,甚至你的HTML/模板资产也可以内联到你连接文件中的模块中,这样模板的加载就只是一个函数调用的"完美命中"。为了解决@Gajotres的观点,您可以对脚本标签进行排序并首先包含Cordova,或者通过require加载它。如果你需要。js 2.1.0(我相信)或更好的。所以——简而言之,如果你在混合移动端使用require.js,不要跳过连接步骤。假设你已经将模块连接到一个"构建"的js文件中,此时性能将取决于你无法控制的因素(设备,本地webview实现等)和你可以控制的其他因素…比如:

  • 应用程序的总体复杂性是多少?如果它是静态视图,那么显示/隐藏已经存在的DOM元素将比需要模板模块的模块更快,并且使用任何模板引擎渲染模板等等。
  • 假设它不是静态视图,深度嵌套的DOM结构(例如)会给你带来性能上的痛苦,回流等。

总的来说,Andrew Trice有一篇很棒的关于手机用户体验的文章:http://www.tricedesigns.com/2013/03/11/performance-ux-considerations-for-successful-phonegap-apps/

如果应用程序不是非常复杂,那么一个简单的构建步骤连接您的手工模块(这样您在开发时获得较低的认知开销的优势,加上一个文件的构建输出)可能就足够了。但是,除非你也在连接模板(以js模块可访问的格式),否则你必须在某个时候加载它们…

让我告诉你我的经验。

虽然require.js是一个优秀的工具,但在与Phonegap一起使用时存在一些延迟问题,主要是在较慢的设备上。它甚至会非常烦人。当然,总有一些变通办法,但是如果你需要变通办法使它正常工作,使用require.js又有什么意义呢?

在加载一些旧版本的cordova.js文件时甚至会出现一些问题,所以唯一的解决方法是通过classic script标签以常见的方式加载它,并且在require.js之前:

<script type="text/javascript" src="libs/cordova-2.1.0.js"></script>
<script data-main="js/main" src="libs/require-jquery.js"></script> 

一些框架在与require.js和Phonegap/Cordova一起使用时会出现类似jQuery Mobile的问题。基本上,所有需要尽快使用DOM的东西都会产生问题。还是有一些变通的办法,但还是有意义的。

最后,通过一些播放和修复,您可以获得可见的性能提升,但 DON'T 期望桌面环境提升。

EDIT:

真正的问题是从Cordova 2.1.0开始的,Cordova的延迟加载开始与require .js发生冲突,甚至两个框架的定义和需要的函数相互冲突。RequireJS没有等待deviceready事件,这导致了其他一些框架的问题。

目前所有的问题都修复为Cordova版本2.7.0。但我不能向你保证一定会出现其他问题。

让我们也谈谈其他问题。目前你担心Require.js会导致Phonegap的执行问题。即使这在目前最新的Corodva版本中是真的,这也不是一个大问题。

你需要担心你将使用什么框架来创建你的混合应用程序。目前完美的框架不存在,即使你创建一个纯javascript应用程序,你仍然无法创建一个"本地外观和感觉"的应用程序。即使是上一代的手机,也无法为你提供一个具有原生应用行为的丰富UI。

根据我的经验,在制作混合应用时,只有3种方法可以创造出接近良好的应用体验:

  1. Sencha touch
  2. Ex jqMoby(现为Intel AppFramework)
  3. 纯javascript应用

Require.js、curl.js或任何类似的框架在这里都帮不上什么忙。

最后一点,要特别注意ifandelse的答案,虽然有点偏离主题(像我的编辑部分),但它有一个更大的Require.js Phonegap兼容性

最新更新