02呜舒、CommonJS,ES2015笨奠,AMD袭蝗,CMD區(qū)別

一、CommonJs

1般婆,CommonJS 基本介紹(require導(dǎo)入加載 , exports 輸出,modul.exports輸出)

(1)CommonJS 是一種思想到腥,它是為 JS 的表現(xiàn)來制定規(guī)范。由于 JS 沒有模塊系統(tǒng)蔚袍、標(biāo)準(zhǔn)庫較少乡范、缺乏包管理工具,因此 CommonJS 應(yīng)運而生啤咽。
(2)CommonJS 的目標(biāo)是希望 JS 可以在任何地方運行晋辆,不只是瀏覽器中。只要我們的 JavaScript 是根據(jù) CommonJS API 編寫的宇整,那么就可以在與 CommonJS 兼容的系統(tǒng)上運行瓶佳。
(3)根據(jù) CommonJS API 編寫的 JavaScript 可以做下面這些事情:

  • 編寫服務(wù)端應(yīng)用
  • 編寫命令行工具
  • 編寫基于 GUI 的桌面應(yīng)用

(4)CommonJS 規(guī)范有很多實現(xiàn),最有名要數(shù) NodeJS 了鳞青。

2霸饲,CommonJS 的模塊規(guī)范

一個文件就是一個模塊索赏,擁有單獨的作用域。普通方式定義的變量贴彼、函數(shù)潜腻、對象都屬于該模塊內(nèi)。

  • 通過 require 來加載模塊器仗。
  • 通過 exportsmodul.exports 來暴露模塊中的內(nèi)容融涣。

3,使用樣例1:使用 exports 暴露模塊接口

(1)下面我們在 Node.js 中創(chuàng)建一個模塊精钮,文件名為:dog.js

exports.say = function() {
  console.log('Hello dog');
}

(2)創(chuàng)建一個 main.js 文件威鹿,引入這個模塊并調(diào)用。

var dog = require('./dog');
dog.say();

4轨香,使用樣例2:使用 modul.exports 暴露模塊對象

var say = function() {
  console.log('Hello dog');
}
modul.exports = say // 不可以直接賦值,這樣會報錯的忽你,注意跟exports區(qū)別
modul.exports = { say: say} 或者 modul.exports.say =  say}

(2)創(chuàng)建一個 main.js 文件,引入這個模塊并調(diào)用臂容。

var dog = require('./dog');
dog.say();

--------------modul.exports跟exports區(qū)別-------------------待續(xù)----------------------------

二科雳、ES2015(export輸出, import導(dǎo)入加載)

1,ES2015 基本介紹

2015 年 6 月脓杉, ES2015(即 ECMAScript 6糟秘、ES6) 正式發(fā)布。ES2015 是該語言的一個顯著更新球散,也是自 2009 年 ES5 標(biāo)準(zhǔn)確定后的第一個重大更新尿赚。
雖然 ES2015 提出了許多令人激動的新特性,但由于目前 JavaScript 的運行環(huán)境眾多蕉堰,對 ECMAScript 標(biāo)準(zhǔn)的支持程度也不一樣凌净。

2,ES2015 的模塊規(guī)范

  • 一個模塊就是一個獨立的文件屋讶。該文件內(nèi)部的所有變量冰寻,外部無法獲取。
  • export 命令用于規(guī)定模塊的對外接口丑婿。
  • import 命令用于輸入其他模塊提供的功能性雄。
  • ES6 模塊的設(shè)計思想是盡量的靜態(tài)化,使得編譯時就能確定模塊的依賴關(guān)系羹奉,以及輸入和輸出的變量。

3约计,使用樣例1:使用 export 命令規(guī)定對外接口

(1)下面我們在 Node.js 中創(chuàng)建一個模塊诀拭,文件名為:dog.js

//圓面積計算
export function area(radius) {
  return Math.PI * radius * radius;
}
 
//圓周長計算
export function circumference(radius) {
  return 2 * Math.PI * radius;
}

(2)創(chuàng)建一個 main.js 文件,引入這個模塊并調(diào)用煤蚌。這里 import 命令使用大括號的形式加載模塊對外的接口耕挨。

import {area,circumference} from './dog';
console.log('圓面積:' + area(10));
console.log('圓周長:' + circumference(11));

當(dāng)然也可以使用星號(*)指定一個對象细卧,實現(xiàn)模塊的整體加載。

import * as circle from './hangge';
console.log('圓面積:' + circle.area(10));
console.log('圓周長:' + circle.circumference(11));

(3)由于 NodeJS 目前還不支持 ES2015 的 Module筒占,這里我們借助 babel-node 來執(zhí)行贪庙,運行結(jié)果如下


image.png

4,使用樣例2:使用 export default 命令來輸出模塊

(1)下面我們使用 export default 命令用于指定模塊的默認(rèn)輸出翰苫。模塊文件名為:dog.js

//圓面積計算(作為默認(rèn)接口)
export default function(radius) {
  return Math.PI * radius * radius;
}
 
//圓周長計算
export function circumference(radius) {
  return 2 * Math.PI * radius;
}

(2)創(chuàng)建一個 main.js 文件止邮,引入這個模塊并調(diào)用。注意:對于 export default 指定模塊的默認(rèn)輸出奏窑,import 語句不需要使用大括號导披。

import area, {circumference} from './hangge';
console.log('圓面積:' + area(10));
console.log('圓周長:' + circumference(11));

(3)同樣借助 babel-node 來執(zhí)行,運行結(jié)果如下:


image.png

----------------------------------待續(xù)-----------原理-------------------

三埃唯、AMD (define, require)

1撩匕,AMD 基本介紹

  • AMD 全稱為 Asynchromous Module Definition(異步模塊定義)
  • AMD 是 RequireJS 在推廣過程中對模塊定義的規(guī)范化產(chǎn)出,它是一個在瀏覽器端模塊化開發(fā)的規(guī)范墨叛。
  • AMD 模式可以用于瀏覽器環(huán)境并且允許非同步加載模塊止毕,也可以按需動態(tài)加載模塊。

2漠趁,AMD 的模塊規(guī)范

  • AMD 通過異步加載模塊滓技。模塊加載不影響后面語句的運行。所有依賴某些模塊的語句均放置在回調(diào)函數(shù)中棚潦。
  • AMD 規(guī)范只定義了一個函數(shù) define令漂,通過 define 方法定義模塊。該函數(shù)的描述如下:
define(id?, dependencies?, factory)
id:指定義中模塊的名字(可選)丸边。如果沒有提供該參數(shù)叠必,模塊的名字應(yīng)該默認(rèn)為模塊加載器請求的指定腳本的名字。
如果提供了該參數(shù)妹窖,模塊名必須是“頂級”的和絕對的(不允許相對名字)纬朝。
dependencies:當(dāng)前模塊依賴的,已被模塊定義的模塊標(biāo)識的數(shù)組字面量(可選)骄呼。
factory:一個需要進(jìn)行實例化的函數(shù)或者一個對象共苛。
  • AMD 規(guī)范允許輸出模塊兼容 CommonJS 規(guī)范,這時 define 方法如下:
define(function (require, exports, module) {
    var reqModule = require("./someModule");
    requModule.test();
      
    exports.asplode = function () {
        //someing
    }
});

3蜓萄,使用樣例1:獨立模塊

(1)我們使用 RequireJS 定義一個不依賴其他模塊得獨立模塊隅茎,文件名:dog.js

define(function(){
    var add = function(x,y) {
        return x + y;
    };
    return {
        add : add
    }
});

(2)接著創(chuàng)建一個 html 頁面,其內(nèi)部加載并調(diào)用這個模塊嫉沽。

<!DOCTYPE html>
<html>
    <head>
        <script type="text/javascript" src="require.js"></script>
        <script type="text/javascript">
          require(['dog'], function (m){
            console.log(m.add(2,3));
          });
        </script>
    </head>
    <body>
    </body>
</html>

4辟犀,使用樣例2:存在依賴的函數(shù)式定義

下面定義的模塊又依賴于 cart 和 inventory 這兩個模塊(它們都處在同一個文件夾下)

define(["./cart", "./inventory"], function(cart, inventory) {
        //return an object to define the "my/shirt" module.
        return {
            color: "blue",
            size: "large",
            addToCart: function() {
                inventory.decrement(this);
                cart.add(this);
            }
        }
    }
);

四、CMD( exports 暴露模塊接口绸硕、modul.exports 暴露模塊對象堂竟, seajs.use引入)

1魂毁,CMD 基本介紹

(1)CMD 全稱為 Common Module Definition,它是國內(nèi)玉伯大神在開發(fā) SeaJS 的時候提出來的出嘹。
(2)CMD 與 AMD 挺相近席楚,二者區(qū)別如下:

  • 對于依賴的模塊 CMD 是延遲執(zhí)行,而 AMD 是提前執(zhí)行(不過 RequireJS 從 2.0 開始税稼,也改成可以延遲執(zhí)行烦秩。 )
  • CMD 推崇依賴就近,AMD 推崇依賴前置娶聘。
  • AMD 的 api 默認(rèn)是一個當(dāng)多個用闻镶,CMD 嚴(yán)格的區(qū)分推崇職責(zé)單一,其每個 API 都簡單純粹丸升。例如:AMD 里 require 分全局的和局部的铆农。CMD 里面沒有全局的 require,提供 seajs.use() 來實現(xiàn)模塊系統(tǒng)的加載啟動狡耻。

2墩剖,使用樣例1:使用 exports 暴露模塊接口

(1)下面使用 sea.js 創(chuàng)建一個模塊,文件名為:dog.js

define(function(require, exports) {
    // 對外提供name屬性
    exports.name = 'hangge';
    // 對外提供hello方法
    exports.hello = function() {
      console.log('Hello hangge.com');
    };
});

(2)接著創(chuàng)建一個 html 頁面夷狰,其內(nèi)部加載并調(diào)用這個模塊岭皂。

<!DOCTYPE html>
<html>
    <head>
        <script type="text/javascript" src="sea.js"></script>
        <script type="text/javascript">
          //加載一個模塊,在加載完成時沼头,執(zhí)行回調(diào)
          seajs.use('dog', function(a) {
            a.hello();
          });
        </script>
    </head>
    <body>
    </body>
</html>

3爷绘,使用樣例2:使用 modul.exports 暴露模塊對象

(1)下面我們把一個對象封裝到模塊中,文件名為:dog.js

define(function(require, exports, module) {
    // 對外提供接口
    module.exports = {
        name: 'hangge',
        hello: function() {
          console.log('Hello hangge.com');
        }
    };
});

(2)接著創(chuàng)建一個 html 頁面进倍,其內(nèi)部加載并調(diào)用這個模塊土至。

<!DOCTYPE html>
<html>
    <head>
        <script type="text/javascript" src="sea.js"></script>
        <script type="text/javascript">
          //加載一個模塊,在加載完成時猾昆,執(zhí)行回調(diào)
          seajs.use('dog', function(a) {
            a.hello();
          });
        </script>
    </head>
    <body>
    </body>
</html>

-------------------------------------------待續(xù)------------------------------------

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末陶因,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子垂蜗,更是在濱河造成了極大的恐慌楷扬,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贴见,死亡現(xiàn)場離奇詭異烘苹,居然都是意外死亡,警方通過查閱死者的電腦和手機蝇刀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門螟加,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吞琐,你說我怎么就攤上這事捆探。” “怎么了站粟?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵黍图,是天一觀的道長。 經(jīng)常有香客問我奴烙,道長助被,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任切诀,我火速辦了婚禮揩环,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘幅虑。我一直安慰自己丰滑,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布倒庵。 她就那樣靜靜地躺著褒墨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪擎宝。 梳的紋絲不亂的頭發(fā)上郁妈,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機與錄音绍申,去河邊找鬼噩咪。 笑死,一個胖子當(dāng)著我的面吹牛极阅,可吹牛的內(nèi)容都是我干的胃碾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼涂屁,長吁一口氣:“原來是場噩夢啊……” “哼书在!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拆又,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤儒旬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后帖族,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體栈源,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年竖般,在試婚紗的時候發(fā)現(xiàn)自己被綠了甚垦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖艰亮,靈堂內(nèi)的尸體忽然破棺而出闭翩,到底是詐尸還是另有隱情,我是刑警寧澤迄埃,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布疗韵,位于F島的核電站,受9級特大地震影響侄非,放射性物質(zhì)發(fā)生泄漏蕉汪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一逞怨、第九天 我趴在偏房一處隱蔽的房頂上張望者疤。 院中可真熱鬧,春花似錦叠赦、人聲如沸驹马。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窥翩。三九已至,卻和暖如春鳞仙,著一層夾襖步出監(jiān)牢的瞬間寇蚊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工棍好, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留仗岸,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓借笙,卻偏偏與公主長得像扒怖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子业稼,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容