什么是Node.js?
延吉網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。成都創(chuàng)新互聯(lián)成立于2013年到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)。
很多初學(xué)者并沒有真正地理解Node.js到底是什么。nodejs.org網(wǎng)站中的描述也沒有多大幫助。
首先要清楚Node不是一個Web服務(wù)器,這十分重要。它本身并不能做任何事情。它無法像Apache那樣工作。如果你希望它成為一個HTTP服務(wù)器,你必須借助它內(nèi)置庫自己編寫。Node.js只是計算機(jī)上執(zhí)行代碼的另一種方式,它是一個簡單的JavaScript Runtime.
模塊化
在講解CommonJS, AMD, CMD這些概念之前,我們首先倆了解下js的模塊化。模塊化,顧名思義,就是將項(xiàng)目按照功能或者其他邏輯進(jìn)行分解處理,每個部分只處理一個功能,進(jìn)行功能的解耦處理,方便以后的開發(fā)和維護(hù)。那么模塊化必須具有以下的能力,才能進(jìn)行模塊的拆分和組裝:
那么就需要一套規(guī)范準(zhǔn)則來定義這些能力,于是就出現(xiàn)了CommonJS, AMD, CMD等。
1. CommonJS
CommonJS原先叫做ServerJS,是js在服務(wù)端的規(guī)范,node使用的就是這種規(guī)范。根據(jù)CommonJS規(guī)范,一個單獨(dú)的文件就是一個模塊,require用來加載一個模塊,exports用來向外部暴露該模塊里的方法或?qū)傩浴?/p>
例如:
// hello.js function say(username){ console.log( 'hello, '+username ); } exports.say = say;
=============
// main.js var person = require('./hello'); person.say('wenzi'); // hello, wenzi person.say('師少兵'); // hello, 師少兵 person.say('NUC'); // hello, NUC
同時,require語句可以寫在文件中的任何位置,只要使用之前引用之前即可,不一定要寫在文件的最前面。不過,為了代碼更易閱讀,能直觀地看到當(dāng)前引用了哪些模塊,最好是放在文件的最前面。
EXPORTS與MODULE.EXPORTS的區(qū)別
可能有人見過直接使用exports
的,有的是使用module.exports
的,這里稍微的講解下這兩者的區(qū)別。
先舉個簡單的例子:
var a = {name:'wenzi'}; var b = a; console.log(a); // {name: "wenzi"} console.log(b); // {name: "wenzi"}
a和b輸出的結(jié)果是一樣的?,F(xiàn)在我改變下b中name的值:
b.name = 'shaobing'; console.log(a); // {name: "shaobing"} console.log(b); // {name: "shaobing"}
a和b的輸出結(jié)果都發(fā)生了改變。我再對b進(jìn)行重新聲明:
var b = {name:'師少兵'}; console.log(a); // {name: "shaobing"} console.log(b); // {name: "師少兵"}
這三個例子輸出了三種結(jié)果:
解釋:a 是一個對象,b 是對 a 的引用,即 a 和 b 指向同一塊內(nèi)存,所以1中的輸出是一樣的。當(dāng)對 b 作修改時,即 a 和 b 指向同一塊內(nèi)存地址的內(nèi)容發(fā)生了改變,a 也會體現(xiàn)出來,所以第2個例子輸出也一樣。當(dāng) b 被覆蓋時,b 指向了一塊新的內(nèi)存,a 還是指向原來的內(nèi)存,所以最后輸出會不一樣。
那么此時就可以引出exports
和module.exports
了:
module.exports
初始值為一個空對象 {}exports
是指向的 module.exports
的引用require()
返回的是 module.exports
而不是 exports
如果module.exports
發(fā)生了新指向,則exports
無效;若module.exports
沒有發(fā)生變化,則直接exports
即可。
2. AMD與RequireJS
說到AMD,不得不說到RequireJS,AMD從CommonJS社區(qū)獨(dú)立出來,單獨(dú)成為了AMD社區(qū),AMD的流行,很大程度上也是依托了RequireJS作者的推廣。
AMD規(guī)范中,默認(rèn)推薦的模塊格式是:
// hello.js // 將需要引入的模塊全部寫入到數(shù)組中,然后傳遞參數(shù)進(jìn)行調(diào)用 define(['a', 'b'], function(a, ,b){ // do something return{ hello : function(username){ console.log( 'hello, '+username ); } } })
==========
// main.js define(['./hello'], function(h){ h.hello('wenzi'); })
也就是說,在AMD中,模塊必須使用define定義,依賴通過函數(shù)參數(shù)傳進(jìn)來,這樣的一個好處就是所有的依賴都能一目了然。
3. CMD與seajs
CMD規(guī)范是國內(nèi)著名的玉伯大神提出來的,將就的就是就近依賴,什么時候用到,就在那個地方進(jìn)行require
。SeaJS就是使用的CMD規(guī)范:
// hello.js define(function(require, exports, module){ var a = require('a'); // do a var b = require( 'b' ); // do b module.exports.hello = hello; // 對外輸出hello })
從這里也能看到AMD和CMD的區(qū)別:
不過,AMD也支持CMD這樣的引入格式,但內(nèi)部還是按照AMD的邏輯進(jìn)行執(zhí)行。
4. 總結(jié)
這篇文章里介紹了下CommonJS, AMD, CMD規(guī)范的相關(guān)區(qū)別與聯(lián)系,這里再簡要的總結(jié)下:
好了,以上就是這篇文章的全部內(nèi)容了,接下來,我們就要開始正式進(jìn)行node的學(xué)習(xí)了。感興趣的朋友們請繼續(xù)關(guān)注創(chuàng)新互聯(lián)哦。
當(dāng)前標(biāo)題:從零學(xué)習(xí)node.js之模塊規(guī)范(一)
當(dāng)前地址:http://muchs.cn/article8/iegeip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、自適應(yīng)網(wǎng)站、小程序開發(fā)、網(wǎng)站設(shè)計公司、外貿(mào)建站、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)