NodeJS — 在 require 使用絕對路徑
在寫 NodeJS 應用程式時,常會遇到想在 A 模組的程式,引用 B 模組或是上層資料夾的檔案,如果使用相對路徑的寫法require('./../../lib/module-b/b')
,會導致引用路徑變得很複雜。
假設專案資料夾結構如下:
.
├── app.js
├── folder-a
│ └── path-to
│ └── a.js
└── lib
└── module-b
└── b.js
你可以看到這裡有三支檔案
- app.js
- folder-a/path-to/a.js
- lib/module-b/b.js
若我想在 a.js
引用 b.js
這支檔案,語法會變成
// folder-a/path-to/a.jsrequire('./../../lib/module-b/b')
以上是使用 ”相對路徑” 的做法,可以看到有很多 ./../
字串,會導致兩個問題
- 可讀性差:
工程師閱讀程式碼時,會很困惑(OS: 現在到底是引用哪一層資料夾的檔案)。
為了確認檔案位置,還要跟著引用的資料夾層數,一層層的數一遍,數完腦袋也差不多暈了XD。 - 可維護性差:
假設你想把 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 install
或 npm 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.json
的dependencies
自己手動加入:"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. 使用套件
以下套件都是在解決相對路徑的問題,讓你在引用資源時,能使用絕對路徑。可以自己玩玩看!