require.js需要一个带index.js的模块

时间:2017-01-23 22:11:14

标签: javascript typescript requirejs chutzpah

所以我试图设置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 个答案:

答案 0 :(得分:3)

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

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

您必须调整您在那里提供的名称,使其成为相对于baseUrl的路径。从你在问题中提供的信息中得知它应该是什么,这一点并不清楚。

(为了记录,还有一个packages设置,您可以调整以执行您想要的操作,但放置一些packages说"这是一个包&#34 ;,这不是你在这里看到的。所以我不会用它来做你想做的事。)

答案 1 :(得分: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 = { .. };
});

因此,假设您在需要的配置中设置了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。最简单的版本是重写所请求的"模块的name"您正尝试访问并将其传递回load

应用程序/插件/ 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);
                });
            }
        };
    });
})();

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