在JavaScript应用中实现延迟加载的方法


Posted in Javascript onJune 25, 2015

无论简单还是复杂的Web应用,都由一些HTML、JavaScript、CSS文件组成。通常开发者会通过JQuery、Knockout、Underscore等等这样的第三方JavaScript框架来提高开发速度。由于这些JavaScript框架都针对特定的用途开发而且已经得到了“验证”,所以直接使用它们就比自己从头实现所需要的功能显得更为合适。然而,伴随着应用的复杂度不断上升,写出干净、低耦合、可维护的代码变得越来越重要。在这篇文章里,我将解释RequireJS框架如何帮助应用开发者写出更加模块化的代码,以及它是如何通过延迟加载JavaScript文件来提高应用性能的。
 开始的部分我们先不用RequireJS框架,然后在下一个章节用RequireJS来重构它。

下面的这个HTML页面包含了一个id为“message”的<p>元素。当用户访问这个页面的时候,它将展示订单Id和客户姓名信息。

Common.JS文件包含了两个模块的定义——Order和Customer。函数showData和页面的body结合在一起,它通过调用write函数来把要输出的信息放入页面中。作为示例,我在showData函数里硬编码了Id为1,客户姓名为Prasad。

<!DOCTYPE html>
<html>
<head>
<title>JavaScript NonRequireJS</title>
<script src="common.js" type="text/javascript"></script>
</head>
<body>
<strong>Display data without RequireJS</strong>
<p id="message" />
<script type="text/javascript">
showData();
</script>
</body>
</html>
Common.JS
function write(message) {
  document.getElementById('message').innerHTML += message + '</br>';
}
 
function showData() {
  var o = new Order(1, "Prasad");
  write("Order Id : " + o.id + " Customer Name : " + o.customer.name);
}
 
function Customer(name) {
  this.name = name;
  return this;
}
 
function Order(id, customerName) {
  this.id = id;
  this.customer = new Customer(customerName);
  return this;
}

在浏览器中打开这个页面,你将看到如下的信息。

在JavaScript应用中实现延迟加载的方法

虽然上面的代码能够显示输出,但是它仍有一些问题:

  •     Common.JS文件包含了所有需要定义的函数(write,showData),而且模块(Order,Customer)很难维护和复用。假如你想在其它页面里复用write函数并引用了上面的JavaScript文件,那么你也导入了这个页面可能不需要的其它函数和模块。
  •     Order模块(或者在面向对象中叫做“类”)在初始化过程中创建了一个Customer模块的实例。这意味着Order模块依赖于Customer模块。这些模块间的紧耦合使得将来在优化时很难重构与维护。
  •     每当客户端请求这个页面时,Common.JS文件就会被载入DOM。在上面这个例子中,尽管我们只需要在页面上输出信息,但我们仍把那些不需要的模块(Customer,Order)载入了内存。载入不必要的应用资源(JavaScript、CSS、图片文件等等)会降低应用的性能。
  •     Common.JS文件里的模块可以被分离到不同的JavaScript文件里,但是当应用变得越来越复杂时,很难判断JavaScript文件之间的依赖关系与需要被加载的文件的加载顺序。

RequireJS框架处理了JavaScript文件间的依赖关系,并且根据需要按顺序加载它们。

用RequireJS搭建应用

现在让我们看看重构过的代码。下面的HTML代码引用了Require.JS文件。data-main属性定义了这个页面的唯一入口点。在下面这个场景中,它告诉了RequireJS在启动的时候加载Main.js。
 

<!DOCTYPE html>
<html>
<head>
<title>JavaScript RequireJS</title>
<script src="Require.Js" type="text/javascript" data-main="Main.js"></script>
</head>
<body>
<strong>Display data using RequireJS</strong>
<p id="message" />
</body>
</html>

 Main.JS

由于这个文件已经通过data-main属性指定,RequireJS将会尽快的加载它。这个文件使用了RequireJS框架的函数来确定和定义对于其它JavaScript文件的依赖关系。在下面的代码片段里,第一个参数表示依赖关系(依赖Order.JS文件),第二个参数为一个回调函数。RequireJS分析所有的依赖关系并载入它们,然后执行这个回调函数。请注意,第一个参数的值(Order)必须和文件名一致(Order.JS)。

require(["Order"], function (Order) {
  var o = new Order(1, "Prasad");
  write(o.id + o.customer.name);
});

 Order.JS

RequireJS框架提供了一个定义和维护JavaScript文件间依赖关系的简便途径。下面代码中的define函数声明了Customer.JS必须在处理Order回调函数前载入。

define(["Customer"],
function (Customer) {
function Order(id, custName) {
this.id = id;
this.customer = new Customer(custName);
}
return Order;
}
);

Customer.JS

这个文件不依赖于任何其它JavaScript文件,所以define函数的第一个参数的值是一个空数组。

define([],
function () {
function Customer(name) {
this.name = name;
}
return Customer;
}
);

好了,现在用你的浏览器打开这个应用,你将会看到如下的输出。要注意的是RequireJS只载入了必需的JavaScript文件。

在JavaScript应用中实现延迟加载的方法

 总结

在这篇文章里,我们分析了RequireJS框架是如何处理JavaScript文件间的依赖关系并根据需要载入它们的。它能够帮助开发者写出更松耦合、更模块化且更具有可维护性的代码。

谢谢

下载源代码: Lazy Loading using RequireJS (Prasad Honrao, Codetails)

Javascript 相关文章推荐
Gird组件 Part-3:范例RSSFeed Viewer
Mar 10 Javascript
js加解密 脚本解密
Feb 22 Javascript
理解Javascript_07_理解instanceof实现原理
Oct 15 Javascript
javascript实现的使用方向键控制光标在table单元格中切换
Nov 17 Javascript
jQuery lazyLoad图片延迟加载插件的优化改造方法分享
Aug 13 Javascript
js用正则表达式来验证表单(比较齐全的资源)
Nov 17 Javascript
JS+CSS实现经典的左侧竖向滑动菜单效果
Sep 23 Javascript
基于jQuery实现拖拽图标到回收站并删除功能
Nov 25 Javascript
浅谈jquery采用attr修改form表单enctype不起作用的问题
Nov 25 Javascript
解决JS内存泄露之js对象和dom对象互相引用问题
Jun 25 Javascript
AngularJS select加载数据选中默认值的方法
Feb 28 Javascript
Node.js应用设置安全的沙箱环境
Apr 23 Javascript
Underscore.js 1.3.3 中文注释翻译说明
Jun 25 #Javascript
深入分析JSON编码格式提交表单数据
Jun 25 #Javascript
jquery移动点击的项目到列表最顶端的方法
Jun 24 #Javascript
jquery使整个div区域可以点击的方法
Jun 24 #Javascript
jQuery寻找n以内完全数的方法
Jun 24 #Javascript
js实现仿阿里巴巴城市选择框效果实例
Jun 24 #Javascript
Javascript常用小技巧汇总
Jun 24 #Javascript
You might like
dede3.1分页文字采集过滤规则详说(图文教程)
2007/04/03 PHP
PHP获取一段文本显示点阵宽度和高度的方法
2015/03/12 PHP
PHP下载远程文件到本地存储的方法
2015/03/24 PHP
PHP图形计数器程序显示网站用户浏览量
2016/07/20 PHP
PHP数组遍历的几种常见方式总结
2019/02/15 PHP
php使用mysqli和pdo扩展,测试对比mysql数据库的执行效率完整示例
2019/05/09 PHP
PHP内存溢出优化代码详解
2021/02/26 PHP
JS 跳转页面延迟2种方法
2013/03/29 Javascript
Chrome扩展页面动态绑定JS事件提示错误
2014/02/11 Javascript
js通过八个点 拖动改变div大小的实现方法
2014/03/05 Javascript
利用jquery操作Radio方法小结
2014/10/20 Javascript
jQuery的ready方法详解
2014/11/27 Javascript
javascript中hasOwnProperty() 方法使用指南
2015/03/09 Javascript
原生Javascript和jQuery做轮播图简单例子
2016/10/11 Javascript
浅谈node模块与npm包管理工具
2018/01/03 Javascript
Vue使用枚举类型实现HTML下拉框步骤详解
2018/02/05 Javascript
Javascript中parseInt的正确使用方式
2018/10/17 Javascript
vue draggable resizable 实现可拖拽缩放的组件功能
2019/07/15 Javascript
javascript实现多边形碰撞检测
2020/10/24 Javascript
Selenium的使用详解
2018/10/19 Python
安装多个版本的TensorFlow的方法步骤
2020/04/21 Python
Django+Celery实现动态配置定时任务的方法示例
2020/05/26 Python
使用Keras建立模型并训练等一系列操作方式
2020/07/02 Python
css3实现二维码扫描特效的示例
2020/10/29 HTML / CSS
html5应用缓存_动力节点Java学院整理
2017/07/13 HTML / CSS
Christys’ Hats官网:英国帽子制造商
2018/11/28 全球购物
英国羊皮鞋类领先品牌:Just Sheepskin
2019/12/12 全球购物
Visual-Click葡萄牙:欧洲领先的在线眼镜商
2020/02/17 全球购物
美国亚马逊旗下时尚女装网店:SHOPBOP(支持中文)
2020/10/17 全球购物
行政主管岗位职责
2013/11/18 职场文书
家居装修公司创业计划书范文
2014/03/20 职场文书
市场营销毕业生自荐信范文
2014/04/01 职场文书
先进党组织事迹材料
2014/12/26 职场文书
微信小程序基础教程之echart的使用
2021/06/01 Javascript
python如何读取和存储dict()与.json格式文件
2022/06/25 Python
Python中np.random.randint()参数详解及用法实例
2022/09/23 Python