在一个名为using requireJs的方法中使用node require
Use node require inside a method called using requireJs
是否可以在通过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
,但这种自定义并不总是可行或可取的。
- electronic BrowserWindow的最小高度和宽度在hide()show()方法之后不起作用
- 有没有任何方法可以将控制器从文件加载到ui路由器$stateProvider中
- 数组在递归方法中设置为null
- 打破承诺链的好方法是什么
- 在使用Polymer'加载所有json文件后执行方法;s的核心ajax
- 使用“;这个“;JavaScript原型方法中的关键字
- 序列化数据属性中对象的最可靠方法
- 不能从 Backbone.View 的方法调用 Backbone.collection 的方法,其中包含 require
- 动态更改测试中代码覆盖率的require语句的更好方法
- Webpack require 方法返回意外的对象
- emberJS正在挤压nwJS require()方法
- javascript中的Require方法
- require js中的Access方法
- PHP include/require方法的路径是可变的
- React-Native:使用require()访问文件中的方法
- 在Firefox插件中有多个js文件,可以有require方法
- 如何使用require()和导出从函数实例化的对象,以及原型方法
- 使用Require JS扩展主干对象的正确方法
- 在一个名为using requireJs的方法中使用node require
- 在CommonJS中自定义' require '方法(特别是Node)