html5手机Web单页应用实践--起点移动阅读

简介: html5手机Web单页应用实践--起点移动阅读

一开始以hybrid形式做了一个android的小说阅读客户端,叫4G阅读。而后由于业务需求,要迅速实现纯手机html5 版的,所以就直接在原先客户端内内嵌的网页进行改版,快速实现以后在优化的过程中发现越改越多越改越多…

注意此web应用只支持android及iphone内的浏览器,及PC或mac上的chrome,safari,firefox等支持html5的浏览器。IE10以上浏览器

这算是试验版了吧,以前没这么弄过..

手机访问http://crapi.4gshu.com:8096/4g-read-qd/#index

先上图,有图有真像


文件结构及路由


 


 

HTML


 

Index.html

整个应用框架的基础,包含了头部,尾部HTML,及主要各个页面部分的容器(content-panel)

根据hash路由通过ajax方式加载对应的内容页再添加到对应的comtent-panel内

以下是主要内容模块(内容为html片段)

Index-c.html逛

Category-c.html分类

Rank-c.htm排行

Discovery-c.html发现

Channel-c.html男频,女频...

Search-c.html搜索

Bookshelf-c.html书架

Catalog-c.html 目录

 


 

CSS


 

编写css时使用了less,特别是在修改时,尤其的好用

Public.css 包含了大部分的应用样式

Idangerous.swiper.css 切换插件的样式文件

内容页的样式可以在自身页面内自行添加


 

Javascript


 

Avalon.js

在此处用这个MV*框架,主要是方便处理将json数据渲染到DOM上

Jquery.js

很想使用zepto之类的轻DOM框架,但最终还是选择了jquery2.0,原因是方便扩展插件,很多插件不兼容zepto,其实JS文件的大小远没有你想象的那么影响web应用的表现,其实css的渲染影响更大,血的教训啊。关于JS文件过大的问题,其实应用基本上是在3G或wifi情况下使用,你非要在2G环境下使用,那干麻不用WAP版...

Idangerous.swiper.js

非常强大的轮播插件,其实可以实现很多东西。所以选用它来实现轮播

Mango-decoupling.js

很好用的消息插件,用于程序中解耦设计,其消息机制也非常强大

Config.js

由于将这个应用分发到不同的渠道,而不同渠道又有一些不同的配置需求,所以用了config.js来配置一些属性

Core.js

整个框架通用JS的核心,包含了本地储存,通信,通用的事件与方法

 

为了方便实现,及减少JS文件数,各个内容模块的JS业务逻辑都直接写在各自的html片段中。内容模块在渲染完毕后应该向框架发送一个渲染完毕的消息,或执行框架提开放的渲染完毕API,比如“page_ready”,方便框架处理loading等全局的控制


 

本地存储


 

1、离线存储cloudary.appcache,尽可能的将css,js,image,及HTML代码片段文件都离线存储至本地。初次访问时会将所有相关文件都离线到本地,以后再次访问,会优先读取离线到本地的文件

2、Localstorage存储接口数据。开发过程中明显感觉到,后台提供的数据接口的速度明显影响了整个应用的表现,所以在初次访问动态数据接口时将使用localstorage将整个接口返回的数据存储到本地,以后再次访问时先优先读取本地的数据,然后后台会静默更新数据到localstorage内,由于应用没有那么高的实时性要求,所以此方案可行。


Hash路由


 

整个应用的内容模块content-panel其实是由hash路由来连起来的,构成了所谓的单面应用,即不刷新整个页面。一开始使用的是popstate来实现,结果发现在chrome浏览器下一进页面就会触发一次popstate事件,比较奇葩,这个问题是在应用完成后发现的,还好popstate事件是在core.js中进行过封装的,我就在封装处将popstate事件替换成了hashchange事件,所以说对外部的API还是要抱有不信任的态度,尽量进行封装分隔,万一发生改变,改起来也快。在加载不同的内容模块时,通过wndow.history的pushState和replaceState来实现hash值的改变,在一进页面时首先得把自身页面进行一次replaceState,将自身加入history队列,否则history队列会乱(一大坑啊,反正我以前没replaceState时是遇到过,怎么也管理不好队列)。

根据UI上的设计及功能的不同,我将路由分成了两类,

主页路由:

Index 逛

Category分类

Rank 排行

Discovery 发现

子页路由:

Channel频道

category-detail 分类详情

Topic 专题

Detail 详情

Search 搜索

Bookshelf 书架

Catalog 目录


关于路由的速度优化


 

1、很多内容模块打开过一次后再次打开时完全是不用再请求的,所以得判断是否打开过,打开过的应用再次打开时就不再请求对应的html片段了,直接显示之前请求下来的html片段,比如index,category,rank,discovery,topic,bookshelf,search这几个内容模块

 

2、对于需要更新内容的模块,比如detail,channel模块,第一次请求到html片段后也可以缓存下来,以后每次请求新的内容时只需要通过JSON数据更新dom即可,即无需把dom清掉再重新创建新dom。这一点的优化对于性能比较差的mobile设备上尤其重要,这样实现后,请求数据这个动作需要在路由发生变化时发送自定义消息(如:refresh_with_new_data),接受到自定义消息时再发送数据请求,得到消息后再更新dom的内容。

 

3、即使对于需要更新的内容,同一个链接,连续被打开时,由于数据完全没有变化,所以也可以完全不去请求数据,即可做到所谓的“秒开”

 


理论上应该用但并未使用的技术


 

1、backbone,算是比较广泛的mvc框架了,自身提供了路由功能,但个人觉得需要写的代码量太大,如果是团队使用用来规范代码还行,如果个人使用的话,我觉得还是太重了。写一个简单的功能就一大堆代码及对应的JS文件。

2、Requirejs或seajs

本身应用中就首页这几个JS文件,写完就没了,没必要再多一个额外的JS文件请求

3、一些新的CSS3属性

某些比较好用的CSS3属性在移动端支持有限,所以没有使用,比如布局的两端对齐

4、较高的内容模块分段显示,即滚动到了后再渲染到DOM中,首先后台并未提供分断加载的API,其次,自适应的布局加大了实现的难度,最后,木有足够的时间


不足


 

1、开发时间过短,很多公司的通病吧

2、产品在设计时未考虑单页应用的场景,层级太深的页现在还是刷新整个页面

3、有些功能还未按以上的构架实现,比如动态接口本地存储只做了index首页等

4、比较丑,样子丑,代码实现也比胶水

 


 

No zuo no die


 

为何在内容模块切换过程中未添加一些像native应用切换一样的动画效果?

由于android的机型无花八门,性能参差不齐,css3动画支持力度不一,很多hybrid应用的出现正是为了弥补这样的缺点。布局用html,切换动画使用native。如果你的web应用只要求跑在iphone这等高大上的设备上的话,完全可以使用css3来实现界面切换动画,如果你要求跑在所有平台上,那么......该吃药了亲..

如果你非要尝试,那么你应该会体会到什么叫no zuo no die

 


结束语


 

优化工作是个系统性工程,得从方方面面考虑,从产品设计--》UI设计--》前端代码实现--》后台数据接口提供

现在的优化只能算是皮毛吧,不仅前端部分需要优化,而且后台数据接口速度过慢也严重导致了响应速度。

纯粹的手机web单页应用本来就做的比较少,经验太少,需要继续努力学习..

码农啊...

有看到这篇文章的同学欢迎提意见,优化方面特别是

相关文章
|
4月前
|
前端开发 算法 API
构建高性能图像处理Web应用:Next.js与TailwindCSS实践
本文分享了构建在线图像黑白转换工具的技术实践,涵盖技术栈选择、架构设计与性能优化。项目采用Next.js提供优秀的SSR性能和SEO支持,TailwindCSS加速UI开发,WebAssembly实现高性能图像处理算法。通过渐进式处理、WebWorker隔离及内存管理等策略,解决大图像处理性能瓶颈,并确保跨浏览器兼容性和移动设备优化。实际应用案例展示了其即时处理、高质量输出和客户端隐私保护等特点。未来计划引入WebGPU加速、AI增强等功能,进一步提升用户体验。此技术栈为Web图像处理应用提供了高效可行的解决方案。
|
3月前
|
开发框架 JSON 中间件
Go语言Web开发框架实践:路由、中间件、参数校验
Gin框架以其极简风格、强大路由管理、灵活中间件机制及参数绑定校验系统著称。本文详解其核心功能:1) 路由管理,支持分组与路径参数;2) 中间件机制,实现全局与局部控制;3) 参数绑定,涵盖多种来源;4) 结构体绑定与字段校验,确保数据合法性;5) 自定义校验器扩展功能;6) 统一错误处理提升用户体验。Gin以清晰模块化、流程可控及自动化校验等优势,成为开发者的优选工具。
|
3月前
|
开发框架 JSON 中间件
Go语言Web开发框架实践:使用 Gin 快速构建 Web 服务
Gin 是一个高效、轻量级的 Go 语言 Web 框架,支持中间件机制,非常适合开发 RESTful API。本文从安装到进阶技巧全面解析 Gin 的使用:快速入门示例(Hello Gin)、定义 RESTful 用户服务(增删改查接口实现),以及推荐实践如参数校验、中间件和路由分组等。通过对比标准库 `net/http`,Gin 提供更简洁灵活的开发体验。此外,还推荐了 GORM、Viper、Zap 等配合使用的工具库,助力高效开发。
|
3月前
|
缓存 前端开发 应用服务中间件
Web端实时通信技术SSE在携程机票业务中的实践应用
本文介绍了携程机票前端基于Server-Sent Events(SSE)实现服务端推送的企业级全链路通用技术解决方案。文章深入探讨了 SSE 技术在应用过程中包括方案对比、技术选型、链路层优化以及实际效果等多维度的技术细节,为类似使用场景提供普适性参考和借鉴。该方案设计目标是实现通用性,适用于各种网络架构和业务场景。
89 1
|
4月前
|
缓存 前端开发 应用服务中间件
Web端实时通信技术SSE在携程机票业务中的实践应用
本文介绍了携程机票前端基于Server-Sent Events(SSE)实现服务端推送的企业级全链路通用技术解决方案。文章深入探讨了 SSE 技术在应用过程中包括方案对比、技术选型、链路层优化以及实际效果等多维度的技术细节,为类似使用场景提供普适性参考和借鉴。
115 7
|
4月前
|
缓存 JavaScript 前端开发
Vue 项目中动态添加 HTML 元素的方法与实践
本文探讨了 Vue 中动态添加 HTML 元素的多种技术方案,包括条件渲染(v-if/v-show)、动态组件(component :is)、手动挂载($mount)及 Vuex 状态管理等方法。通过实例分析,如动态表单生成器与全局模态框服务,展示了这些方案在实际开发中的应用。同时提供了性能优化建议和注意事项,帮助开发者根据需求选择最佳方式,在保持 Vue 响应式特性的同时实现灵活交互。附带代码示例,便于理解和实践。
104 2
|
4月前
|
Web App开发 前端开发 JavaScript
鸿蒙5开发宝藏案例分享---Web适配一多开发实践
这是一份实用的鸿蒙Web多设备适配开发指南,针对开发者在不同屏幕尺寸下的布局难题提供了解决方案。文章通过三大法宝(相对单位、媒体查询和窗口监听)详细介绍如何实现智能适配,并提供了多个实战案例,如宫格布局、对话框变形和自适应轮播图等。此外,还分享了调试技巧及工具推荐,帮助开发者快速上手并优化性能。最后鼓励读者实践探索,并提示更多官方资源等待发现。
|
7月前
|
前端开发
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
184 1
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
|
6月前
|
存储 消息中间件 缓存
支持百万人超大群聊的Web端IM架构设计与实践
本文将回顾实现一个支持百万人超大群聊的Web端IM架构时遇到的技术挑战和解决思路,内容包括:通信方案选型、消息存储、消息有序性、消息可靠性、未读数统计。希望能带给你启发。
159 0
支持百万人超大群聊的Web端IM架构设计与实践
|
9月前
|
弹性计算 Java 关系型数据库
Web应用上云经典架构实践教学
Web应用上云经典架构实践教学
167 2
Web应用上云经典架构实践教学

热门文章

最新文章