1. 程式人生 > >NodeJS | 模組的概念(二)

NodeJS | 模組的概念(二)

Javascript天生的缺點

熟悉JS的都知道,我們可以通過var或function定義一個全域性訪問的變數或函式。但是當有多人協作或大量引入JS檔案時,那麼變數和函式就很容易重寫和覆蓋,特別是有很多依賴關係的時候,很容易出錯。這是因為Javascript天生就缺少模組管理機制,來隔離JS片段相互影響,因此我們常採用名稱空間的方式:將變數和函式限制在某個特定的作用域內。從而保證程式碼安全執行。

Commonjs規範

它不是一個具體負責某個職能的JS庫,它是一套規範,來規定Javascript怎麼去組織,怎麼去編寫。同時大部分的標準都在擬定和討論之中的。首先是把執行不同的任務的程式碼塊或程式碼檔案看做獨立的模組,每個模組都是有獨立的作用域,模組間可以有依賴關係。對於一個模組可以分成3個關鍵部分:定義、標識、引用。這種設計規範在社群內不斷成長壯大,對許多開源的產品產生了極大的推動作用,比如nodejs/couchdb,都是對這個規範的實現,雖然不是百分百的實現,但又反饋給社群,促進進一步的優化,從而形成一個良性的迴圈鏈,彼此推動。

nodejs借鑑了Commonjs模組組織的理念,形成了一套模組管理系統。在nodejs裡面,每一個JS檔案可以看成一個獨立的模組,在裡面不需要有名稱空間,不用擔心變數汙染和方法使用時的隔離,整個檔案中的程式碼可以非常自然的組織起來。同時,這些獨立的模組/檔案通過彼此的依賴和引入可以組合成更強大、更完整的模組/功能包。

我們安裝nodejs時,會同時安裝NPM包管理工具,通過這個工具,我們可以像專案中引入各種形形色色的模組。

模組的分類

在nodejs裡面,檔案和模組是一一對應的,模組有幾種型別,大概分為:

  1. 核心模組 http fs path...——將在最後接觸
  2. 本地模組(同事們建立) var util=require('./util.js')——後面學習第一個接觸
  3. 第三方模組(通過NPM安裝的) var promise = require('bluebird')——第二個接觸

引用方式

根據模組的型別,有幾種引用的方式。

在nodejs裡面,可以通過檔案路徑來引用模組,也可以通過模組名。如果用名稱引用非核心模組,nodejs最終會把模組名對映到對應模組檔案的路徑。包含核心模組的模組會在node啟動時預先載入。

到此總結下,上面說了很多,其實只要記住nodejs是模組化的管理機制,並且模組分為三種:node啟動時預先載入的核心模組、自己或同事建立的本地模組、通過NPM載入的第三方模組。並且不同模組有不同的引入方式。

實現一個本地模組的流程

  1. 建立模組 teacher.js 建立一個JS檔案,裡面新增特定的功能
  2. 匯出模組 exports.add=function(){} 功能和模組名建立關係
  3. 載入模組 var teacher=require('./teacher.js') 其他檔案引入,並載入模組
  4. 使用模組 teacher.add('張三') 直接呼叫模組中的方法

注意exports有加s

exports與module.exports區別

它們兩呼叫的功能是一樣的,如果你想讓你的模組成為特別的物件型別,那麼請使用module.exports,如果你想讓你的模組成為傳統的模組例項,那就使用exports。現也不深究,後面學的時候,再研究。推薦使用exports。