现在移动互联网很火,各个公司貌似都比较重视这一快,因为这又是一个增长点,据我们的用户日志分析,发现我们公司的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. **样式设计**:React Native使用 StyleSheet API 来定义样式,它与CSS类似但有其独特之处,如支持静态尺寸和动态尺寸(如Percentage和Dimensions API)。为了达到与原生应用类似的体验,可以利用社区提供的库如...
通过将Web服务器集成到React Native应用中,开发者可以在不依赖外部服务器的情况下,实现动态数据的加载、本地资源的访问以及实时更新等功能。 这个项目的核心特性包括: 1. **动态内容服务**:由于服务器运行在...
4. **版本控制**:在服务器端,需要维护不同版本的资源,并能够识别客户端当前的版本,以便推送正确的更新。 5. **动态加载策略**:在用户启动应用时,检查本地版本与服务器版本的差异,只下载和加载必要的更新,...
- Image组件:React Native内置的Image组件用于显示静态或网络图片,还可以配合FastImage等库优化图片加载性能。 8. **推送通知**: - 为了实现类似美团的推送通知功能,需要集成Firebase Cloud Messaging (FCM) ...
3. 多线程:Java 是第一个在语言级提供内置多线程支持的高级语言,能够提高程序的执行效率。 4. 内存管理:Java 对内存自动进行管理并进行垃圾回收,减少了内存泄露和崩溃的风险。 Java 语言的优点: * 易于学习 ...
1. **弱类型与动态类型**:JavaScript是一种弱类型语言,这意味着变量不需要显式声明类型;同时,它也是一种动态类型语言,变量的类型可以在运行时改变。 2. **基于原型的对象系统**:与传统的类继承不同,...
5. **连接池管理**:内置连接池机制,有效管理和复用数据库连接,提升系统资源利用率。 6. **错误处理**:提供详细的错误信息,便于调试和问题定位。 7. **事务控制**:支持多种事务隔离级别,确保数据一致性。 8...
5. **项目结构**:一个典型的基于jsp+servlet+c++的项目结构可能包含以下几个部分:web目录下存放JSP页面和静态资源;WEB-INF目录下有web.xml配置文件以及servlet类;src目录下有Java源代码;lib目录下有依赖的JAR包...
然而,HTML本身只能提供静态的信息资源,缺乏与用户交互的能力。为了解决这一问题,出现了Common Gateway Interface (CGI)等技术,但这些技术在编程上相对复杂且不够灵活,限制了Internet技术的发展。 **1.2 ...
它是一种动态、弱类型、基于原型的语言,广泛用于客户端的网页交互。在React Native中,JavaScript被用来创建组件、处理用户交互、管理状态和网络请求。 **npm(Node Package Manager)** npm是Node.js的包管理器...
当WKWebView加载网页时,系统会自动缓存一些资源,如图片和静态文件,以便后续快速重载。然而,WKWebView并不直接支持离线缓存整个页面或动态内容,我们需要通过其他手段实现。 一种常见的缓存策略是利用HTTP协议的...
6. **安全性**:Tomcat的安全组件,如`org.apache.catalina.authenticator`包,提供了身份验证和授权机制,确保只有授权用户可以访问特定的Web资源。 7. **日志系统**:Juli是Tomcat内置的日志系统,它的源代码位于...
JavaScript是一种强大的客户端脚本语言,主要用于增强Web页面的交互性和动态功能。它的出现是为了克服HTML的静态特性,引入了动态内容和用户交互的可能性。JavaScript由 Netscape 公司开发,并在1995年首次引入,它...
### 使用Flutter与AWS Amplify快速构建iOS与Android移动应用 #### 概述 在当前的移动应用开发领域,开发者面临着巨大的挑战:如何在有限的时间内高效地开发出跨平台的应用程序,同时还要确保应用程序的质量、性能...
MySQL是世界上最受欢迎的关系型数据库管理系统之一,尤其在Web应用程序中被广泛应用。5.7版本是MySQL的一个重要里程碑,带来了许多性能提升和新功能。这里我们主要关注的是针对Windows 32位系统的“mysql-5.7.28-win...
它主要负责客户端的交互,让静态网页变得生动活泼,是Web开发的核心技术之一。JavaScript运行在用户的浏览器上,无需服务器支持即可执行,极大提升了用户体验。 JavaScript语法与Java类似,但两者并不相同。它是一...
20. **JSP中的include**:动态INCLUDE在编译时合并,静态INCLUDE在运行时合并。 21. **assert**:用于断言,调试时检查特定条件是否满足。 22. **GC(Garbage Collection)**:自动内存管理,回收不再使用的对象...
25、JSP中动态INCLUDE与静态INCLUDE的区别? 动态INCLUDE用jsp:include动作实现 它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。 静态INCLUDE用include伪码实现,定不会检查所含文件的变化...
- **Struts2**:基于WebWork,改进了Struts 1的不足,提供了更多的内置功能(如拦截器、类型转换、国际化支持等),简化了Web应用程序的开发过程。 - **Spring MVC**:基于Spring框架,充分利用了Spring的依赖注入...
5. **Guava**(guava-r07.jar):Google的Guava库是一个广泛使用的Java utility库,提供了大量静态方法来处理集合、字符串、I/O操作、并发任务等。虽然不是直接与HTTP通信相关的,但它能增强代码的可读性和效率,...