在使用requireJs的方法中使用node require
是否可以在通过requirejs
调用的文件中使用默认节点require
函数?
define(["require", "exports"], function(require, exports) { //... var Schema = require(DaoPublic._schemasDirectory + schemaFilename); }
我总是得到ReferenceError: module is not defined
,我也尝试使用requireJs加载模式,因为文件本身被编码为CommonJs,而不是AMD兼容的。
任何解决scheme
请注意,加载的模式是在CommonJS,我需要保持这种方式,因为它是由几个DAO,一些在AMD和CommonJs中使用。 (有趣的部分)
请求文件(模式)的示例:
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 能够自己findCommonJS模块。 但是,当RequireJS在Node中运行并且找不到模块时,它将调用Node的require
函数,这正是您所需要的。 所以有可能(与RequireJS)有一个AMD模块使用Node的require
但诀窍是让RequireJS看不到模块摆在首位。
概念validation
这是一个概念的certificate。 名为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
说明
我把这称为“概念certificate”,因为我没有考虑到所有的可能性。
paths
设置是在那里把RequireJS抛出轨道。 BOGUS
必须是一个不存在的目录。 当RequireJS尝试加载模块./schemas/x
,它会尝试加载./BOGUS/x.js
文件,但没有find它。 所以它调用Node的require
。
nodeRequire
设置告诉RequireJS Node的require
函数是myRequire
。 这是一个有用的谎言。
在调用Node的require之前, myRequire
函数改变了在开始时添加./
的path。 这里的问题是由于某些原因,RequireJS将./schemas/x
转换为schemas/x
然后它给出Node的require
函数的path,然后Node将无法find该模块。 在path名称的开头添加./
将修复此问题。 我已经尝试了一大堆path变体,但都没有工作。 有些变体是这样的:RequireJS能够自己find模块,因此从来没有尝试过调用Node的require
或者阻止Nodefind模块。 可能有更好的方法来解决这个问题,我没有find。 (这是我称之为“概念validation”的一个原因。)请注意,我devise的这个函数只改变以schemas/
开头的path。
其他可能性
我已经看过其他的可能性,但他们并没有看起来很有希望。 例如,定制NODE_PATH
将消除myRequire
但是这样的定制并不总是可行或可取的。