如何要求深层嵌套的NodeJS模块?

时间:2014-08-03 19:16:23

标签: javascript node.js require node-modules

我有以下应用程序结构:

application
|- config
|----- config.js
|- routes
|------ api
|-----------router.js 
|- Application.js
|- package.json

在/routes/api/router.js模块中我需要/config/config.js文件并执行以下操作:

require('../../config/config.js');

我发现上面的代码很难看,并希望让它更漂亮。此外,如果我将/routes/api/router.js移动到另一个文件夹,我必须重构所有要求。需要这些模块的最佳实践是什么,是否可以从应用程序文件夹根目录中获取config.js,如下所示:

require('/config/config.js');

感谢。

3 个答案:

答案 0 :(得分:3)

有几种方法可以解决这个问题。一种方法是将所有共享代码(如config.js)放在node_modules下的目录中(使用lib,以防您希望其中包含config以外的目录) :

application
|- node_modules
|----- lib
|---------- config
|-------------- config.js
|- routes
|------ api
|-----------router.js 
|- Application.js
|- package.json

那么你可以使用require( 'lib/config/config.js' )来要求config.js。

或者,您可以在lib中创建一个node_modules符号链接,并将其链接到应用程序目录结构中的lib:

application
|- node_modules
|----- lib -> ../../lib
|- lib
|------ config
|---------- config.js
|- routes
|------ api
|-----------router.js 
|- Application.js
|- package.json

节点文档不鼓励另一种替代方法是使用NODE_PATH,它允许您指定节点require()算法应该查看的目录。按照与上面lib相同的模式,你可以这样做:

application
|- lib
|------ config
|---------- config.js
|- routes
|------ api
|-----------router.js 
|- Application.js
|- package.json

并将NODE_PATH设为$path_to_application/lib

<强>更新

找到关于该主题的this great discussion,其中包括上述选项以及其他一些选项。

答案 1 :(得分:0)

require('/config/config.js');

将无法正常工作,因为您使用的是系统的根目录(os),而不是应用程序的根目录。

var path=require('path');
var root=path.dirname(process.mainModule.filename);

var root=process.cwd();

将为您提供应用程序的根目录。导航到config.js

path.resolve(root,'config/config.js)

答案 2 :(得分:0)

最简单的解决方案是使用path.resolve。如果您只提供path.resolve的相对路径,那么它假定它们相对于当前工作目录,即项目根目录。所以你需要的只是:

const path = require('path');
path.resolve('config/config.js');