解析Node.js基於模組和包的代碼部署方式_node.js

來源:互聯網
上載者:User

模組路徑解析規則

有經驗的 C 程式員在編寫一個新程式時首先從 make 檔案寫起。同樣的,使用 NodeJS 編寫程式前,為了有個良好的開端,首先需要準備好代碼的目錄結構和部署方式,就如同修房子要先搭腳手架。本章將介紹與之相關的各種知識。

模組路徑解析規則
我們已經知道,require函數支援斜杠(/)或盤符(C:)開頭的絕對路徑,也支援./開頭的相對路徑。但這兩種路徑在模組之間建立了強耦合關係,一旦某個模組檔案的存放位置需要變更,使用該模組的其它模組的代碼也需要跟著調整,變得牽一髮動全身。因此,require函數支援第三種形式的路徑,寫法類似於foo/bar,並依次按照以下規則解析路徑,直到找到模組位置。

內建模組

如果傳遞給 require 函數的是 NodeJS 內建模組名稱,不做路徑解析,直接返回內部模組的匯出對象,例如 require('fs')。

node_modules 目錄

NodeJS 定義了一個特殊的 node_modules 目錄用於存放模組。例如某個模組的絕對路徑是 /home/user/hello.js,在該模組中使用 require('foo/bar') 方式載入模組時,則 NodeJS 依次嘗試使用以下路徑。

 /home/user/node_modules/foo/bar /home/node_modules/foo/bar /node_modules/foo/bar

NODE_PATH 環境變數

與 PATH 環境變數類似,NodeJS 允許通過 NODE_PATH 環境變數來指定額外的模組搜尋路徑。NODE_PATH 環境變數中包含一到多個目錄路徑,路徑之間在 Linux 下使用:分隔,在 Windows 下使用;分隔。例如定義了以下 NODE_PATH 環境變數:

 NODE_PATH=/home/user/lib:/home/lib
當使用 require('foo/bar')的方式載入模組時,則 NodeJS 依次嘗試以下路徑。

 /home/user/lib/foo/bar /home/lib/foo/bar

包

我們已經知道了 JS 模組的基本單位是單個 JS 檔案,但複雜些的模組往往由多個子模組組成。為了便於管理和使用,我們可以把由多個子模組組成的大模組稱做包,並把所有子模組放在同一個目錄裡。

在組成一個包的所有子模組中,需要有一個入口模組,入口模組的匯出對象被作為包的匯出對象。例如有以下目錄結構。

- /home/user/lib/  - cat/    head.js    body.js    main.js

其中 cat 目錄定義了一個包,其中包含了 3 個子模組。main.js 作為入口模組,其內容如下:

var head = require('./head');var body = require('./body');exports.create = function (name) {  return {    name: name,    head: head.create(),    body: body.create()  };};

在其它模組裡使用包的時候,需要載入包的入口模組。接著上例,使用 require('/home/user/lib/cat/main')能達到目的,但是入口模組名稱出現在路徑裡看上去不是個好主意。因此我們需要做點額外的工作,讓包使用起來更像是單個模組。

index.js
當模組的檔案名稱是 index.js,載入模組時可以使用模組所在目錄的路徑代替模組檔案路徑,因此接著上例,以下兩條語句等價。

var cat = require('/home/user/lib/cat');var cat = require('/home/user/lib/cat/index');

這樣處理後,就只需要把包目錄路徑傳遞給 require 函數,感覺上整個目錄被當作單個模組使用,更有整體感。

package.json
如果想自訂入口模組的檔案名稱和存放位置,就需要在包目錄下包含一個 package.json 檔案,並在其中指定入口模組的路徑。上例中的 cat 模組可以重構如下。

- /home/user/lib/  - cat/    + doc/    - lib/      head.js      body.js      main.js    + tests/    package.json

其中package.json內容如下。

{  "name": "cat",  "main": "./lib/main.js"}

如此一來,就同樣可以使用 require('/home/user/lib/cat')的方式載入模組。NodeJS 會根據包目錄下的 package.json 找到入口模組所在位置。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.