Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在名为using requireJs的方法中使用node require_Javascript_Node.js_Requirejs_Amd_Commonjs - Fatal编程技术网

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

Javascript 在名为using requireJs的方法中使用node require,javascript,node.js,requirejs,amd,commonjs,Javascript,Node.js,Requirejs,Amd,Commonjs,是否可以在通过requirejs调用的文件中使用默认节点require函数 define(["require", "exports"], function(require, exports) { //... var Schema = require(DaoPublic._schemasDirectory + schemaFilename); } 我总是得到ReferenceError:module未定义,我也尝试使用requireJs加载模式,同样,因为文件本身被编码为CommonJs

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

define(["require", "exports"], function(require, exports) {
  //...
  var Schema = require(DaoPublic._schemasDirectory + schemaFilename);
}
我总是得到
ReferenceError:module未定义
,我也尝试使用requireJs加载模式,同样,因为文件本身被编码为CommonJs,不兼容AMD

有解决办法吗

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

请求的文件(架构)示例:


问题在于,您的代码设置为RequireJS能够自己找到CommonJS模块。但是,当RequireJS在节点中运行并且找不到模块时,它将调用节点的
require
函数,这正是您所需要的。因此,有可能(使用RequireJS)让AMD模块使用Node的
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);
});
define(["require", "exports"], function(require, exports) {
  return require("./schemas/x") + " by way of foo";
});
module.exports = "x";
文件
foo.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);
});
define(["require", "exports"], function(require, exports) {
  return require("./schemas/x") + " by way of foo";
});
module.exports = "x";
文件
schemas/x.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);
});
define(["require", "exports"], function(require, exports) {
  return require("./schemas/x") + " by way of foo";
});
module.exports = "x";
如果您使用
节点test.js运行它,您将在控制台上看到:

x by way of foo
解释 我称之为“概念证明”,因为我没有考虑所有的可能性

paths
设置可以使RequireJS偏离轨道<代码>伪目录
必须是不存在的目录。当RequireJS尝试加载模块
/schemas/x
,它尝试加载文件
/BOGUS/x.js
,但没有找到它。因此它调用节点的
require

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

myRequire
函数在调用节点的require之前更改路径,以在开始处添加
/
。这里的问题是,出于某种原因,RequireJS在给出节点的
require
函数的路径之前将
/schemas/x
转换为
schemas/x
,然后节点将无法找到模块。在路径名的开头加回
/
,可以解决这个问题。我尝试了一大堆路径变体,但都不起作用。一些变体使得RequireJS能够自己找到模块,因此从未尝试调用节点的
require
,或者它们阻止节点找到模块。也许有更好的方法来解决这个问题,我还没有找到。(这就是我之所以称之为“概念证明”的原因之一。)请注意,我设计此函数的目的是仅更改以
模式/
开头的路径

其他可能性
我已经考虑过其他的可能性,但在我看来,它们并不是很有希望。例如,定制
NODE\u PATH
将消除
myRequire
,但这种定制并不总是可行或可取的。

你检查了吗?我读了很多关于requirejs的书,但还没有找到任何东西。我的临时(也许是唯一的解决方案)是创建两个类,而不是一个,一个通过CommonJs使用,另一个通过AMD使用。
ReferenceError
是当代码试图访问未知标识符时出现的错误。在命令行启动Node.js,键入
foo
,您将得到
ReferenceError:foo未定义。您向我们展示的代码中没有提到
模块
变量。如果
ReferenceError
是由您自己的代码引起的,那么请在您的问题中显示哪行代码引起的,并提供一些上下文。我猜您不熟悉CommonJs语法,
module.exports
是使用CommonJs导出代码(class/function/var/…)的方法。因此,在我的
schema.js
文件的末尾,我有
module.exports=schema
,其中
schema
是一个包含模式本身的变量。看这个要点:@Vadorequest这里的问题不是我是否能猜对(我猜对了),而是把你的问题提高到SO的标准。它的表述必须避免人们猜测。首先,一个猜测,不管它是受过教育的还是显而易见的,仍然可能是错误的,这意味着那些根据猜测发布答案的人浪费了他们的时间。第二,如果可能的话,这个问题应该很容易被那些没有专业知识做出有根据的猜测的人理解。通过在问题主体中添加我要求的信息,您可以很容易地做到这一点。对
requireJs
使用的
require
方法进行“黑客攻击”的有趣方式,但这里的问题不同,它确实找到了文件,但无法“解析”它,因为该文件使用了CommonJs符号,而不是预期的AMD。问题是,在AMD文件中,我尝试使用node.js native
require
CommonJs文件来require,但由于它位于AMD文件中,因此失败而不是require文件,如果包含require调用的文件是使用CommonJs加载的,我的答案就是完全解决您在这里的评论中描述的问题。我把第一段改写了一点,以强调一些可能需要更多强调的事情。比如你说“它确实找到了文件”。好的,是的,这正是你必须避免得到想要的结果的原因,也是我的解决方案的作用(阻止RequireJS找到CommonJS模块,让Node来加载它)。我需要RequireJS来查找我的大部分文件,我现在理解了你的解决方案,但我认为这不是一个好主意,这将在其他地方破坏我的代码:/此解决方案旨在仅影响从
/schemas
加载模块,如果需要,可以将此路径更改为其他路径,或根据需要进行深度调整(例如
/schemas/commonjs/
)。根本不清楚为什么它会在应用程序的其他地方引起问题