require.js 需要具有 index.js 的模块

require.js require a module with index.js

所以我正在尝试设置 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 这是一个模块吗?

RequireJS 不会自动检查 index.js 是否存在并将其加载为您的模块。你需要告诉 RequireJS 当你想加载 someModule 时,它应该加载 someModule/index。我在 require.config:

的调用中设置了 map
require.config({
  [ ... ]
  map: {
    '*': {
        someModule: 'someModule/index',
    }
  },
});

您必须调整您在此处提供的名称,使其成为相对于您的 baseUrl 的路径。从您在问题中提供的信息中不清楚它应该是什么。

(郑重声明,还有一个 packages 设置,你可以调整它来做你想做的事情,但是把一些东西 packages 说 "this is a package",这不是你看起来的样子在这里。所以我不会用它来做你想做的事。)

我也不喜欢 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'
   }
});

要阅读有关如何编写插件的所有方面,read the docs at requirejs.org。最简单的版本是重写您尝试访问的请求 "module" 的 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);
                });
            }
        };
    });
})();

这不是生产代码,它只是一种简单的方式来证明需要配置并不是为了解决这样的问题。