【问题标题】:require.js require a module with index.jsrequire.js 需要一个带有 index.js 的模块
【发布时间】:2017-06-08 13:38:44
【问题描述】:

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

【问题讨论】:

    标签: javascript typescript requirejs chutzpah


    【解决方案1】:

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

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

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

    (作为记录,还有一个 packages 设置,您可能可以调整它以做您想做的事情,但放置一些 packages 表示“这是一个包”,这不是您在这里所拥有的。所以我不会用它来做你想做的事。)

    【讨论】:

    • 完美,谢谢!有什么方法可以动态地做到这一点,或者我使用的每个有索引的包都需要在这里定义吗?
    • 您需要为每个模块都这样做。不支持以某种动态方式打开它或使用模式匹配。您可以在map 中使用的'*' 是一个真正的硬编码名称,意思是“在所有模块中”,它仅作为map 本身的键重要,在其他任何地方都没有。 map 不会理解像 foo* 这样的东西,你也不能做像 map: { '*': { '*': '...'}} 这样的事情 第二个 * 会被 RequireJS 逐字解释为“一个名为 * 的模块”,而不是“所有模块”。
    • 这对我不起作用,不知道为什么。 Require 忽略地图设置
    • 我认为如果你的索引导出了模块/包的所有特性,packages 配置就是你想要的。对我来说,map 不起作用,因为我的index.js 具有本地依赖项,然后将其更改为someModule/index/dep,尽管它们应该保持为someModule/dep。对我来说packages:[{name: 'someModule', main: 'index'}] 就像一个魅力。 (也适用于例如subdir/someModule
    【解决方案2】:

    我也不喜欢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。最简单的版本是只重写您尝试访问的请求“模块”的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);
                    });
                }
            };
        });
    })();
    

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

    【讨论】:

      猜你喜欢
      • 2014-06-15
      • 1970-01-01
      • 2013-10-17
      • 1970-01-01
      • 1970-01-01
      • 2014-05-30
      • 2017-04-10
      • 1970-01-01
      • 2017-01-27
      相关资源
      最近更新 更多