在JavaScript應用中使用RequireJS來實現消極式載入

來源:互聯網
上載者:User

   這篇文章主要介紹了在JavaScript應用中使用RequireJS來實現消極式載入,JavaScript是一款人氣JS庫,需要的朋友可以參考下

  無論簡單還是複雜的Web應用,都由一些HTML、JavaScript、CSS檔案組成。通常開發人員會通過JQuery、Knockout、Underscore等等這樣的第三方JavaScript架構來提高開發速度。由於這些JavaScript架構都針對特定的用途開發而且已經得到了“驗證”,所以直接使用它們就比自己從頭實現所需要的功能顯得更為合適。然而,伴隨著應用的複雜度不斷上升,寫出乾淨、低耦合、可維護的代碼變得越來越重要。在這篇文章裡,我將解釋 RequireJS架構如何協助應用開發人員寫出更加模組化的代碼,以及它是如何通過消極式載入JavaScript檔案來提高應用效能的。

  開始的部分我們先不用RequireJS架構,然後在下一個章節用RequireJS來重構它。

  下面的這個HTML頁麵包含了一個id為“message”的

元素。當使用者訪問這個頁面的時候,它將展示訂單Id和客戶姓名資訊。

  Common.JS檔案包含了兩個模組的定義——Order和Customer。函數showData和頁面的body結合在一起,它通過調用write函數來把要輸出的資訊放入頁面中。作為樣本,我在showData函數裡寫入程式碼了Id為1,客戶姓名為Prasad。

  ?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 <!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; }

  在瀏覽器中開啟這個頁面,你將看到如下的資訊。

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

  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。

  ?

1 2 3 4 5 6 7 8 9 10 11 <!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)。

  ?

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

  Order.JS

  RequireJS架構提供了一個定義和維護JavaScript檔案間依賴關係的簡便途徑。下面代碼中的define函式宣告了Customer.JS必須在處理Order回呼函數前載入。

  ?

1 2 3 4 5 6 7 8 9 10 define(["Customer"], function (Customer) { function Order(id, custName) { this.id = id; this.customer = new Customer(custName); } return Order; } ); Customer.JS

  這個檔案不依賴於任何其它JavaScript檔案,所以define函數的第一個參數的值是一個空數組。

  ?

1 2 3 4 5 6 7 8 define([], function () { function Customer(name) { this.name = name; } return Customer; } );

  好了,現在用你的瀏覽器開啟這個應用,你將會看到如下的輸出。要注意的是RequireJS只載入了必需的JavaScript檔案。

  總結

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.