gpt4 book ai didi

javascript - CommonJS 中的自定义 `require` 方法(特别是 Node)

转载 作者:搜寻专家 更新时间:2023-11-01 00:03:24 24 4
gpt4 key购买 nike

是否可以在一个模块中定义一个可以在另一个模块中调用的自定义require方法?

例如,在x/x.js中

exports.xrequire = function(path) {
console.log("requiring " + path);
require(path);
};

在 y/hello.js 中

console.log("Hello, world!");

然后在 y/y.js 中

var xrequire = require("../x/x.js").xrequire;
xrequire("hello.js");

当 y.js 运行时,应该打印“Hello World”。

我知道这似乎是个坏主意,但我确实有这样做的正当理由。 ;)


此代码的问题在于它尝试加载 x/hello.js,而不是 y/hello.js — 我希望它能像标准要求一样工作。

最佳答案

你当然可以做到这一点。它将成功避免修改全局 require.paths 数组,该数组可以 pose problems在运行时, future 的版本应该不会有问题。

您应该能够简单地将您需要的模型设置到您当前的应用程序中。根据您的示例,x.js 应该包含。

var relative = 'y/';
exports.xrequire = function(path) {
console.log("requiring " + relative + path);
return require(relative+path);
};

然后你就可以成功使用你的自定义require了。

var xrequire = require('x.js'),
hello = xrequire('hello.js');

我不建议这样做,但如果你真的想要偷偷摸摸,你可以覆盖require函数。

var require = xrequire;

如果您打算要求 :D 此功能,我肯定会在您的模块中完整记录此功能,但它确实有效。

编辑:

好吧,您可以测试该文件并回退到 require(如果它不存在)。

var relative = 'y/';
exports.xrequire = function(path) {
var ret;
try{
ret = require(relative+path);
console.log("requiring " + relative + path);
}catch(e){
console.log("requiring " + path);
ret = require(path);
}
return ret;
};

我认为您可以尝试将 process.cwd 添加到要求路径的开头,以强制首先查找正确的目录。老实说,这会让大多数开发人员感到困惑。我建议只为您的应用程序定义一个命名空间,并创建一个特殊的 require 函数,该函数仅检索该命名空间应用程序的特殊功能。

关于javascript - CommonJS 中的自定义 `require` 方法(特别是 Node),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6653765/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com