NPM使用Local Modules

Evan
evan.fang
Published in
Apr 19, 2020

在開發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 app
npm install --save ../foo
npm install --save ../bar

安裝完成後,確認app/package.json的dependencies更新為:

"dependencies": {  "bar": "file:../bar",  "foo": "file:../foo"}
foo, bar被參考至app的node_modules資料夾

於是,我們可以在app/index.js中,如下引用模組:

const foo = require('foo')
const bar = require('bar')

更精簡的require能不僅令人心曠神怡,將可重用的邏輯從專案中分離,建立獨立的模組,建立可重複使用的元件,更是軟體開發中不可或缺的技巧之一。

在實際的應用場景,foo可能是一個資料庫連線模組,bar可能是一個logger模組,這種類型的模組,通常會重複地在許多應用程式專案中出現,試想,若沒有將之從應用程式中抽離,而是把相同的邏輯,重複地複製貼上在每個專案,這種code維護起來,會有多痛苦?

--

--