国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

從零學習node.js之模塊規范(一)

2019-11-19 17:28:53
字體:
來源:轉載
供稿:網友

什么是Node.js?

很多初學者并沒有真正地理解Node.js到底是什么。nodejs.org網站中的描述也沒有多大幫助。

首先要清楚Node不是一個Web服務器,這十分重要。它本身并不能做任何事情。它無法像Apache那樣工作。如果你希望它成為一個HTTP服務器,你必須借助它內置庫自己編寫。Node.js只是計算機上執行代碼的另一種方式,它是一個簡單的JavaScript Runtime.

模塊化

在講解CommonJS, AMD, CMD這些概念之前,我們首先倆了解下js的模塊化。模塊化,顧名思義,就是將項目按照功能或者其他邏輯進行分解處理,每個部分只處理一個功能,進行功能的解耦處理,方便以后的開發和維護。那么模塊化必須具有以下的能力,才能進行模塊的拆分和組裝:

  1. 定義封裝的模塊;
  2. 定義新模塊對其他模塊的依賴;
  3. 可對其他模塊的引入支持;

那么就需要一套規范準則來定義這些能力,于是就出現了CommonJS, AMD, CMD等。

1. CommonJS

CommonJS原先叫做ServerJS,是js在服務端的規范,node使用的就是這種規范。根據CommonJS規范,一個單獨的文件就是一個模塊,require用來加載一個模塊,exports用來向外部暴露該模塊里的方法或屬性。

例如:

// hello.jsfunction say(username){ console.log( 'hello, '+username );}exports.say = say; 

=============

// main.jsvar person = require('./hello');person.say('wenzi'); // hello, wenziperson.say('師少兵'); // hello, 師少兵person.say('NUC'); // hello, NUC 

同時,require語句可以寫在文件中的任何位置,只要使用之前引用之前即可,不一定要寫在文件的最前面。不過,為了代碼更易閱讀,能直觀地看到當前引用了哪些模塊,最好是放在文件的最前面。

EXPORTS與MODULE.EXPORTS的區別

可能有人見過直接使用exports的,有的是使用module.exports的,這里稍微的講解下這兩者的區別。

先舉個簡單的例子:

var a = {name:'wenzi'};var b = a;console.log(a); // {name: "wenzi"}console.log(b); // {name: "wenzi"} 

a和b輸出的結果是一樣的。現在我改變下b中name的值:

b.name = 'shaobing';console.log(a); // {name: "shaobing"}console.log(b); // {name: "shaobing"} 

a和b的輸出結果都發生了改變。我再對b進行重新聲明:

var b = {name:'師少兵'};console.log(a); // {name: "shaobing"}console.log(b); // {name: "師少兵"} 

這三個例子輸出了三種結果:

  1. 聲明a對象,并把a賦值給b,然后a和b輸出了相同的結果;
  2. 改變了b中的name,那么a中的name也跟著改變;
  3. 重新聲明了b對象,那么a中的name則沒有跟著b一起改變

解釋:a 是一個對象,b 是對 a 的引用,即 a 和 b 指向同一塊內存,所以1中的輸出是一樣的。當對 b 作修改時,即 a 和 b 指向同一塊內存地址的內容發生了改變,a 也會體現出來,所以第2個例子輸出也一樣。當 b 被覆蓋時,b 指向了一塊新的內存,a 還是指向原來的內存,所以最后輸出會不一樣。

那么此時就可以引出exportsmodule.exports了:

  1. module.exports 初始值為一個空對象 {}
  2. exports 是指向的 module.exports 的引用
  3. require() 返回的是 module.exports 而不是 exports

如果module.exports發生了新指向,則exports無效;若module.exports沒有發生變化,則直接exports即可。

2. AMD與RequireJS

說到AMD,不得不說到RequireJS,AMD從CommonJS社區獨立出來,單獨成為了AMD社區,AMD的流行,很大程度上也是依托了RequireJS作者的推廣。

AMD規范中,默認推薦的模塊格式是:

// hello.js// 將需要引入的模塊全部寫入到數組中,然后傳遞參數進行調用define(['a', 'b'], function(a, ,b){ // do something return{ hello : function(username){  console.log( 'hello, '+username ); } }})

==========

// main.jsdefine(['./hello'], function(h){ h.hello('wenzi');})

也就是說,在AMD中,模塊必須使用define定義,依賴通過函數參數傳進來,這樣的一個好處就是所有的依賴都能一目了然。

3. CMD與seajs

CMD規范是國內著名的玉伯大神提出來的,將就的就是就近依賴,什么時候用到,就在那個地方進行require。SeaJS就是使用的CMD規范:

// hello.jsdefine(function(require, exports, module){ var a = require('a'); // do a var b = require( 'b' ); // do b module.exports.hello = hello; // 對外輸出hello})

從這里也能看到AMD和CMD的區別:

  1. AMD通常需要一次性引入全部的依賴,然后通過參數傳遞;而CMD則需要時才引入

不過,AMD也支持CMD這樣的引入格式,但內部還是按照AMD的邏輯進行執行。

4. 總結

這篇文章里介紹了下CommonJS, AMD, CMD規范的相關區別與聯系,這里再簡要的總結下:

  1. CommonJS: 每個文件就是一個模塊,不用define進行定義,node使用此規范;
  2. AMD: 使用define定義一個模塊,講究提前依賴;
  3. CMD: 使用define定義模塊,將就就近依賴

好了,以上就是這篇文章的全部內容了,接下來,我們就要開始正式進行node的學習了。感興趣的朋友們請繼續關注武林網哦。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 鸡西市| 宜黄县| 轮台县| 稷山县| 天镇县| 永丰县| 绿春县| 枞阳县| 威信县| 华宁县| 乐至县| 景洪市| 马边| 丹凤县| 屏东县| 东城区| 鄢陵县| 土默特右旗| 金湖县| 平果县| 襄垣县| 乌拉特后旗| 民和| 肥城市| 兴宁市| 疏勒县| 芜湖县| 重庆市| 汉沽区| 萝北县| 林甸县| 钟山县| 河东区| 临高县| 勐海县| 察哈| 祁连县| 漠河县| 九台市| 广德县| 齐齐哈尔市|