咱們來看看什麼是模塊化?javascript
模塊化是一種將系統分離成獨立功能部分的方法,可將系統分割成獨立的功能部分,嚴格定義模塊接口、模塊間具備透明性。javascript中的模塊在一些C、PHP、java中比較常見:
c中使用include 包含.h文件;php中使用require_once包含.php文件
java使用import導入包
此中都有模塊化的思想。 php
熟悉javascript模塊化開發,瞭解commonjs、seajs、requirejs。瞭解AMD/CMD規範。java
模塊化的優缺點: node
優勢: jquery
可維護性
1.靈活架構,焦點分離
2.方便模塊間組合、分解
3.方便單個模塊功能調試、升級
4.多人協做互不干擾
可測試性 程序員
1.可分單元測試 編程
內聚度
內聚度指模塊內部實現,它是信息隱藏和局部化概念的天然擴展,它標誌着一個模塊內部各成分彼此結合的緊密程度。好處也很明顯,當把相關的任務分組後去閱讀就容易多了。 設計時應該儘量的提升模塊內聚度,從而得到較高的模塊獨立性。
耦合度 數組
耦合度則是指模塊之間的關聯程度的度量。耦合度取決於模塊之間接口的複雜性,進入或調用模塊的位置等。與內聚度相反,在設計時應儘可能追求鬆散耦合的系統。瀏覽器
如何規範地使用模塊。 服務器
模塊的規範
先想想,爲何模塊很重要?
由於有了模塊,咱們就能夠更方便地使用別人的代碼,想要什麼功能,就加載什麼模塊。
可是,這樣作有一個前提,那就是你們必須以一樣的方式編寫模塊,不然你有你的寫法,我有個人寫法,豈不是亂了套!考慮到Javascript模塊如今尚未官方規範,這一點就更重要了。
目前,通行的Javascript模塊規範共有兩種:CommonJS和AMD+CMD。我主要介紹AMD,可是要先從CommonJS講起。
CommonJS
2009年,美國程序員Ryan Dahl創造了node.js項目,將javascript語言用於服務器端編程。
這標誌"Javascript模塊化編程"正式誕生。由於老實說,在瀏覽器環境下,沒有模塊也不是特別大的問題,畢竟網頁程序的複雜性有限;可是在服務器端,必定要有模塊,與操做系統和其餘應用程序互動,不然根本無法編程。
node.js的模塊系統,就是參照CommonJS規範實現的。在CommonJS中,有一個全局性方法require(),用於加載模塊。假定有一個數學模塊math.js,就能夠像下面這樣加載。
複製代碼代碼以下:
var math = require('math');
而後,就能夠調用模塊提供的方法:
複製代碼代碼以下:
var math = require('math');
math.add(2,3); // 5
由於這個系列主要針對瀏覽器編程,不涉及node.js,因此對CommonJS就很少作介紹了。咱們在這裏只要知道,require()用於加載模塊就好了。
瀏覽器環境
有了服務器端模塊之後,很天然地,你們就想要客戶端模塊。並且最好二者可以兼容,一個模塊不用修改,在服務器和瀏覽器均可以運行。
可是,因爲一個重大的侷限,使得CommonJS規範不適用於瀏覽器環境。仍是上一節的代碼,若是在瀏覽器中運行,會有一個很大的問題,你能看出來嗎?
複製代碼代碼以下:
var math = require('math');
math.add(2, 3);
第二行math.add(2, 3),在第一行require('math')以後運行,所以必須等math.js加載完成。也就是說,若是加載時間很長,整個應用就會停在那裏等。
這對服務器端不是一個問題,由於全部的模塊都存放在本地硬盤,能夠同步加載完成,等待時間就是硬盤的讀取時間。可是,對於瀏覽器,這倒是一個大問題,由於模塊都放在服務器端,等待時間取決於網速的快慢,可能要等很長時間,瀏覽器處於"假死"狀態。
所以,瀏覽器端的模塊,不能採用"同步加載"(synchronous),只能採用"異步加載"(asynchronous)。這就是AMD規範誕生的背景。
AMD requirejs
AMD是"Asynchronous Module Definition"的縮寫,意思就是"異步模塊定義"。它採用異步方式加載模塊,模塊的加載不影響它後面語句的運行。全部依賴這個模塊的語句,都定義在一個回調函數中,等到加載完成以後,這個回調函數纔會運行。
AMD也採用require()語句加載模塊,可是不一樣於CommonJS,它要求兩個參數:
複製代碼代碼以下:
require([module], callback);
第一個參數[module],是一個數組,裏面的成員就是要加載的模塊;第二個參數callback,則是加載成功以後的回調函數。若是將前面的代碼改寫成AMD形式,就是下面這樣:
複製代碼代碼以下:
require(['math'], function (math) {
math.add(2, 3);
});
math.add()與math模塊加載不是同步的,瀏覽器不會發生假死。因此很顯然,AMD比較適合瀏覽器環境。
AMD和CMD的區別
SeaJS遵循CMD(通用模塊定義),RequireJS遵循AMD,那麼CMD和AMD到底有什麼區別?
AMD 是 RequireJS 在推廣過程當中對模塊定義的規範化產出。
CMD 是 SeaJS 在推廣過程當中對模塊定義的規範化產出。
國內大部分的東西,好比說jquery ...都是用的amd去定義
相似的還有 CommonJS Modules/2.0 規範,是 BravoJS 在推廣過程當中對模塊定義的規範化產出。
還有很多⋯⋯
這些規範的目的都是爲了 JavaScript 的模塊化開發,特別是在瀏覽器端的。
目前這些規範的實現都能達成瀏覽器端模塊化開發的目的。
區別:
1. 對於依賴的模塊,AMD 是提早執行,CMD 是延遲執行。不過 RequireJS 從 2.0 開始,也改爲能夠延遲執行(根據寫法不一樣,處理方式不一樣)。CMD 推崇 as lazy as possible.
2. CMD 推崇依賴就近,AMD 推崇依賴前置。看代碼:
// CMD
define(function(require, exports, module) {
var a = require('./a')
a.doSomething()
// 此處略去 100 行
var b = require('./b') // 依賴能夠就近書寫
b.doSomething()
// ...
})
// AMD 默認推薦的是
define(['./a', './b'], function(a, b) { // 依賴必須一開始就寫好
a.doSomething()
// 此處略去 100 行
b.doSomething()
...
})