2017-01-23 11 views
4

Так что я пытаюсь настроить TypScript и Chutzpah для целей тестирования. Машинопись настроена на выход в следующем формате:require.js требуется модуль с index.js

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

Который работает нормально, проблема возникает, когда someModule фактически является каталог с index.js.

/app 
    app.js 
    /someModule 
    index.js 

require.js не может решить someModule таким образом, и тест не удался.

Есть ли способ сказать require.js, что это модуль?

ответ

2

RequireJS не будет автоматически проверять наличие index.js и загружать его в качестве вашего модуля. Вы должны указать RequireJS, что, когда вы хотите загрузить someModule, он должен загрузить someModule/index. Я бы установить в моем призыве к map к require.config:

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

Вы должны настроить имя вы даете там так, что путь по отношению к вашим baseUrl. Из информации, которую вы даете в своем вопросе, неясно, каково это должно быть.

(Для записи, есть также packages параметр, который вы могли бы, вероятно, настроить, чтобы сделать то, что вы хотите, но положить что-то packages говорит «это пакет», который не то, что вы, кажется, есть здесь. Так что я бы не стал используйте его для того, что вы пытаетесь сделать.)

+0

Отлично, спасибо! Есть ли способ сделать это динамически или каждый пакет, который я использую, имеет индекс, который нужно определить здесь? –

+2

Вам нужно сделать это для каждого модуля. Нет поддержки, чтобы включить это в какой-то динамический способ или использовать сопоставление шаблонов.'' * '', Который вы можете использовать в' map', - это действительно жесткое имя, которое означает «во всех модулях», и оно является значимым только как ключ самой «карты» и нигде больше. 'map' не понимал бы такие вещи, как' foo * ', и вы не могли бы сделать что-то вроде' map: {'*': {'*': '...'}} 'Второй' * 'будет интерпретироваться буквально RequireJS как «модуль с именем' * '», а не как «все модули». – Louis

+0

Это не работает для меня, не знаю почему. Требовать игнорировать настройку карты – Tyguy7

1

Мне тоже не понравилась конфигурация в map. Самый простой способ, которым я это сделал, - написать плагин для требуемого.

Давайте назовем плагин 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); 
       }); 
      } 
     }; 
    }); 
})(); 

Это не код производства, это просто простой способ, чтобы продемонстрировать, что требует конфигурация не была предназначена для решения таких проблем, как это.

 Смежные вопросы

  • Нет связанных вопросов^_^