在JavaScript应用中使用RequireJS来实现延迟加载
开始的部分我们先不用RequireJS框架,然后在下一个章节用RequireJS来重构它。
下面的这个HTML页面包含了一个id为“message”的
元素。当用户访问这个页面的时候,它将展示订单Id和客户姓名信息。
Common.JS文件包含了两个模块的定义——Order和Customer。函数showData和页面的body结合在一起,它通过调用write函数来把要输出的信息放入页面中。作为示例,我在showData函数里硬编码了Id为1,客户姓名为Prasad。
JavaScript NonRequireJS
Display data without RequireJS
Common.JS
function write(message) {
document.getElementById('message').innerHTML += message + '';
}
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;
}
在浏览器中打开这个页面,你将看到如下的信息。
Order Id : 1 Customer Name : Prasad
虽然上面的代码能够显示输出,但是它仍有一些问题:
- 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。
JavaScript RequireJS
Display data using RequireJS
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文件。
Order Id : 1 Customer Name : Prasad
总结
在这篇文章里,我们分析了RequireJS框架是如何处理JavaScript文件间的依赖关系并根据需要载入它们的。它能够帮助开发者写出更松耦合、更模块化且更具有可维护性的代码。
推荐阅读
-
在JavaScript应用中实现延迟加载的方法
-
在JavaScript应用中使用RequireJS来实现延迟加载
-
在JavaScript应用中使用RequireJS来实现延迟加载
-
在JavaScript应用中实现延迟加载的方法
-
在JavaScript应用中使用RequireJS来实现延迟加载
-
在JavaScript应用中使用RequireJS来实现延迟加载
-
在JavaScript应用中实现延迟加载的方法_基础知识
-
在JavaScript应用中使用RequireJS来实现延迟加载_基础知识
-
在JavaScript应用中使用RequireJS来实现延迟加载_基础知识
-
在JavaScript应用中实现延迟加载的方法_基础知识