2011-01-22 4 views
66

Я только начал работать с Require.JS, и я немного неясен в соответствующих случаях, в которых он должен использоваться, а также о правильном способе его использования в этих случаях.Понимание того, когда и как использовать Require.JS

Вот как у меня в настоящее время есть все, что связано с Require.JS. У меня есть две функции: functionA() и functionB(). Обе эти функции требуют дополнительной функции, functionC() для правильной работы.

Я только хочу загрузить функцию C(), когда необходимо, т.е. когда функция A() или функция B() вызывается. Таким образом, у меня есть следующие файлы:

functionC.js

functionC(){ 
    //do stuff 
} 

functionA.js

functionA(){ 
    define(['functionC'],function(){ 
    //functionC() is loaded because it is listed as a dependency, so we can proceed 
    //do some functionA() stuff 
    }); 
} 

functionB.js

functionB(){ 
    define(['functionC'],function(){ 
    //functionC() is loaded because it is listed as a dependency, so we can proceed 
    //do some functionB() stuff 
    }); 
} 

Итак, правильно ли это настроено? И если я в конечном итоге вызываю функции functionA() и functionB() на одной странице, это дополнительная работа, выполняемая, поскольку они оба загружают файл functionsC.js? Если да, то это проблема? И если да, есть ли способ настроить его, чтобы они сначала проверяли, загружен ли файл function.js еще, и загружать его, если он еще не был? Наконец, это подходящее использование Require.JS?

ответ

44

define() следует использовать только для определения модуля. Для приведенного выше примера, где часть кода должна быть динамически загруженным, используя require() является более подходящим:

functionA.js

functionA(){ 
    require(['functionC'],function(functionC){ 
    //use funcC in here to call functionC 
    }); 
} 

Некоторые примечания:

  • require([]) является асинхронным, поэтому, если вызывающий абонент functionA ожидает возвращаемого значения от этой функции, скорее всего, будут ошибки. Лучше, если functionA принимает обратный вызов, который вызывается, когда functionA выполняется с его работой.
  • Вышеупомянутый код будет называть require() за каждый звонок до functionA; однако, после первого вызова, нет штрафа за загрузку functionC.js, он загружается только один раз. В первый раз вызывается require(), он загружает functionC.js, но в остальное время RequireJS знает, что он уже загружен, поэтому он вызовет функцию function(functionC){} без запроса functionC.js.
+1

Спасибо за ваш ответ - это очень помогает. define() vs. require() - это то, о чем мне нужно было разъяснить, а ваши другие два балла действительно помогают. Я думаю, что первый из пунктов с пулями - это то, что мне еще нужно понять лучше - как правильно обрабатывать асинхронный характер RequireJS. – maxedison

21

Вы можете найти подробную информацию о RequireJS и JavaScript модульности здесь: JavaScript modularity with RequireJS (from spaghetti code to ravioli code)

+4

топ-ссылка - прочитав множество руководств, это, безусловно, самое лучшее. ясный и лаконичный.+1 –

+11

Ссылка может теоретически ответить на вопрос, но [было бы желательно] (http://meta.stackexchange.com/q/8259) включить здесь основные части ответа и предоставить ссылку для справки. – JJJ