在使用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但是这样的定制并不总是可行或可取的。