在一个名为using requireJs的方法中使用node require

Use node require inside a method called using requireJs

本文关键字:方法 require node requireJs using 一个      更新时间:2023-09-26

是否可以在通过requirejs调用的文件中使用默认节点require函数?

define(["require", "exports"], function(require, exports) {
  //...
  var Schema = require(DaoPublic._schemasDirectory + schemaFilename);
}

我总是得到ReferenceError: module is not defined,我也试图使用requireJs加载模式,相同的,因为文件本身被编码为CommonJs,而不是AMD兼容。

解决方案吗?

请注意,加载的模式是在CommonJS中,我需要保持这种方式,因为它被几个DAO使用,一些在AMD和其他在CommonJS中。(有趣的部分)

请求的文件(schema)示例:

var userSchema = {
    /**
     * User Login, used as id to connect between all our platforms.
     */
    login: {
        type: String,
        match: /^[a-zA-Z0-9_-]+$/,
        trim: true,
        required: true,
        notEmpty: true,
        unique: true,
        check: {
            minLength: 4,
            maxLength: 16
        }
    }
};
module.exports = userSchema;

问题是你的代码设置使RequireJS 能够自己找到CommonJS模块。但是,当RequireJS在Node中运行并且找不到模块时,它将调用Node的require函数,这就是您需要的。所以它是可能的(与RequireJS)有一个AMD模块使用节点的require,但诀窍是让RequireJS不看到模块放在首位。

概念证明

这是一个概念证明。主文件名为test.js:

var requirejs = require("requirejs");
function myRequire(path) {
    if (path.lastIndexOf("schemas/", 0) === 0)
        path = "./" + path;
    return require(path);
}
requirejs.config({
    paths: {
        "schemas": "BOGUS"
    },
    nodeRequire: myRequire
});
requirejs(['foo'], function (foo) {
    console.log(foo);
});

文件foo.js:

define(["require", "exports"], function(require, exports) {
  return require("./schemas/x") + " by way of foo";
});

文件schemas/x.js:

module.exports = "x";

如果您使用node test.js运行它,您将进入控制台:

x by way of foo

解释

我称之为"概念验证",因为我没有考虑到所有的可能性。

paths设置是为了使RequireJS偏离轨道。BOGUS必须为不存在的目录。当RequireJS试图加载模块./schemas/x时,它试图加载文件./BOGUS/x.js,但没有找到它。所以它调用Node的require

nodeRequire设置告诉RequireJS Node的require函数是myRequire。这是一个有用的谎言。

myRequire函数在调用Node的require之前更改路径以在开始时添加./。这里的问题是,由于某种原因,RequireJS在给出Node的require函数的路径之前将./schemas/x转换为schemas/x,然后Node将无法找到该模块。在路径名的开头添加./可以修复这个问题。我尝试了一大堆路径变体,但没有一个有效。一些变体是这样的,RequireJS能够自己找到模块,因此从未尝试调用Node的require,或者它们阻止Node找到模块。也许有更好的方法来解决这个问题,但我还没有找到。(这也是我称之为"概念验证"的原因之一。)注意,我把这个函数设计成只修改以schemas/开头的路径。

其他可能性

我已经考虑过其他的可能性,但它们对我来说似乎不是很有希望。例如,自定义NODE_PATH将消除myRequire,但这种自定义并不总是可行或可取的。