【问题标题】:How to require deep nested NodeJS modules?如何要求深度嵌套的 NodeJS 模块?
【发布时间】: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');

谢谢。

【问题讨论】:

    标签: javascript node.js require node-modules


    【解决方案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)
      

      【讨论】:

        猜你喜欢
        • 2018-02-26
        • 2013-12-01
        • 2020-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多