[英]Node require absolute path
我有一个看起来像这样的目录:
-- app/
|- models/
|- user.js
|- config.json
我希望我的user.js
文件需要config.json
。 现在我正在使用require('/config')
但这不起作用。 我究竟做错了什么? 我想避免使用require('../config')
。
简单的答案是你没有做错任何事。 根据一些研究,require 函数会查找以下其中一项:
请参阅: 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 所引用。 根据该帖子,您有两个实际选择:
最后,请记住,您尝试执行的操作与您正在使用的程序的本质背道而驰。 我认为这是一种情况,通过使用 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
三个简单的步骤来使用它。
安装包: npm install sexy-require --save
在主应用程序文件的顶部包含require('sexy-require')
一次。
require('sexy-require'); const routers = require('/routers'); const api = require('$api'); ...
可选步骤。 路径配置可以在项目根目录下的.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.