眾所周知,Node.js 的出現造就了全棧工程師,因為它讓 JavaScript 的舞台從瀏覽器擴大到了服務端
而 Node.js 的強大也得益於它龐大的模塊庫,所以學習 Node.js 第一步還得從模塊開始~
一、安裝 Node.js 和 npm
在 Node.js 中文網下載合適的安裝包
安裝的過程十分簡單,只需要一直點 next 就行。安裝 node.js 的同時會自帶 npm (node package manager)
安裝完成后,使用命令行工具輸入 node -v 和 npm -v,如果能顯示出版本號,就說明安裝成功。

然后輸入 node 進入環境,就可以運行 JavaScript 語句了

連按兩次 Ctrl+C 就能退出 Node.js 環境
二、創建模塊
上面只是在命令行中運行 Node 程序,在實際開發的時候需要一個集成開發環境
我一般使用 Visual Studio Code 作為開發工具,具體的環境搭建可以參考廖雪峰大神的視頻講解
手動創建一個項目結構:

其中 app.js 是入口文件,wise_module 用來存放模塊, .vscode 是開發工具生成的配置目錄
然后在 wise_module 目錄下創建 hello.js
// hello.js
'use strict'; function hello(name) { console.log('hello', name); } module.exports = hello;
這個 hello.js 就是一個模塊,通過 module.exports 將函數 hello 作為輸出結果暴露出來
別的模塊就能夠通過 require 引入 hello 函數:
// app.js
'use static'; let hello = require('./wise_module/hello'); hello('wise wrong');
運行結果:
三、深入解析 require

可以看到 app.js 中的 require 后面接的是相對路徑
如果改成這樣:

就會提示找不到對應模塊

這是因為在沒有具體路徑的時候,require 會首先檢查 node.js 核心模塊(如 "fs"),
然后檢查 node_modules,最后檢查環境變量 NODE_PATH 指定的目錄
這里我們可以新建一個 node_modules 文件夾,將 hello.js 挪過去

這時就能正常運行了

上面的 hello 模塊是一個 js 文件,如果 hello 是一個文件夾,就需要在目錄下創建一個 index.js 作為模塊的入口
實際項目中,node_modules 是由 package.json 生成,里面用來存放第三方依賴庫
自己開發的模塊還是需要放到其他文件目錄下,然后通過 require( /*相對路徑*/ ) 引入
在 Node 這個由異步操作構成的環境中,require 是少有的幾個同步 I/O 操作之一
為了避免堵塞,建議只在程序最初加載的時候使用 require,在程序中 I/O 密集的地方就要避免使用。
四、模塊的兩種導出方式
把上面示例中 hello.js 放回 wise_module 目錄,然后把導出方式改寫一下:
用 exports 這種方式導出的時候,將 hello 函數作為導出對象的一個鍵值給暴露出來
在 app.js 中調用的時候就需要這樣調用:
如果把導出的代碼改為下面這樣,也能正常工作

看起來 exports 變量和 module.exports 變量似乎是同一個變量
但實際上還是有些區別,比如 exports 不能直接賦值

這是因為 exports 只是對 module.exports 的一個全局引用,會在程序加載時初始化為一個空對象
而這個對象 exports 不能被賦值或者重寫,那樣 exports 就不再指向 module.exports
不過 module.exports 就沒有這個顧慮,可以隨意的賦值重寫
在需要導出多個模塊的時候,還可以這么寫:
exports 作為 module.exports 的衍生產物,雖然可以應對大多數情況,但仍有不足之處
所以模塊導出的時候,建議使用 module.exports = * 這種方式來輸出
