使用require.js来加载index.js模块

6

我正在尝试为测试目的设置Typescript和Chutzpah。Typescript已经设置成输出以下格式:

define(['require', 'exports', './someModule'], function(require, exports, someModule) {
    //examplecode
});

这个代码可以正常工作,但当someModule实际上是一个带有index.js的目录时就会出现问题。

/app
  app.js
  /someModule
    index.js

require.js无法通过这种方式解析someModule,导致测试失败。

有没有办法告诉require.js这是一个模块?

2个回答

3

RequireJS不会自动检查index.js的存在并将其作为模块加载。您需要告诉RequireJS,当您想要加载someModule时,它应该加载someModule/index。我会在调用require.config时设置一个map

require.config({
  [ ... ]
  map: {
    '*': {
        someModule: 'someModule/index',
    }
  },
});

你需要调整你给的名称,以便它是相对于你的baseUrl的路径。从你提供的信息中并不清楚它应该是什么。
(值得一提的是,还有一个packages设置,你可能可以调整它来实现你想要的效果,但是将某些东西放在packages中意味着“这是一个包”,这不是你这里所需要的。所以我不会用它来做你想要做的事情。)

完美,谢谢!有没有办法动态地做到这一点,或者我使用的每个具有索引的包都需要在这里定义? - Devan Buggay
2
你需要为每个模块都这样做。没有支持以某种动态方式打开它或使用模式匹配。在map中可以使用的 ' * ' 实际上是一个硬编码的名称,表示“在所有模块中”,仅在map本身作为键时才有意义,在其他任何地方都不是。map不会理解像 foo* 这样的东西,也不能像 map:{ '*': { '*': '...' } } 这样做。第二个 * 将被 RequireJS 解释为“名为 * 的模块”,而不是“所有模块”。 - Louis
这对我不起作用,不确定原因。Require忽略了地图设置。 - Tyguy7
我认为如果你的索引导出了模块/包的所有功能,那么“packages”配置就是你想要的。对我来说,“map”不起作用,因为我的“index.js”有本地依赖项,然后这些依赖项被更改为“someModule/index/dep”,尽管它们应该保持为“someModule/dep”。对我来说,“packages:[{name:'someModule',main:'index'}]”非常好用。(也适用于例如“subdir/someModule”) - Neonit

1
我不喜欢map中的配置。我实现这个最简单的方法是编写一个用于require的插件。
让我们把这个插件命名为mod,在使用时它可以被称为mod!module/someModule,你也可以根据自己的需要将其称为index,例如index!module/someModule
define(function(require, exports, module) {
   // loading module/someModule/index.js with `mod!`      
   var someModule = require('mod!module/someModule');

   // whatever this is about ..
   module.exports = { .. };
});

假设您在 require 的配置中设置了 paths,并具有某种项目结构:
- app
  - modules
    - someModule/index.js        // the index we want to load
    - someModule/..
    - someModule/..
    - etc
  - plugins
    - mod.js                     // plugin to load a module with index.js

需要配置:
require.config({
   paths: {
      'module': 'app/modules',

      // the plugin we're going to use so 
      // require knows what mod! stands for
      'mod': 'app/plugins/mod.js'
   }
});

要了解如何编写插件的所有方面,请阅读requirejs.org上的文档。最简单的版本是只需重写您尝试访问的“模块”的name并将其传递回load

app/plugins/mod.js

(function() {
    define(function () {
        function parse(name, req) {
            return req.toUrl(name + '/index.js');
        }

        return {
            normalize: function(name, normalize) {
                return normalize(name);
            },
            load:function (name, req, load) {
                req([parse(name, req)], function(o) {
                    load(o);
                });
            }
        };
    });
})();

这不是生产代码,只是一种简单的演示方式,以说明需要配置并不能解决这样的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接