`
簡單從泚銷夨
  • 浏览: 74164 次
  • 性别: Icon_minigender_1
  • 来自: 文一西路969号
社区版块
存档分类
最新评论

web+native客户端静态资源内置与动态更新

 
阅读更多

       现在移动互联网很火,各个公司貌似都比较重视这一快,因为这又是一个增长点,据我们的用户日志分析,发现我们公司的APP用户和PC用户交集不是太大,并且服务器的负载在晚间是最高的,8核CPU。top load average达到将近12,这也说明用户喜欢晚上躺在床上玩玩APP,闲话说的太多,如果有对这方面感兴趣的话,可以给我发站内信,我们可以讨论下,实际上用户行为分析确实挺有意思的,好吧,到此为止,进入正题。

       由于我们的客户端是web+native方式实现的,这种机制我个人觉得现在还不成熟,用户体验相对而言不是太好,但对于版本迭代比较方便。机制是基础,想改变也不是那么容易,竟然不能改变,那就从容接受,先一步一步的优化吧,尽量提高用户体验,大家都知道,手机上网用户大部分还是2g,所以下载速度是个很现实到问题,所以应该尽量让用户少下载或者和少和服务器交互,对于web开发的应该想到了浏览器缓存和静态资源压缩,这里我就不讲压缩优化了,主要谈谈本地缓存,我们可以把不经常变的资源内置到客户端,客户端通过webview加载页面的时候可以判断本地有没有,有的话那直接用本地的资源,没有那就从服务器上下载,这样可以减少很多的HTTP请求,比如一个用户少10个http请求,那100W用户就是1000W个请求,这也减轻了服务器的压力,对于哪里可以内置到资源,我们可以选择 图片 js css 还有一些静态页面以及api接口数据,服务器端一次性全提供给客户端,内置成功后打包然后发包,我们写了一个内置资源后台管理系统,前端工程师需要内置哪些资源,他直接在后台录入,然后提供一个资源列表给客户端,这样把内置的需求搞定来,算优化的第一步吧!下面的问题来了, PM的想法真的是天马行空,某一天,需求变更,前端工程师发现之前发出去的APP包的内置资源要更新,那现在怎么办?

        这种需求很多,我们确实要解决这个问题,对于web开发的工程师都知道,都会在html中js和css加上一个版本号,以便让浏览器不走本地缓存,对于服务器开发的RD应该想到乐观锁。

对于内置的资源,我们可以大体分为两类:

1.api接口数据:

如:请求的接口到url:http://******,结果如下

{
action: {
action: "加载页面",
title: "购物",
pagetype: "html",
url: "http://******?vers=2"
}
......
}

 

客户端会把第一次请求到的数据给缓存到本地,以供以后直接使用。对于这种情况,可以通过本地内置了的资源版本号ver和服务器上资源的版本号做对比,做出选择是否要更新,如上例:发现本地内置到接口数据中http://******?vers=1,现在获取到vers=2,那说明这个url对应到的内置页面需要更新。

2.对于html这样的web页面,

<link rel="stylesheet" href="http://***/static/css/test.css?vers=4" />

<script type="text/javascript" charset="utf-8" src="http://***/static/js/jq.mobi.min.js?vers=15"></script>

 

通过html里面引用资源的版本号vers和本地资源的vers做对比来确定是否需要更新。

第二个问题也可以解决了,但又出现了新问题,资源的下载有依赖怎么办?

       比如js1依赖js2,js2依赖js3,如果网络不稳定,用户只下载了js1,那客户端也一样不可用,特别对于html页面更新了,js和css没下载成功,那将是致命的问题,所以对于必须要更新的资源一定要做到原子性

 

      整个更新的流程使我想到了数据库,想到了锁的粒度和原子性。

4
1
分享到:
评论
5 楼 簡單從泚銷夨 2013-05-05  
houyujiangjun 写道
簡單從泚銷夨 写道
houyujiangjun 写道
一年前已经做过,这个问题其实不用这样考虑,建议楼主思考缓存的本质,以及你们的应用服务器对缓存的策略。
另外,对于第一次使用客户端,你这种方法会下载大量的资源来做初始化,有一些几乎不用变的resources可以用一种取巧的办法来做,那就是客户端启动的时候,把这些不变的资源序列化成字符串,然后放到window.name属性,然后用window.location跳转到你们的应用地址,再用window.name取出来,我测试过,在webkit下性能很好。省却了大量的请求,直接当成本地资源。
千万不要用html5的localstorage等等东西,都是白搭,真的,别走冤枉路了。

谢谢你的建议,不过这样可能有两个问题,1.这个貌似只适用静态资源,对于api 返回json数据的那种你这个方法可能不行啊!2.这样和直接在页面里面写css和js好像没什么区别啊!会导致页面比较大,对于需要内置的html也不可取啊!我不知道我理解的对不对,呵呵!不过你这也是一个不错的想法。
还有我们内置资源只在打包的时候才存储到客户端的本地(一般是SD卡),然后才发包,所以不存在第一次使用客户端下载大量的资源,只有需要更新的时候才会下载新的资源。对于html5的localstorage,这个我们前端工程师调研过,确实不咋的,兼容性很不好,所以我们一直没用。:-)

是的,我说的那个取巧的办法确实只适合静态资源,但如果你使用了某些框架,如sencha extjs、 jqueryMobile,mobi等等,这种方法就可以用了,我当时是没想过要更新客户端,完全当成一个带壳的浏览器来用,因为本地权限都可以用phoneGap等等东西来调用。
还有,苹果对于这种带壳的东西审查很严格,去年听说渐渐要送下来,不知道现在怎么样了

我们客户端里面50%的功能是用web实现的,现在审核都能通过,我觉得web+native是以后的趋势,但现在还不太适合用太多的web,并经用户体验不是太好,页面加载还是不够快。
4 楼 houyujiangjun 2013-05-04  
簡單從泚銷夨 写道
houyujiangjun 写道
一年前已经做过,这个问题其实不用这样考虑,建议楼主思考缓存的本质,以及你们的应用服务器对缓存的策略。
另外,对于第一次使用客户端,你这种方法会下载大量的资源来做初始化,有一些几乎不用变的resources可以用一种取巧的办法来做,那就是客户端启动的时候,把这些不变的资源序列化成字符串,然后放到window.name属性,然后用window.location跳转到你们的应用地址,再用window.name取出来,我测试过,在webkit下性能很好。省却了大量的请求,直接当成本地资源。
千万不要用html5的localstorage等等东西,都是白搭,真的,别走冤枉路了。

谢谢你的建议,不过这样可能有两个问题,1.这个貌似只适用静态资源,对于api 返回json数据的那种你这个方法可能不行啊!2.这样和直接在页面里面写css和js好像没什么区别啊!会导致页面比较大,对于需要内置的html也不可取啊!我不知道我理解的对不对,呵呵!不过你这也是一个不错的想法。
还有我们内置资源只在打包的时候才存储到客户端的本地(一般是SD卡),然后才发包,所以不存在第一次使用客户端下载大量的资源,只有需要更新的时候才会下载新的资源。对于html5的localstorage,这个我们前端工程师调研过,确实不咋的,兼容性很不好,所以我们一直没用。:-)

是的,我说的那个取巧的办法确实只适合静态资源,但如果你使用了某些框架,如sencha extjs、 jqueryMobile,mobi等等,这种方法就可以用了,我当时是没想过要更新客户端,完全当成一个带壳的浏览器来用,因为本地权限都可以用phoneGap等等东西来调用。
还有,苹果对于这种带壳的东西审查很严格,去年听说渐渐要送下来,不知道现在怎么样了
3 楼 簡單從泚銷夨 2013-05-04  
houyujiangjun 写道
一年前已经做过,这个问题其实不用这样考虑,建议楼主思考缓存的本质,以及你们的应用服务器对缓存的策略。
另外,对于第一次使用客户端,你这种方法会下载大量的资源来做初始化,有一些几乎不用变的resources可以用一种取巧的办法来做,那就是客户端启动的时候,把这些不变的资源序列化成字符串,然后放到window.name属性,然后用window.location跳转到你们的应用地址,再用window.name取出来,我测试过,在webkit下性能很好。省却了大量的请求,直接当成本地资源。
千万不要用html5的localstorage等等东西,都是白搭,真的,别走冤枉路了。

谢谢你的建议,不过这样可能有两个问题,1.这个貌似只适用静态资源,对于api 返回json数据的那种你这个方法可能不行啊!2.这样和直接在页面里面写css和js好像没什么区别啊!会导致页面比较大,对于需要内置的html也不可取啊!我不知道我理解的对不对,呵呵!不过你这也是一个不错的想法。
还有我们内置资源只在打包的时候才存储到客户端的本地(一般是SD卡),然后才发包,所以不存在第一次使用客户端下载大量的资源,只有需要更新的时候才会下载新的资源。对于html5的localstorage,这个我们前端工程师调研过,确实不咋的,兼容性很不好,所以我们一直没用。:-)
2 楼 houyujiangjun 2013-05-04  
一年前已经做过,这个问题其实不用这样考虑,建议楼主思考缓存的本质,以及你们的应用服务器对缓存的策略。
另外,对于第一次使用客户端,你这种方法会下载大量的资源来做初始化,有一些几乎不用变的resources可以用一种取巧的办法来做,那就是客户端启动的时候,把这些不变的资源序列化成字符串,然后放到window.name属性,然后用window.location跳转到你们的应用地址,再用window.name取出来,我测试过,在webkit下性能很好。省却了大量的请求,直接当成本地资源。
千万不要用html5的localstorage等等东西,都是白搭,真的,别走冤枉路了。
1 楼 jiaoronggui 2013-05-04  
思路不错啊,期待后续新东西出现,也在考虑此问题

相关推荐

    尝试使用reactnative构建网易新闻客户端中的金币商城

    4. **样式设计**:React Native使用 StyleSheet API 来定义样式,它与CSS类似但有其独特之处,如支持静态尺寸和动态尺寸(如Percentage和Dimensions API)。为了达到与原生应用类似的体验,可以利用社区提供的库如...

    react-native-web-server:由Golang支持的可嵌入动态Web服务器,用于React Native应用

    通过将Web服务器集成到React Native应用中,开发者可以在不依赖外部服务器的情况下,实现动态数据的加载、本地资源的访问以及实时更新等功能。 这个项目的核心特性包括: 1. **动态内容服务**:由于服务器运行在...

    实现不更新apk来更新app

    4. **版本控制**:在服务器端,需要维护不同版本的资源,并能够识别客户端当前的版本,以便推送正确的更新。 5. **动态加载策略**:在用户启动应用时,检查本地版本与服务器版本的差异,只下载和加载必要的更新,...

    reactnative仿美团

    - Image组件:React Native内置的Image组件用于显示静态或网络图片,还可以配合FastImage等库优化图片加载性能。 8. **推送通知**: - 为了实现类似美团的推送通知功能,需要集成Firebase Cloud Messaging (FCM) ...

    java-打印.docx

    3. 多线程:Java 是第一个在语言级提供内置多线程支持的高级语言,能够提高程序的执行效率。 4. 内存管理:Java 对内存自动进行管理并进行垃圾回收,减少了内存泄露和崩溃的风险。 Java 语言的优点: * 易于学习 ...

    JavaScript语言教程&案例&相关项目资源

    1. **弱类型与动态类型**:JavaScript是一种弱类型语言,这意味着变量不需要显式声明类型;同时,它也是一种动态类型语言,变量的类型可以在运行时改变。 2. **基于原型的对象系统**:与传统的类继承不同,...

    node-firebird-driver-native:适用于Node.js TypeScript的Firebird高级本地客户端

    5. **连接池管理**:内置连接池机制,有效管理和复用数据库连接,提升系统资源利用率。 6. **错误处理**:提供详细的错误信息,便于调试和问题定位。 7. **事务控制**:支持多种事务隔离级别,确保数据一致性。 8...

    基于jsp+servlet+c++的图像拼接系统.zip

    5. **项目结构**:一个典型的基于jsp+servlet+c++的项目结构可能包含以下几个部分:web目录下存放JSP页面和静态资源;WEB-INF目录下有web.xml配置文件以及servlet类;src目录下有Java源代码;lib目录下有依赖的JAR包...

    JavaScript教程-从入门到精通

    然而,HTML本身只能提供静态的信息资源,缺乏与用户交互的能力。为了解决这一问题,出现了Common Gateway Interface (CGI)等技术,但这些技术在编程上相对复杂且不够灵活,限制了Internet技术的发展。 **1.2 ...

    Simple-React-Native-App

    它是一种动态、弱类型、基于原型的语言,广泛用于客户端的网页交互。在React Native中,JavaScript被用来创建组件、处理用户交互、管理状态和网络请求。 **npm(Node Package Manager)** npm是Node.js的包管理器...

    NewNXYTDemo.zip

    当WKWebView加载网页时,系统会自动缓存一些资源,如图片和静态文件,以便后续快速重载。然而,WKWebView并不直接支持离线缓存整个页面或动态内容,我们需要通过其他手段实现。 一种常见的缓存策略是利用HTTP协议的...

    apache-tomcat-7.0.90-src

    6. **安全性**:Tomcat的安全组件,如`org.apache.catalina.authenticator`包,提供了身份验证和授权机制,确保只有授权用户可以访问特定的Web资源。 7. **日志系统**:Juli是Tomcat内置的日志系统,它的源代码位于...

    JavaScript教程

    JavaScript是一种强大的客户端脚本语言,主要用于增强Web页面的交互性和动态功能。它的出现是为了克服HTML的静态特性,引入了动态内容和用户交互的可能性。JavaScript由 Netscape 公司开发,并在1995年首次引入,它...

    Build_iOS_and_Android_mobile_apps_in_record_time.pdf

    ### 使用Flutter与AWS Amplify快速构建iOS与Android移动应用 #### 概述 在当前的移动应用开发领域,开发者面临着巨大的挑战:如何在有限的时间内高效地开发出跨平台的应用程序,同时还要确保应用程序的质量、性能...

    mysql-5.7.28-win32.zip

    MySQL是世界上最受欢迎的关系型数据库管理系统之一,尤其在Web应用程序中被广泛应用。5.7版本是MySQL的一个重要里程碑,带来了许多性能提升和新功能。这里我们主要关注的是针对Windows 32位系统的“mysql-5.7.28-win...

    示例组合

    它主要负责客户端的交互,让静态网页变得生动活泼,是Web开发的核心技术之一。JavaScript运行在用户的浏览器上,无需服务器支持即可执行,极大提升了用户体验。 JavaScript语法与Java类似,但两者并不相同。它是一...

    java面试题 最全面的面试题

    20. **JSP中的include**:动态INCLUDE在编译时合并,静态INCLUDE在运行时合并。 21. **assert**:用于断言,调试时检查特定条件是否满足。 22. **GC(Garbage Collection)**:自动内存管理,回收不再使用的对象...

    超级有影响力霸气的Java面试题大全文档

    25、JSP中动态INCLUDE与静态INCLUDE的区别?  动态INCLUDE用jsp:include动作实现 它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。 静态INCLUDE用include伪码实现,定不会检查所含文件的变化...

    java面试题

    - **Struts2**:基于WebWork,改进了Struts 1的不足,提供了更多的内置功能(如拦截器、类型转换、国际化支持等),简化了Web应用程序的开发过程。 - **Spring MVC**:基于Spring框架,充分利用了Spring的依赖注入...

    java http 所需包 全

    5. **Guava**(guava-r07.jar):Google的Guava库是一个广泛使用的Java utility库,提供了大量静态方法来处理集合、字符串、I/O操作、并发任务等。虽然不是直接与HTTP通信相关的,但它能增强代码的可读性和效率,...

Global site tag (gtag.js) - Google Analytics