繁体   English   中英

节点需要绝对路径

[英]Node require absolute path

我有一个看起来像这样的目录:

-- app/
   |- models/
      |- user.js
   |- config.json

我希望我的user.js文件需要config.json 现在我正在使用require('/config')但这不起作用。 我究竟做错了什么? 我想避免使用require('../config')

简单的答案是你没有做错任何事。 根据一些研究,require 函数会查找以下其中一项:

  • 一个核心模块,如 fs
  • 您在 require 调用中指定的相对文件路径
  • 在调用 require 函数的文件的父目录中某处的 node_modules 文件夹中,在目录中搜索适当命名的模块。

请参阅: http : //www.bennadel.com/blog/2169-Where-Does-Node-js-And-Require-Look-For-Modules-.htm和: http : //nodejs.org/api/modules。 html#loading_from_node_modules_Folders

上面的两个资源都引用了还可以修改 NODE_PATH 环境变量的能力,但这听起来是非常糟糕的做法,至少会降低您的代码的可移植性。 它甚至可能不适用于像 config.json 这样的文件,因为虽然我从未这样做过,但我想更改 NODE_PATH 变量只会更改 require() 查找与实际模块对应的 package.json 文件的位置。

综上,见: 如何让node.js中的require始终相对于项目的根文件夹? 如上文 Piotr Kowalczuk 所引用。 根据该帖子,您有两个实际选择:

  1. 使用相对文件路径。
  2. 使用 package.json 文件将您想要的资源打包为一个真正的模块,并将其放入 node_modules 文件夹中。

最后,请记住,您尝试执行的操作与您正在使用的程序的本质背道而驰。 我认为这是一种情况,通过使用 Node 的粒度并按照设计的意图使用相对文件路径,您最终将使您的生活(以及您的合作者!)变得更轻松。

我找不到比编写自己的模块更好的解决方案。

在一些项目中对其进行测试后,我决定将其开源

const user = require('../../../database/user'); // 👎 what you have
// OR
const user = require('$db/user'); // 👍 no matter how deep you are
const product = require('/database/product'); // 👍 alias or pathing from root directory

三个简单的步骤来使用它。

  1. 安装包: npm install sexy-require --save

  2. 在主应用程序文件的顶部包含require('sexy-require')一次。

     require('sexy-require'); const routers = require('/routers'); const api = require('$api'); ...
  3. 可选步骤。 路径配置可以在项目根目录下的.paths文件中定义。

     $db = /server/database $api-v1 = /server/api/legacy $api-v2 = /server/api/v2

您可以在项目中的任何地方获得定义的快捷路径:

const path = require(`sexy-require`);
console.log(path.$db); // -> '/full/path/to/app/server/database'

似乎模块加载功能将node_modules/到参数之前。 例如,将以下脚本放入/tmp/t.js

meow = require('meow/meow.js');

创建( mkdir/tmp/node_modules/并尝试使用 BSD 的ktrace (或 Linux 的strace ,它提供类似的功能)运行它。 Node 将尝试打开以下内容:

  • /tmp/node_modules/meow/meow.js
  • /tmp/node_modules/meow/meow.js.js
  • /tmp/node_modules/meow/meow.js.json
  • /tmp/node_modules/meow/meow.js.node
  • /tmp/node_modules/meow/meow.js/package.json
  • /tmp/node_modules/meow/meow.js/index.js
  • /tmp/node_modules/meow/meow.js/index.json
  • /tmp/node_modules/meow/meow.js/index.node

如果您的脚本旁边没有node_modules/子目录,则它根本不会查找与您的脚本相关的任何位置。

global.__require = function (file) {
  return require(__dirname + '/' + file)
}

将它放在入口点文件的顶部(例如, index.js )。 然后你就可以使用

const foo = __require('src/foo')

我使用双下划线作为对__dirname的颂歌,但您可以将其重命名为任何名称!

我认为我们不需要讨论这个问题。 以这种方式设计以方便开发人员。
如果我们需要 /config.json 可能子文件夹中有很多 config.json 这通常会使它更难理解

-- app/
   |- controller
      |- config.json(2) 
   |- models/
      |- user.js
      |- config.json(3)
   |- config.json(1)

现在告诉我你如何知道你需要选择哪一个配置文件。
解决方案:user.js

var config1 = require('../config.json');
var config2 = require('../controller/config.json');
var config3 = require('./config.json');

如果只有一个配置,您最好放入全局变量并从那里使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM