Requirejs 定义命名模块并同时要求它

Requirejs 定义命名模块并同时要求它,requirejs,Requirejs,在我的应用程序中,我希望以编程方式创建命名模块,并在使用define访问它时使用它。简化形式如下所示: define("myModule", [], function() { return { myModule: true }; }); var obj = require('myModule'); 虽然我没有看到任何问题,但它为什么不能以这种方式工作,require.js肯定会这样做,并表示: MODULE NAME ... HAS NOT BEEN LOADE

在我的应用程序中,我希望以编程方式创建命名模块,并在使用define访问它时使用它。简化形式如下所示:

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

  • 为RequireJS创建一个并行系统。类似这样的工作原理:

      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进行请求

    此代码仅用于说明目的。这离成为一个普遍的解决方案还差得远


  • 感谢您的解释和提供可能的解决方案。第一个选择很好。再次感谢你。