在開發node.js專案時,會使用相對路徑進行require。當資料夾結構較深時,常出現以下程式碼:
const foo = require('../../../../../foo')
const bar= require('../../../bar')
這種code既不美觀,也缺乏彈性。
可以試著用npm local module,把上面這段code改造成以下這樣:
const foo = require('foo')
const bar = require('bar')
是不是清爽多了?
假設app依賴於兩個模組:foo、bar,整個專案資料結構如下:
.
└── app
├── index.js
└── my_modules
├── bar.js
└── foo.js
在app/index.js中,需要如下引用foo、bar:
const foo = require('./my_modules/foo')const bar = require('./my_modules/bar')
為了讓foo、bar成為獨立的模組,於是將foo.js、bar.js從app中抽出,建立如下資料結構:
.
├── app
│ ├── index.js
│ └── package.json
├── bar
│ ├── index.js
│ └── package.json
└── foo
├── index.js
└── package.json
注意到foo、bar資料夾,也擁有自己的index.js、package.json檔案,
意味著他們是獨立的模組。然後使用如下語法,將foo、bar安裝為app的相依模組:
# 移動至app資料夾
cd appnpm install --save ../foo
npm install --save ../bar
安裝完成後,確認app/package.json的dependencies更新為:
"dependencies": { "bar": "file:../bar", "foo": "file:../foo"}
於是,我們可以在app/index.js中,如下引用模組:
const foo = require('foo')
const bar = require('bar')
更精簡的require能不僅令人心曠神怡,將可重用的邏輯從專案中分離,建立獨立的模組,建立可重複使用的元件,更是軟體開發中不可或缺的技巧之一。
在實際的應用場景,foo可能是一個資料庫連線模組,bar可能是一個logger模組,這種類型的模組,通常會重複地在許多應用程式專案中出現,試想,若沒有將之從應用程式中抽離,而是把相同的邏輯,重複地複製貼上在每個專案,這種code維護起來,會有多痛苦?