如何要求深度嵌套的 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 模块?的主要内容,如果未能解决你的问题,请参考以下文章
Cloudlinux NodeJS 要求将应用程序的节点模块存储在名为“node_modules”的符号链接指向的单独文件夹(虚拟环境)中
Nodejs深度探秘:event loop的本质和异步代码中的Zalgo问题