Alex Liang

NodeJS 解決require相對路徑問題

Node.JS目前有二種方式載入module: CommonJS(也就是本文會介紹的方式)及ES6的import/export

CommonJS是預設的module載入方式,其使用方式為 require & module.exports

funcA.js
1
2
3
4
5
function funcA() {
// ...
}

module.exports = funcA;
index.js
1
2
3
4
5
const funcA = require('funcA');

function main() {
funcA();
}

相信大家對此都不陌生,然而此方法最大的問題是module如果是專案的source file,其require的路徑為相對路徑。假如專案結構有許多階層,在使用上會相當不便

1
2
3
4
5
6
7
|- src
|--utils
|---moduleA.js
|--routes
|---v1
|----admin
|-----singIn.js
1
2
3
// singIn.js
const moduleA = require('../../../utils/moduleA')
...

今天介紹在npm script使用symlink解決此問題

在package.json 加入 "postinstall" : "node -e \"var s='../src',d='node_modules/src',fs=require('fs');fs.exists(d,function(e){e||fs.symlinkSync(s,d,'dir')});\""並且 npm install

1
2
3
// singIn.js
const moduleA = require('src/utils/moduleA')
...

是不是好看很多?

此方法建立一個symlink連結到專案的source folder,讓CommonJS在node_module下找到要載入的module

但是這樣設定有另一個副作用,如果專案有裝eslint的話,它會跳出import/no-extraneous-dependencies的錯誤。eslint預設禁止載入不在package.json的dependencies, devDependencies, optionalDependencies, peerDependencies或bundledDependencies的模組

如果想忽略此警告,在.eslintrc加上

1
2
3
4
5
...
"rules": {
"import/no-extraneous-dependencies": [0]
}
...

以上是修正require不能使用絕對路徑的問題,如果覺得此方式太hack,下一篇介紹import/export來載入module

參考資料: Better local require() paths for Node.js