RequireJS несколько модулей в одном файле

Я хочу объединить несколько модулей в один файл, но я не могу найти официальный документ о том, как это сделать. Теперь я использую метод ниже, он работает, но мне интересно следующее:

  • Это технически правильно?
  • Как RequireJS проверяет, загружен модуль или нет? Используя имя модуля или имя файла?
  • Будет ли это решение инициализировать модули несколько раз в некоторой ситуации?

index.html

<script src="require.js"></script>
<script>
requirejs.config({
    paths: {
        'a': 'test',
        'b': 'test'
    }
});

require(['a', 'b'], function () {
    console.log('a & b loaded');
});
</script>

test.js

console.log('loading test.js');
// I have some init here, like "Avoid `console` errors in IE"

define('a', function () {
    console.log('a module');
});

define('b', function () {
    console.log('b module');
});

Ответы

Ответ 1

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

Единственное, что вам нужно сделать, это использовать named define.

define('module1', ['dependency1', 'dependency2'], function (d1, d2) {
    // your code here
}

Подумайте, что иногда вам не нужно, чтобы ваши ресурсы загружались динамически, так как их загрузка была загружена в начале, на самом деле может потребоваться, и создание одного объединенного/мини-js файла во время упаковки является лучшим решением.

Таким образом, вы не будете использовать "ленивую загрузку", но вы все еще разрабатываете свое приложение модульным способом с помощью RequireJS.

Ответ 2

Шанган прав. В http://requirejs.org/docs/api.html#define есть часть, которая гласит:

Для каждого файла на диске должно быть только одно определение модуля.

Но если вы хотите это сделать, я нашел что-то вроде этого: из официальной документации: http://requirejs.org/docs/api.html#config-bundles

В нем говорится, что вы можете определить, в каком файле вы можете найти, какие модули имеют свойство bundles. Например: у меня есть файл, называемый modules.js с таким контентом:

define('module_one', function(){
    return 'Hello. I am module one';
})

define('module_two', function(){
    return 'Hello. I am module two';
})

Затем в моем файле main.js я делаю что-то вроде этого:

requirejs.config({
    baseUrl : 'modules/',
    bundles: {
        'modules': ['module_one', 'module_two']
    }
})

require(['module_one', 'module_two'], function(moduleOne, moduleTwo){
    alert(moduleOne);
    alert(moduleTwo);
})

И он работает так, как я хочу.

Ответ 3

- это правильно?

НЕТ. Для каждого файла на диске должно быть только одно определение модуля.

как RequireJS проверяет загруженный модуль или нет? используя имя модуля или имя файла?

Использование имени файла.

будет инициализировать несколько раз в некоторой ситуации?

Модули могут быть сгруппированы в оптимизированные пакеты с помощью инструмента оптимизации.

http://requirejs.org/docs/optimization.html

Здесь приведен пример модуля Hello World.

http://mydons.com/requirejs-hello-world/