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

Posted

技术标签:

【中文标题】如何要求深度嵌套的 NodeJS 模块?【英文标题】:How to require deep nested NodeJS modules? 【发布时间】:2014-09-26 07:22:26 【问题描述】:

我的应用结构如下:

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

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

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

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

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

谢谢。

【问题讨论】:

【参考方案1】:

有几种方法可以解决这个问题。一种是将所有共享代码(如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。

或者,您可以在node_modules 中创建一个lib 符号链接并将其链接到应用程序目录结构中的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,其中包括上述选项以及其他一些选项。

【讨论】:

感谢您的回答。我喜欢您提供的第二种方法。是否可以在 nodejs 应用程序本身而不是操作系统中创建符号链接? @Erik:不确定您的想法,但我刚刚找到了this great discussion 解决此问题的选项并更新了我的答案【参考方案2】:

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

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

【讨论】:

【参考方案3】:
require('/config/config.js');

由于您使用的是系统的根目录而不是应用程序的根目录,因此无法正常工作。

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

var root=process.cwd();

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

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

【讨论】:

以上是关于如何要求深度嵌套的 NodeJS 模块?的主要内容,如果未能解决你的问题,请参考以下文章

为什么NodeJS要求我使用下载模块的完整目录?

NodeJs 常用模块

Cloudlinux NodeJS 要求将应用程序的节点模块存储在名为“node_modules”的符号链接指向的单独文件夹(虚拟环境)中

Nodejs深度探秘:event loop的本质和异步代码中的Zalgo问题

Nodejs深度探秘:event loop的本质和异步代码中的Zalgo问题

React:使用 Hooks 为深度嵌套对象设置状态