Requirejs 定义命名模块并同时要求它
在我的应用程序中,我希望以编程方式创建命名模块,并在使用define访问它时使用它。简化形式如下所示:Requirejs 定义命名模块并同时要求它,requirejs,Requirejs,在我的应用程序中,我希望以编程方式创建命名模块,并在使用define访问它时使用它。简化形式如下所示: define("myModule", [], function() { return { myModule: true }; }); var obj = require('myModule'); 虽然我没有看到任何问题,但它为什么不能以这种方式工作,require.js肯定会这样做,并表示: MODULE NAME ... HAS NOT BEEN LOADE
define("myModule", [], function() {
return {
myModule: true
};
});
var obj = require('myModule');
虽然我没有看到任何问题,但它为什么不能以这种方式工作,require.js肯定会这样做,并表示:
MODULE NAME ... HAS NOT BEEN LOADED YET FOR CONTEXT: ...
如果我按照以下方式更改代码,它将起作用:
define("myModule", [], function() {
return {
myModule: true
};
});
require(['myModule'], function(obj){
});
但现在它是异步代码,我不希望这样。require的形式看起来是同步的,它实际上只是允许以更像CommonJS的风格编写代码,并帮助将CommonJS代码移植到RequireJS。不幸的是,它生成的错误消息没有正确地指示问题的性质。这种形式的
require
工作正常,只要模块已经定义和初始化,就会返回模块。如果尚未定义和初始化,则会失败。由于这种形式的require
不会初始化模块,因此必须使用异步形式来初始化模块
我认为这不会改变。截至去年7月,James Burke(RequireJS的首席开发人员)已经表示,支持同步动态加载脚本的方法有很多种
我可以看到两种方法:
require
调用中,该调用加载要使用的所有模块var foo=require('foo')代码>。我知道你提到想要避免异步调用,但你没有说明你想要避免的是异步require
调用是否在你的应用程序中传播。我在这里建议的是使用一个异步require
调用来启动应用程序:
require(['main', 'myModule', ... other modules ...], function (main) {
main();
});
假设main
模块是应用程序的主要入口点,那么您可以在应用程序代码中的任何地方执行var myModule=require('myModule')代码>因为保证在执行看起来像同步的require
之前定义并初始化了myModule
var syncmap = Object.create(null);
function syncdefine(name, factory) {
var mod = factory();
syncmap[name] = mod;
define(name, mod);
}
function syncrequire(name) {
return syncmap[name];
}
syncdefine("myModule", function () {
return {
myModule: true
};
});
console.log("outside", syncrequire("myModule").myModule);
require(["myModule"], function (mm) {
console.log("inside", mm.myModule);
});
syncdefine
函数为RequireJS定义了一个模块,可直接用于syncrequire
。调用syncrequire
立即返回模块。也可以通过RequireJS'require
call进行请求
此代码仅用于说明目的。这离成为一个普遍的解决方案还差得远感谢您的解释和提供可能的解决方案。第一个选择很好。再次感谢你。