模塊化的介紹

咱們來看看什麼是模塊化?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()
  ...

}) 

相關文章
相關標籤/搜索