我计划创建一个主要针对手机的网站,其中包含大约 20 个不同的 View /页面。
如果我想专注于在页面之间切换时让用户体验非常灵敏(如快速),将网站创建为单页应用程序是个好主意吗?
我知道有很多技巧可以提高移动网站的整体性能:
http://www.slideshare.net/blazeio/mobile-web-performance-optimization-tips-and-tricks
但我主要担心的是,与创建传统 HTTP 请求相比,客户端 JavaScript(例如 AngularJS)在需要执行 AJAX 请求然后动态显示/隐藏/创建元素时实际上会降低性能获取页面及其内容并直接显示。
有什么资源或意见可以帮助我了解哪种架构更适合移动网站?
最佳答案
TL;DR:单页应用程序需要更多地关注它们的架构,尤其是当您要迁移现有网站的功能时(哦,棕地项目很难)。
一个常见的支持 SPA 的论点集中在较少下载的内容。虽然在技术上是正确的,但它与具有高延迟的蜂窝连接的相关性较低。剧透警告:所有蜂窝连接都是高延迟。
下载 10KB 和 15KB 之间的差异可以忽略不计,正是连接建立开销耗尽了移动体验的所有乐趣。
您很少能影响 latency (尽管可以使用 CDN 和托管在云中),但您可以抵消它的影响。资源 bundling and minification是有效的,无论使用的环境如何,底层概念都适用。
无论如何你都应该对你的内容进行 gzip 压缩,并且 the way it works进一步缩小(哈哈)大小参数。基本上,它专注于重复字符序列,并且对于诸如臃肿 HTML 标记之类的事情比精简 JSON 更有效。这对于 clojure 编译的 javascript 来说很荒谬。
始终是一个很好的提示,但请确保您的内容使用有效的 Content-Length header 提供 to allow persistent connections .
另一方面,一个常见的反 SPA 论点是这样的:ZOMG so much javascript。当然,您不能再像在传统网站上那样“可以”承受内存泄漏(大多数会在导航到不同页面后立即得到补救),但是编写良好的 javascript 会有所返回。
在移动网站上使用 jQuery 有时是一种必要之恶。不妨用一下 properly .
您拥有的 javascript 越多,让它不在每次“页面加载”时重新执行的相对动机就越大。您在页面上包含的任何框架都必须在使用前进行初始化,这需要解析和执行其代码...在使用它的每个页面上。 SPA 只需执行一次此步骤(不过,这不是依赖管理不佳/缺失的借口)。
这也适用于 CSS。当用户交互后将新内容添加到 DOM 时,与新加载相比,重新流动和重新绘制的次数会更少;浏览器也不需要再次解析样式表。
单页应用程序的真正优势在于其感知性能。你我都知道点击链接不会立即解决,但用户不必这样做。通过添加触摸状态和适时的 throbber 使网站响应用户交互将显着改善用户体验。当然,您始终可以多走一步并预取某些内容。也许在当前页面准备就绪后立即在后台加载下一页/项目/照片有意义吗?
不要忽视 SPA 的热门和流行这一事实,以及尝试使用一些迷人框架的动机因素。当然,最终用户不会关心这些事情,但是您可以学到一些新东西,并且成熟的 MVVM 框架可以让您忘记让这个该死的 ajax 工作并让您专注于应用程序的其他方面。
关于javascript - SPA(单页应用程序)是否适合针对移动设备的网站?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20229862/
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby数组,我们在StackOverflow上找到一
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
我想用ruby编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife