3

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——我希望它与标准要求一样工作。

4

2 回答 2

1

你当然可以做到这一点。它将成功避免修改可能在运行时造成问题require.paths的全局数组,并且不应该在未来的版本中出现问题。

您应该能够简单地设置一个模型,您可以将其简单地require放入您当前的应用程序中。根据您的示例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;

如果您打算require: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 路径的开头以强制首先查看正确的目录。老实说,这会让大多数开发人员感到困惑。我建议只为您的应用程序定义一个命名空间并创建一个特殊的 require 函数,该函数仅检索该命名空间应用程序的特殊功能。

于 2011-07-11T18:09:47.213 回答
0

CommonJs 模块规范要求require命名require,并使用字符串字面量调用,以允许构建工具预加载模块。

一个特定的实现可能允许你做你想做的事,但它可能会在另一个实现上失败,或者当你升级时。

编辑:以上内容来自我在学习 commonJS 模块时的回忆——在规范中似乎没有这样定义。

于 2011-07-11T17:29:20.157 回答