1. 程式人生 > >簡要掌握CommonJS的規範和使用方法

簡要掌握CommonJS的規範和使用方法

前言:CommonJs規範的出發點:後臺JS沒有模組系統、標準庫較少、缺乏包管理工具;為了讓JS可以在任何地方執行,以達到Java、C#、PHP這些後臺語言具備開發大型應用的能力;事實上ES6已經出現了模組規範,如果使用ES6的模組規範是無需node.js環境的。因此,需要將commonJS規範和ES6的模組規範區分開來。
1.CommonJS模組規範主要分為三部分:模組定義、模組標識、模組引用。
a. 一個檔案就是一個模組,擁有單獨的作用域;
b.普通方式定義的變數、函式、物件都屬於該模組內;
c.通過require來載入模組;
d.通過exports和modul.exports來暴露模組中的內容;

模組定義、模組標識:

//在資料庫模組database.js檔案中,把各個函式寫好,然後暴露出來
 module.exports={
    'saveDatabase':saveDatabase,//儲存資料函式
    'saveLastSpider':saveLastSpider,//儲存最後一條資料函式
    'getInfoByType':getInfoByType,//通過型別查詢函式
    'getInfoByOrder':getInfoByOrder,//通過排序查詢函式
 }
//函式具體的實現沒有貼出來,上面名稱的是函式名。

模組引用:

//在控制模組controller.js中引用上面定義好的模組
var database = require('./database');//引用模組,將生成的物件指向database物件(命名可以是任意定的) database.saveDatabase([1,2,3,4,5]);//通過database物件呼叫相應的函式

3、所有程式碼都執行在模組作用域,不會汙染全域性作用域;模組可以多次載入,但只會在第一次載入的時候執行一次,然後執行結果就被快取了,以後再載入,就直接讀取快取結果;模組的載入順序,按照程式碼的出現順序是同步載入的;

4、__dirname代表當前模組檔案所在的資料夾路徑,__filename代表當前模組檔案所在的資料夾路徑+檔名;

5、require(同步載入)基本功能:讀取並執行一個JS檔案,然後返回該模組的exports物件,如果沒有發現指定模組會報錯;

6、模組內的exports:為了方便,node為每個模組提供一個exports變數,其指向module.exports,相當於在模組頭部加了這句話:var exports = module.exports,在對外輸出時,可以給exports物件新增方法,PS:不能直接賦值(因為這樣就切斷了exports和module.exports的聯絡);

7、npm root -g:檢視npm全域性包安裝位置,建議在nvm目錄下新建npm\node_modules目錄,然後設定npm的全域性包安裝位置:npm config set prefix “”,然後將該路徑新增到環境變數中;

8、npm init -y:初始化一個package.json檔案,加上-y就會預設生成該檔案,無需一步一步填寫;npm docs 包名:檢視包的文件;npm install:安裝package.json中dependencies屬性中所有依賴的包

9、由於npm的伺服器是國外的,所以如果你沒有和諧工具是下載不了的,這裡推薦使用淘寶NPM映象:http://npm.taobao.org/,與官方NPM的同步頻率目前為10分鐘一次;安裝命令:npm install -g cnpm –registry=https://registry.npm.taobao.org,安裝包:cnpm install 包名(其它命令基本一致);

10、如果你不想下載cnpm,npm還提供了一個映象源管理工具:npm install -g nrm,通過:nrm ls,檢視映象源列表 ,通過:npm use 映象源,來切換;

11、NPM的模組載入機制:

  如果require的是絕對路徑檔案,查詢不會去遍歷每個node_modules目錄,其速度最快

  1).從module.paths陣列中(由當前執行檔案目錄到磁碟根目錄)取出第一個目錄作為查詢基準

  2).直接從目錄中查詢該檔案,如果存在則結束查詢,如果不存在則進行下一條查詢

  3).嘗試新增.js、.node、.json字尾之後查詢,如果存在檔案則結束查詢,如果不存在則進行下一條查詢

  4).嘗試將require的引數作為一個包來進行查詢,讀取目錄下的package.json檔案,取得Main引數指定的檔案

  5).嘗試查詢該檔案,如果存在則結束查詢,如果不存在則進行第3條查詢

  6).如果繼續失敗,則取出module.paths陣列中的下一目錄作為基準查詢,迴圈第1-5個步驟

  7).如果繼續失敗,迴圈第1-6個步驟,直到module.paths中的最後一個值

  8).如果繼續失敗,則丟擲異常