2013-08-19 3 views
14

Я хочу объединить несколько модулей в один файл, но я не могу найти официальный документ о том, как это сделать. Теперь я использую метод ниже, он работает, но мне интересно: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'); 
}); 

ответ

0

правильно?

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

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

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

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

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

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

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

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

+0

Спасибо, но я использую PHP-шаблон, у которого есть какой-то гнездовой JS-вызов, поэтому оптимизация выглядит сложной для меня, во всяком случае, я проголосую –

+2

Только один модуль для каждого файла рекомендуется практиковать, но это не делает 2 или больше всегда неправильно. «НЕТ» в этом ответе кажется слишком предписывающим для меня. Я думаю, что AlexCode на деньги. Как и большинство вещей, ключ должен понять, почему 1 на модуль рекомендуется - я считаю, что это позволяет эффективно использовать оптимизатор r.js. У нас есть причины не использовать r.js, так как у нас есть своя стратегия оптимизации. Загрузка нескольких модулей на файл (в нашем случае, построенная на стороне сервера, а затем доставка из одного запроса Ajax) является частью нашей пользовательской оптимизации. Его «покупатель остерегается». –

+1

Да, конечно, у меня будут файлы milion, каждый из которых содержит 10 строк производного модуля. Я думал, что RequireJS обещал эффективность ... –

8

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

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

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

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

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

+1

Но как загрузить этот файл? –

8

Шанган справа. В 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); 
}) 

И это работает как Я хочу.

+0

Поскольку вы уже определили «модули» пакета, можете ли вы напрямую потребовать этот пакет? Как 'require (['bundle1']);'? – benjaminz

+0

Вы имеете в виду что-то вроде: 'require (['modules'])'? Это не сработает, потому что _modules_ является именем файла, а '['module_one']' является именем модуля в этом файле. Вот как я это понимаю, но я могу ошибаться. – Prusdrum