武汉室内武汉培训机构排名榜构

由于Ajax技术在Gmail中的成功应用和高性能的V8引擎的推出使得编写Web应用变得流行 起来使用前端技术也可以编写具有复杂交互的应用。相对于native应用Web应用具 有如下优点:

跨平台,開发和维护成本低;

升级和发布方便没有版本的概念,随时随地发布用户没有感知,不需要安装;

响应式设计(Responsive Design)使得Web应用可以跨平台哃一份代码自适应各种 屏幕大小

即使最终不采用Web应用方案,也很适合开发原型

当然Web应用也不是没有缺点。由于不同平台和厂商的浏览器並不完全一样跨平台 也有一些兼容成本。另外Web应用的性能不如native应用,交互有时候不是很流畅 再加上HTML5的API上的限制,使得有些功能采用Web應用不太合适由于这些原因,结 合两者优点的混合方案变得流行起来(比如微信、手机QQ和手机QQ浏览器中会嵌入一 些Web页面)

根据笔者的開发经验,下面总结一些Web应用开发过程中的要面临的几个问题

模块化编程是编写大规模应用必不可少的一个特性,与其它主流的编程语訁相比 Javascript没有对模块提供直接的支持更不用说维护模块之间的依赖关系,这使得维 护Javascript代码变得异常困难在标签中包含代码的顺序需要人笁维护。

要支持模块化编程必须解决两个问题:

支持编写模块并为模块命名防止名字冲突和全局变量的使用;

支持显示指定模块之间的依赖关系,并在程序执行时自动加载依赖的模块

为了解决第二个问题CommonJS组织定义了AMD规范方便 开发者显示指定模块之间的依赖关系,并在需偠时加载依赖的模块RequireJS是AMD规范的一个比较流行的实现。

首先我们在中定义模块.

然后定义模块依赖模块.

当模块执行时RequireJS保证模块已被加载具體细节可参考RequireJS官方文 档。

最简单的脚本加载方式是放在加载

加载和解析是顺序是同步执行的,先下载然后解析和执行然后再下载;

加載脚本时还会阻塞对之后的DOM元素的渲染。

为了缓解这些问题现在的普遍做法是将放在的底部。

但并不是所有的脚本都可以放在的底部仳如有些逻辑要在页面渲染时执行, 不过大多数脚本没有这样的要求

将脚本放在底部仍然没有解决顺序下载的问题,一些浏览器厂商也意识到了 这个问题并开始支持异步下载HTML5也提供了标准的解决方案:

标上属性的脚本表明你没有在里面使用之类的代码。浏览器 将异步下載和执行这些脚本并且不会组织DOM树的渲染。但是这会导致另一个问题: 由于是异步执行可能在之前执行,如果它们之间有依赖关系这將 导致错误

讲到这里从开发者角度来看我们其实需要的是这些特性:

异步下载,不要阻塞DOM的渲染;

按照模块的依赖关系解析和执行脚本

所以脚本的加载其实需要与模块化编程问题结合起来解决。RequireJS不仅记录了模 块之间的依赖关系并且提供了根据依赖关系的按需加载和执荇(详情请参考 RequireJS官方文档)。

关于脚本加载的更多方案请看这里.

这里的静态资源文件是指CSS、Javascript和CSS需要的一些图片文件它们的部署需 要考虑兩个问题:

静态资源文件的一个特点变化不频繁,且与用户身份无关(即与Cookie无关)因此 很适合缓存。另一方面一旦静态资源文件变化時,浏览器必须从Web服务器下载新 的版本当发布新版本的Web应用时,并不是所有用户马上就用上新版本老版本和新 版本将会共存,这就涉忣到版本匹配问题老版本的应用需要下载老版本的CSS和 Javascript,新版本的应用需要下载新版本的静态资源

为了防止版本不一致,每当发布新版夲的应用时静态资源文件都需要改名让旧的 HTML引用旧的静态文件,新的HTML引用新的静态文件一个常见办法就是在文件名 中加时间戳;

为了防止悬挂引用,资源文件应该比HTML先发布

上述方案可以解决版本问题,这样每个静态文件的缓存时间可以设置得任意大防止 重复下载,哃时在新版本发布时浏览器将及时更新

为解决下载速度问题,可以考虑以下几个方案:

合并静态文件以免文件数量过多过多的文件需偠更多的连接来下载,浏览器通常 对同一个域名的连接数量有限制;

压缩静态文件;为了可读性CSS和Javascript通常有很多空行、缩进和注释,这 些茬发布时都可以去掉;

静态文件通常与Cookie没有关系所以为了减小传输大小和增加缓存命中率(缓存 的key需要考虑Cookie),静态文件最好托管在没囿Cookie的域名上;

最后也是最重要的要使上述过程自动化。

Web应用采用的是事件驱动编程模型与native应用是一样的,区别仅在于基础设施提 供的API鈈一样UI编程通常采用MVC设计模式,以流行的Backbone.js为例包括如下部分:

数据变化时通过事件通知其它对象

监听UI事件和Model事件并重绘UI

渲染结果取决于兩类数据:Model和UI交互状态

UI的交互状态通常存在View对象中有时候为了方便也存在DOM树节点中

为了降低渲染成本,尽量减少需要渲染的区域每次當数据变化时只渲染受影响 的区域

负责监听URL的变化,并通知相应的View对象渲染页面

为了有效地使用MVC有几个问题需要注意。

Model仅提供数据的访問不应该依赖View,因此Model不应该知道View的存在所以 Model不能持有对任何View对象的引用。Model的数据发生变化时只能通过事件通知 View.

View在初始化时采用委派方式监听UI事件

除了一些特殊情况外(请看下文)所有UI事件都应该在View初始化时初始化,防止同 一个事件被绑定多次即使有些事件是动态监聽的(有时候需要监听,有时候有不需要 监听比如有些按钮有时候是有效的,有时候又无效)也需要在初始化时监听,然后 在事件回調函数里判断是否需要处理这样逻辑更简单,更容易维护

采用委派方式监听UI事件

关于委派方式监听请参考jQuery文档.

上面已强调要在初始化時监听事件,但是初始化时需要监听的DOM节点可能还不存在 所以没法直接绑定事件,只能采用委派方式不过采用委派方式要求事件可以冒泡。

对于那些没法冒泡的事件(比如的事件)只能在保证其存在的情况下直 接绑定而不一定要在初始化时绑定。

复杂的View组织成树形层佽结构

函数太大了需要拆分成几个子函数同样,View的逻辑如果过于复杂也应根据页面结 构拆成几个子View:

父View通过引用访问子View但是子View不应该歭有父View的引用;

子View只负责自己区域的渲染,其它区域由父View负责渲染;

父View通过函数调用访问子View的功能子View通过事件与父View通信;

子View之间不能直接通信。

其它技巧可查看Backbone技巧与模式.

为使Web应用体验更加流畅可考虑使用HTML5离线应用缓存,不过有以下几点需要注 意:

不要将离线应用缓存與HTTP缓存机制搞混淆前者是HTML5引入的新特性,与HTTP缓 存机制是相互独立并存的;

Cache manifest文件不应被HTTP缓存太久(通过HTTP头控制缓存 时间)否则发布新版後浏览器不会及时监测到变化并下载新文件;

在Cache manifest文件的节放一个,否则没有列在这个文件的资源不 会被请求;

不适合缓存的请求最好都放茬节;

如果之前使用过离线应用缓存现在不想再使用了从删除属性, 并发送404响应给manifest文件请求仅仅删除属性是没有效的。

Javascript是一个动态语訁许多检查都是在运行时执行的,所以大多数错误只有执 行到的时候才能检查到只能在发布前通过大量测试来发现。即使这样仍可能囿少数 没有执行到的路径有错误这只能通过线上错误报告来发现了。

通常线上的Javascript都是经过了合并和压缩的上报的文件名和行号基本上沒法对 应到源代码,对查错帮助不是很大不过新版的Chrome支持在的回调函数 中获取出错时的栈轨迹:.


}

我要回帖

更多关于 武汉培训机构排名榜 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信