CommonJS規範的提出主要是彌補JavaScript沒有標準的缺陷,以達到開發大型應用的基礎能力。java
昨天說到了nodejs,簡單的談了談nodejs是個啥,今天就來看一看node中的模塊化機制,從js這門語言誕生以來,一直給人的感受就是簡單也就是作作特效、表單驗證啥的。其實我在學校也常常聽到這樣的言論,爲此還和室友幹了一架(題外話,這就不談了)。如今的js已經不是侷限在當初的那個時代了,如今js負責的也愈來愈多,咱們急切的須要一種規範,來讓js大展拳腳。node
樸靈老師在書中也是提到了幾點js規範上的缺陷。web
不知道你們之前接觸過Java或者Python沒有,咱們能夠在文件與文件之間,十分方便的去引用導出咱們須要的東西。而後很悽慘的回過頭看看咱們的js,之前是沒有模塊這個概念的,之前js只是作表單驗證啥的沒以爲什麼,當咱們的項目愈來愈大,項目愈來愈難以維護,這時候咱們就急須要一種模塊機制。數據庫
ECMAScript(有沒有人不知道這是啥,我以爲應該你們都知道)定義的核心庫是很是少的,沒有像java那樣對文件系統、網絡、I/O流的標準庫,這些在咱們開發大型應用時是很常見的需求,可是js中是沒有的。json
咱們在js中沒有見到過如數據庫、web服務器等等的標準統一接口,這也是十分的不方便的。瀏覽器
好吧,其實我之前就一直想吐槽這一點,我之前有問題去問同窗的時候,他們統一的回答是,你去導個包啊,這時候我就很想去懟他一句。沒有包管理的系統,咱們就不能去很方便的自動加載,安裝依賴,去使用別人寫好的包文件。緩存
CommonJS爲js開發指明瞭一條大道,規範裏面涵蓋了模塊、二進制、I/O流、包管理、進程環境等等。Node借鑑CommonJS的Modules規範實現了一套很容易的模塊系統,而另外一個偉大的創造NPM對包管理規範的實現也使得咱們在開發的時候事半功倍。服務器
在模塊中,提供了exports對象用來導出當前模塊的變量或者是方法。同時在模塊中還存在一個module對象,它表明的是當前模塊自身,exports呢是module的一個屬性,在Node中一個文件就是一個模塊,都有本身的做用域,關於exports和module.exports的關係與區別下面再談。網絡
// a.js
exports.a = 1;複製代碼
模塊標識就是傳給require方法的參數,必須是符合小駝峯命名的字符串,或者絕對相對路徑。模塊化
模塊的導入也很是簡單,在模塊中存在一個require()方法,這個方法接收模塊標識,就能夠引入一個模塊了。
// b.js
const { a } = require('./a'); // 1複製代碼
咱們先來看一段代碼。
而後咱們把他跑起來,咱們到瀏覽器裏去看。
在瀏覽器裏咱們看到了這樣的一幕,很奇怪是否是,咱們明明沒有寫這麼多代碼。原來Nodejs悄悄地幫咱們作了這項工做,在咱們代碼的頭和尾加上了這些代碼。咱們再來看一看,函數裏面傳入的幾個參數是什麼?裏面的require就不用多說了,這是用來引入的,而 __filename 和 __ dirname顧名思義就是指這個模塊的文件路徑和文件夾路徑,下面咱們就來看一看exports和module.exports。
能夠看到當咱們執行完代碼後,exports和module.exports上都掛載了一個log方法,也就是咱們導出去的方法。敲重點了,exports是module.exports的引用,好了這麼說你們應該就明白了,整個模塊惟一的出口就是module.exports,而exports是給咱們提供的一個簡便的寫法,可是呢若是咱們改變了exports的指向,也就是從新給他賦值了,那麼他就不會再有導出的功能了。
其實對於require的規則,也是有幾點要提的。
感受內容有點多,今天看的比較草,望多多包涵,多提寶貴意見,謝謝。