开篇概述
ajax技术在gmail中的成功应用,和高性能的v8引擎的推出,使得编写web应用变得流行起来,使用前端技术也可以编写具有复杂交互的应用。相对于原生应用,web应用具有如下优点:
跨平台,开发和维护成本低;
升级和发布方便,没有版本的概念,随时随地发布,用户没有感知,不需要安装;
响应式设计(Responsive Design)使得Web应用可以跨平台,同一份代码自适应各种 屏幕大小
即使最终不采用Web应用方案,也很适合开发原型
立即学习“Java免费学习笔记(深入)”;
当然,Web应用也不是没有缺点。由于不同平台和厂商的浏览器并不完全一样,跨平台也有一些兼容成本。另外,Web应用的性能不如native应用,交互有时候不是很流畅, 再加上HTML5的API上的限制,使得有些功能采用Web应用不太合适。由于这些原因,结合两者优点的混合方案变得流行起来(比如微信、手机QQ和手机QQ浏览器中会嵌入一 些Web页面)。
根据笔者的开发经验,下面总结一些Web应用开发过程中的要面临的几个问题。
模块化编程
模块化编程是编写大规模应用必不可少的一个特性,与其它主流的编程语言相比 Javascript没有对模块提供直接的支持,更不用说维护模块之间的依赖关系,这使得维 护Javascript代码变得异常困难,在
要支持模块化编程必须解决两个问题:
支持编写模块并为模块命名,防止名字冲突和全局变量的使用;
支持显示指定模块之间的依赖关系,并在程序执行时自动加载依赖的模块。
Douglas Crockford在”Javascript: The Good Parts”一书中提出的Module Pattern利用Javascript的闭包技术来模拟模块的概念,防止名字冲突和全局变量的使用。这解决了第一个问题。
var moduleName = function () {
// Define private variables and functions
var private = ...
// Return public interface.
return {
foo: ...
};
}();为了解决第二个问题CommonJS组织定义了 AMD规范方便 开发者显示指定模块之间的依赖关系,并在需要时加载依赖的模块。 RequireJS是AMD规范的一个比较流行的实现。
首先我们在a.js中定义模块A.
define(function () {
return {
color: "black",
size: 10
};
});然后定义模块B依赖模块A.
define(["a"], function (A) {
// ...
});当模块B执行时RequireJS保证模块A已被加载。具体细节可参考RequireJS官方文档。
脚本加载
最简单的脚本加载方式是放在
加载。
其缺点是:
加载和解析是顺序是同步执行的,先下载base.js然后解析和执行,然后再下载 app.js;
加载脚本时还会阻塞对
为了缓解这些问题,现在的普遍做法是将











