來源:互聯網
上載者:User
關鍵字
JavaScript
RequireJS
非同步按需
本文介紹的是另一款較為精簡的 RequireJS 框架,既想使用 AMD 的特性又不想引入一個龐大的庫的開發人員,不妨試試 RequireJS。 RequireJS 可以説明使用者非同步按需的載入 JavaScript 代碼,並解決 JavaScript 模組間的依賴關係,提升了前端代碼的整體品質和性能。
前端開發在近一兩年發展的非常快,JavaScript 作為主流的開發語言得到了前所未有的熱捧。 大量的前端框架出現了,這些框架都在嘗試著解決一些前端開發中的共性問題,但是實現又不盡相同。 在這個背景下,CommonJS 社區誕生了,為了讓前端框架發展的更加成熟,CommonJS 鼓勵開發人員一起在社區裡為一些完成特定功能的框架制定規範。 AMD(Asynchronous Module Definition)就是其中的一個規範。
傳統 JavaScript 代碼的問題
讓我們來看看一般情況下 JavaScript 代碼是如何開發的:通過 <script> 標籤來載入 JavaScript 檔,用全域變數來區分不同的功能代碼,全域變數之間的依賴關係需要顯式的通過指定其載入順序來解決, 發佈應用時要通過工具來壓縮所有的 JavaScript 代碼到一個檔。 當 Web 專案變得非常龐大,前端模組非常多的時候,手動管理這些全域變數間的依賴關係就變得很困難,這種做法顯得非常的低效。
AMD 的引入
AMD 提出了一種基於模組的非同步載入 JavaScript 代碼的機制,它推薦開發人員將 JavaScript 代碼封裝進一個個模組,對全域物件的依賴變成了對其他模組的依賴,無須再聲明一大堆的全域變數。 通過延遲和按需載入來解決各個模組的依賴關係。 模組化的 JavaScript 代碼好處很明顯,各個功能元件的松耦合性可以極大的提升代碼的複用性、可維護性。 這種非阻塞式的併發式快速載入 JavaScript 代碼,使 Web 頁面上其他不依賴 JavaScript 代碼的 UI 元素,如圖片、CSS 以及其他 DOM 節點得以先載入完畢,Web 頁面載入速度更快,使用者也得到更好的體驗。
CommonJS 的 AMD 規範中只定義了一個全域的方法,如清單 1 所示。
清單 1. AMD 規範
define(id?, dependencies?, factory);
該方法用來定義一個 JavaScript 模組,開發人員可以用這個方法來將部分功能模組封裝在這個 define 方法體內。
id 表示該模組的標識,為可選參數。
dependencies 是一個字串 Array,表示該模組依賴的其他所有模組標識,模組依賴必須在真正執行具體的 factory 方法前解決,這些依賴物件載入執行以後的傳回值,可以以預設的順序作為 factory 方法的參數。 dependencies 也是可選參數,當使用者不提供該參數時,實現 AMD 的框架應提供預設值為 [「require」,」exports」,「module」]。
factory 是一個用於執行改模組的方法,它可以使用前面 dependencies 裡聲明的其他相依模組的傳回值作為參數,若該方法有傳回值,當該模組被其他模組依賴時,傳回值就是該模組的輸出。
CommonJS 在規範中並沒有詳細規定其他的方法,一些主要的 AMD 框架如 RequireJS、curl、bdload 等都實現了 define 方法,同時各個框架都有自己的補充使得其 API 更實用。
RequireJS 簡介
RequireJS 是一個非常小巧的 JavaScript 模組載入框架,是 AMD 規範最好的實現者之一。 最新版本的 RequireJS 壓縮後只有 14K,堪稱非常輕量。 它還同時可以和其他的框架協同工作,使用 RequireJS 必將使您的前端代碼品質得以提升。
目前最新版本的 RequireJS 1.0.8 在 IE 6+、Firefox 2+、Safari 3.2+、Chrome 3+、Opera 10+ 上都工作的很好。
實戰 RequireJS
在 Web 應用中使用 RequireJS
在 RequireJS 官方主頁上下載最新的版本的 require.js,放到 Web 頁面中。 示例的 Web 專案結構圖 1 所示。
圖 1. Web 專案結構
通過在 index.html 中加入一個 <script> 標籤直接引入 require.js 即可。