可简单避免的三个JS发布错误的详细介绍


Posted in Javascript onAugust 02, 2013

Web应用程序开发是倾向于在客户端运行所有用户逻辑和交互代码,让服务器暴露REST或者RPC接口。编译器是针对JS作为一个平台,第二版 ECMAScript正是考虑到这一点在设计。客户端框架例如Backbone, Ember和Require鼓励创建功能丰富的应用程序,不仅有丰富的代码,而且各个组件,组件与数据之间有很多相互作用。
这真的很好,或许还能产生一些优秀的用户体验,但是毫无疑问的是,这是很难开发web应用程序和web页面。
根本原因是在互联网上服务你的代码和数据,运行在一些随机的浏览器上,在javascript中,这是一种你需要特别小心的语言,它是一个完全缺乏 代码部署的平台。而且它不会很快就得到改善。我觉得如果星际迷航是现实生活,那么Jean-Luc Picard队长每隔一段时间不能打架的原因是他仍然是克林仪表板加载。
我想强调的是三个相对常见的错误和容易的解决方案,并且谈谈一些我们遇到的从ReadyForZero学到的特别的事情。
剥离“缓存清除”头信息
你可能使用CDN来缓存静态资源,这当然是合理的。如果你向服务器请求非缓存的资源(比如在AWS<Amazon Web Service>端使用"custom-origin"将文件指向真实的网络站点),这就需要小心了。你可能会在部署新版本的文件后添加一段缓存清 除的字符串(头信息)到文件名上来达到这个目的,这样你的文件名看起来是这样的:
https://3water.com/js/main__V0123456789abcdef__.js
这很容易做到,你可以选择任意的Hash算法来生成一段指纹信息作为这个字符串,这样它就会随着文件内容变化而变化。当新的url被引用时,它不可 能被缓存,这样就可以获取到服务器上的新版本。错误就发生在这里。在网络上有很多都建议剥离“缓存清除”头信息,而是让你的服务器直接提供新版本的文件。 如果你有多台服务器集群这可能导致你的站点上不同文件(如:html、js)的版本不一致(如js已更新但是html(从另一台服务器请求)仍然是旧 的),不仅如此,更严重是它很容易导致CDN缓存了错误的版本。这个错误是这样发生的:
·初始阶段,所有的服务器都是HTML1 和JS1.
·服务器A重启了,并提供HTML2和JS2.
·一个客户端向CDN请求main__V2__.js,这个时候这个文件是新的所以CDN上没有缓存。
·CDN把这个请求传给了你设置的custom origin, 碰巧这个请求发到了服务器B上。
·服务器B剥离了“缓存清除”字符串并返回旧的版本。
·CDN把旧版的的文件当新的缓存了。
这件事情考虑起来很简单明了,但是盲目的听从网络上的建议很可能导致错误。更糟糕的是在你这看起来一切都是好的你根本不知道发生了错误,但是其它地 区的用户使用了不同CDN很可能缓存了错误的版本。解决方案是不要剥离“缓存清除”字符串并将静态资源存放在能够正确支持各个版本的地方。
2. 处理庞大的JS炸弹
每个人都知道,我们需要压缩我们的javascript文件,并把它们连接在一起。但是盲目地这样做并非明智之举。如果连接的文件很大,那么更有效的方法就是并行化。另外,如果你需要频繁的修改文件的某一部分,你可能会导致很多地方失效,而文件很大部分却没有被修改过。
如果把频繁修改的部分分离出来,那么就可以解决两边的问题。我建议使用require.js - 它可以实现对你的javascript的真正的依赖关系管理,而且第一次使用的时候,设置很简单(稍后添加会很痛苦),而且可以帮助你理解和管理依赖关系,包括一些高级选项,例如异步载入。
需要注意的:require.js会等待一段时间后会放弃载入资源,这个可以通过指定waitSeconds选项实现,这个选项的默认值似乎7秒,它依赖于你的用户在哪里(例如:手机),可以是很短的时间。
3. 没有汇总错误事件
你不能只让你的javascript上线使用,而不关心它的运行情况。你不可能测试每一个浏览器和每个用户的状态组合。另外,不同的载入时间可能导致怪异的状态。所以,建立某种反馈机制来判断你的用户是否遇到错误,变得十分重要。这很简单,你只需通过指定一个全局错误处理程序,收集错误,并发送会服务器。以下是一个例子:
棘手的部分是,很多时候会出现一些非0的错误,因为用户可能安装了各种怪异的插件或者其他。所以你需要跟踪稳定的状态到底是什么,还有是否有任何的偏差。
ReadyForZero,我们在顶层捕获onError事件,并把它们发送会服务器,然后生成一个日报,汇总多少个用户发生了错误,和这些错误发生在哪里。我们发现很多时候,错误消息并不足够,所以我们同样需要从我们的事件系统回传最后几个事件。通过分析用户最近触发的Backbone或者JQuery事件,对于获取当时用户触发错误时候的上下文信息,有很大的帮助。
垂手可得的改进
令人沮丧的是下面这些点不是我们必须担心的。公司更应该关注在产品上,快速高质量地把它们弄出来。但是请记住如果这些垂首可得的改进获得实施,你将能更专注于大动作上。
人们总是被一些琐事纠缠住花费了大量时间,但是仅仅让你的应用正常运行就能获得大的成长。
1,你的客户端代码有没有内存泄露?你确定吗?你是怎么知道的?
2,在ReadyForZero[注1]我们有很多聪明的人们致力于推动这门艺术。
[注1]ReadyForZero:是由 Y Combinator资助的一家公司,公司的目的是通过网络平台帮助消费者摆脱信用卡债务。

Javascript 相关文章推荐
基本jquery的控制tabs打开的数量的代码
Oct 17 Javascript
Jquery Change与bind事件代码
Sep 29 Javascript
js 完美图片新闻轮转效果,腾讯大粤网首页图片轮转改造而来
Nov 21 Javascript
jQuery 过滤方法filter()选择具有特殊属性的元素
Jun 15 Javascript
js的for in循环和java里foreach循环的区别分析
Jan 28 Javascript
深入探讨JavaScript String对象
Mar 09 Javascript
ionic组件ion-tabs选项卡切换效果实例
Aug 27 Javascript
纯原生js实现贪吃蛇游戏
Apr 16 Javascript
解决微信二次分享不显示摘要和图片的问题
Aug 18 Javascript
jackson解析json字符串,首字母大写会自动转为小写的方法
Dec 22 Javascript
微信小程序实现用table显示数据库反馈的多条数据功能示例
May 07 Javascript
node.js中 mysql 增删改查操作及async,await处理实例分析
Feb 11 Javascript
Js控制弹窗实现在任意分辨率下居中显示
Aug 01 #Javascript
Jquery同辈元素选中/未选中效果的实例代码
Aug 01 #Javascript
解决js数据包含加号+通过ajax传到后台时出现连接错误
Aug 01 #Javascript
Javascript 遮罩层和加载效果代码
Aug 01 #Javascript
JS防止用户多次提交的简单代码
Aug 01 #Javascript
纯文字版返回顶端的js代码
Aug 01 #Javascript
JS实现随机化快速排序的实例代码
Aug 01 #Javascript
You might like
将OICQ数据转成MYSQL数据
2006/10/09 PHP
《PHP边学边教》(04.编写简易的通讯录――视频教程1)
2006/12/13 PHP
php把数组值转换成键的方法
2015/07/13 PHP
详解PHP错误日志的获取方法
2015/07/20 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
Mootools 1.2教程(21)——类(二)
2009/09/15 Javascript
js实现在页面上弹出蒙板技巧简单实用
2013/04/16 Javascript
利用ajaxfileupload插件实现文件上传无刷新的具体方法
2013/06/08 Javascript
javascript判断是否按回车键并解决浏览器之间的差异
2014/05/13 Javascript
jQuery中:selected选择器用法实例
2015/01/04 Javascript
JS实现仿苹果底部任务栏菜单效果代码
2015/08/28 Javascript
jQuery实现简易的天天爱消除小游戏
2015/10/16 Javascript
WEB前端开发框架Bootstrap3 VS Foundation5
2016/05/16 Javascript
ng-options和ng-checked在表单中的高级运用(推荐)
2017/01/21 Javascript
利用vue.js插入dom节点的方法
2017/03/15 Javascript
纯JS实现可用于页码更换的飞页特效示例
2018/05/21 Javascript
微信小程序methods中定义的方法互相调用的实例代码
2018/08/07 Javascript
JavaScript中的回调函数实例讲解
2019/01/27 Javascript
微信小程序实现下拉刷新动画
2019/06/21 Javascript
Angular 多级路由实现登录页面跳转(小白教程)
2019/11/19 Javascript
简介Python中用于处理字符串的center()方法
2015/05/18 Python
Python计算已经过去多少个周末的方法
2015/07/25 Python
Python使用matplotlib绘制正弦和余弦曲线的方法示例
2018/01/06 Python
Python计算开方、立方、圆周率,精确到小数点后任意位的方法
2018/07/17 Python
Django中的forms组件实例详解
2018/11/08 Python
python绘制漏斗图步骤详解
2019/03/04 Python
Tiqets荷兰:出售欧洲最美丽的景点和博物馆门票
2018/01/09 全球购物
俄罗斯建筑和装饰材料在线商店:Stroilandia
2020/07/25 全球购物
新东网科技Java笔试题
2012/07/13 面试题
办公室驾驶员岗位职责
2013/11/15 职场文书
环卫个人总结
2015/03/03 职场文书
golang json数组拼接的实例
2021/04/28 Golang
Oracle安装TNS_ADMIN环境变量设置参考
2021/11/01 Oracle
python程序的组织结构详解
2021/12/06 Python
拙作再改《我的收音机情缘》
2022/04/05 无线电
Python matplotlib安装以及实现简单曲线的绘制
2022/04/26 Python