2014-01-07 51 views
1

要求中一個的NodeJS文件I有一個虛構的應用程序包(節點模塊)我導入到我的應用程序,如下所示:使用規範的或根目錄相對路徑

var sqrt = require('common-math').sqrt 

但是,使用此相同的模塊來自common-math模塊內部似乎很棘手。我似乎只需要選擇,這兩者都是不理想:

  • 使用相對路徑從每一個地方,我需要獲得訪問模塊需要。這可以是require('../sqrt')require('../../../lib/sqrt')
  • 將模塊放入node_modules/sqrt/index.js,然後執行require('sqrt')

我只是想能夠require('common-math').sqrt就像這個包的所有消費者一樣。我意識到我可以創建一個node_modules/common-math文件夾,其中包含一個符號鏈接到我的包的index.js,但這是一種常見/推薦的做法嗎?

+0

嗯,其實,你有第三個選擇 - 你可以在全球範圍安裝(全球node_modules)。然後你可以按照你的意願要求它。 –

+1

我可以問你,爲什麼相對路徑不夠好? –

+0

因爲它非常脆弱。如果我移動我的消費文件,我有很高的破壞風險。將它與我可以從我的包中的任何位置(或者甚至從外部用另一個包)導入com.common.math.sqrt'的Java進行比較,你就會明白我的意思了。 –

回答

1

節點的模塊加載系統是非常有限的,但你想要的是可能的。

var root = (function (p, path) { 
     for (; 'common-math' !== path.basename(p); p = path.dirname(p)); 
     return p; 
    }(module.filename, require('path')); 

var a = require(root + '/sqrt.js'); 

甚至:但是你可能希望它是它並不像優雅

var root = (function (p) { 
     return p.slice(0, p.indexOf('common-math') + 1).join('/'); 
    }(module.filename.split('/'))); 

var a = require(root + '/sqrt.js'); 
+0

看起來像這樣會工作,但你必須在每個需要的文件中都有。 –