NodeJS — 在 require 使用絕對路徑

Mindy Huang
4 min readJun 17, 2021

--

在寫 NodeJS 應用程式時,常會遇到想在 A 模組的程式,引用 B 模組或是上層資料夾的檔案,如果使用相對路徑的寫法require('./../../lib/module-b/b'),會導致引用路徑變得很複雜。

假設專案資料夾結構如下:

.
├── app.js
├── folder-a
│ └── path-to
│ └── a.js
└── lib
└── module-b
└── b.js

你可以看到這裡有三支檔案

  1. app.js
  2. folder-a/path-to/a.js
  3. lib/module-b/b.js

若我想在 a.js 引用 b.js 這支檔案,語法會變成

// folder-a/path-to/a.jsrequire('./../../lib/module-b/b')

以上是使用 ”相對路徑” 的做法,可以看到有很多 ./../ 字串,會導致兩個問題

  1. 可讀性差:
    工程師閱讀程式碼時,會很困惑(OS: 現在到底是引用哪一層資料夾的檔案)。
    為了確認檔案位置,還要跟著引用的資料夾層數,一層層的數一遍,數完腦袋也差不多暈了XD。
  2. 可維護性差:
    假設你想把 a 檔案搬到不同資料夾時,require 的路徑就要跟著改寫。就算你是搬動 b.js 檔案,require 路徑還是要改。
    因為這兩隻檔案的路徑有很高的相依性,所以搬動時容易導致程式碼出錯。

要修正這個問題,最好的方式就是改成”絕對路徑”的寫法,以下是幾種可行的做法

1. 將資料夾註冊成 workspace

module-b 資料夾,新增 package.json 檔,裡面的 "name" 設定為 "workspace-b" (自己取名)

// package.json
{
"name": "workspace-b",
"version": "1.0.0"
}

接著,在專案根目錄的 package.json

  • 新增 "workspaces",並加入 "lib/module-b" (你想引用的資料夾路徑)
  • "private" 設為 true
// package.json
{
"private": true,
"workspaces": ["lib/module-b"]
}

安裝:回到專案根目錄,執行 yarn installnpm install。安裝完成後,會發現 node_modules 多出了 workspace-b 這個資料夾

這時,再回去a.js,把引用的方式改掉,就完成了!

// folder-a/path-to/a.jsrequire('workspace-b/b')

2. 將資料夾註冊成 dependency 模組

這個做法跟上面 workspace 類似,只是寫法不同

先在 module-b 資料夾內,新增一個 package.json 檔,取名為 "workspace-b"

// package.json{
"name": "workspace-b",
"version": "1.0.0"
}

加入 dependency:在專案根目錄的 package.json

  • "private" 設為 true
  • 在 teminal 執行 yarn add workspace-b@file:lib/module-b
    或者你也可在 package.jsondependencies 自己手動加入:"workspace-b": "file:lib/module-b"之後,執行 yarn install
// package.json
{
"private": true,
"dependencies": {
"workspace-b": "file:lib/module-b",
}
}

這個做法也會將 lib/module-b 註冊為一個模組,並加入至 node_modules 內

最後同樣修改 a.js,就完成了

// folder-a/path-to/a.js
require('workspace-b/b')

3. 使用套件

以下套件都是在解決相對路徑的問題,讓你在引用資源時,能使用絕對路徑。可以自己玩玩看!

Reference

--

--