DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> JavaScript入門知識 >> JavaScript基礎知識 >> 在JavaScript應用中實現延遲加載的方法
在JavaScript應用中實現延遲加載的方法
編輯:JavaScript基礎知識     

無論簡單還是復雜的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;
}

在浏覽器中打開這個頁面,你將看到如下的信息。

201562590347564.png (300×172)

雖然上面的代碼能夠顯示輸出,但是它仍有一些問題:

  •     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文件。

201562590435120.png (300×172)

 總結

在這篇文章裡,我們分析了RequireJS框架是如何處理JavaScript文件間的依賴關系並根據需要載入它們的。它能夠幫助開發者寫出更松耦合、更模塊化且更具有可維護性的代碼。

謝謝

下載源代碼: Lazy Loading using RequireJS (Prasad Honrao, Codetails)

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved