我是否可以要求'require'从我的应用程序根目录中搜索模块?

时间:2012-04-29 03:50:24

标签: node.js

我有一个带目录的应用程序,这些目录中的文件通过require相互引用。我可能会移动它们,所以我讨厌使用相对路径。有没有办法使用相对于我的应用程序根目录的路径?

我有

/home/robert/src/application/
  |\ routes
  |    \ foo.js
  |\ models
       \ bar.js
// foo.js
var bar = require('../models/bar')
  , stuff = require('../other_stuff/stuff');

我想要

/home/robert/src/application/
  |\ routes
  |    \ foo.js
  |\ models
       \ bar.js
// foo.js
var bar = require('/models/bar')
  , stuff = require('/other_stuff/stuff');

除了路径附加到/home/robert/src而不是自己评估。

3 个答案:

答案 0 :(得分:1)

很多人已经开始创建一个index.js文件,可以从一个地方导出所有模块。然后,模块只需要从索引文件中导出这些导出,而不是实际定义模块的位置。如果你移动任何东西,你只需要更新这个文件。此外,它还可以更轻松地创建代码覆盖率。

Index.js最终会出现一堆这样的行:

module.exports.app = process.env.EXPRESS_COV ?
    require('./lib-cov/app') : require('./lib/app');

基本上,根据变量,使用标准模块或代码覆盖率版本为任何需要它的模块导出app

答案 1 :(得分:0)

怎么样?
require(__dirname + '/models/bar');

请参阅:http://nodejs.org/docs/latest/api/globals.html#globals_dirname

答案 2 :(得分:0)

将您的应用程序放入应用程序根目录中的一个文件夹(例如./app),然后将此代码段包含在package.json中:

"scripts": {
  "postinstall": "ln -sf ../app ./node_modules"
}

然后运行命令。这会将app文件夹软链接到您的node_modules,允许节点和require执行其最擅长的操作。您可以像这样要求您的模块:

require('app/routes/foo')

(Windows用户需要手动执行;不确定它是否可以在Windows上运行。)