является require.js правильным инструментом (для работы) для обычных веб-сайтов"

Я начал создавать веб-сайт и использовал Require.js для выборочной загрузки сценариев, которые мне нужны для реализации функциональности. Что я испытываю:

  • «основной» скрипт не завершил выполнение (или даже загрузку) до того, как часть моего кода использует «require» для загрузки зависимостей. Это означает, что конфигурация require.js не запущена и не знает местонахождения моих скриптов.
  • поскольку конфигурация require.js не была запущена к тому времени, когда мой код должен был ее использовать, механизм «прокладки» не был инициализирован и не может быть использован.

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

Это кажется полезным для одностраничных приложений или приложений node.js, но не для традиционных сайтов, где другие сценарии могут выполняться до инициализации require.js.

Если require.js не подходит для этой работы, есть ли подходящий инструмент для этой работы? Если да, то что?


person Nippysaurus    schedule 01.08.2012    source источник


Ответы (1)


Вы загружаете скрипт require.js асинхронно (с async='async')? Вы хотите, чтобы requirejs загружались синхронно. Как только он будет загружен, он будет асинхронно загружать другие скрипты, такие как файл main.js. Все они могут загружаться не по порядку, но на самом деле код будет выполняться в правильном порядке (с учетом объявленных зависимостей).

Итак, в шаблоне вашей страницы у вас будет следующее:

<script src="/Scripts/require.js" type="text/javascript" data-main="main.js"></script>

Это загрузит RequireJS, и как только он загрузится, он начнет загружать ваш main.js асинхронно. Обычно main.js не определяет никаких модулей, он просто использует модули, определенные в других файлах. Эти зависимости перечислены в вызове require():

require(["moduleA", "moduleB"], function(A, B){
  // Do something with A and B
  A.someFunction();
  B.someOtherFunction();
});

Файлы moduleA.js и moduleB.js должны заключать свое содержимое в файл define(). В moduleA.js (зависит от модуля C):

define(["moduleC"], function () {
  // Build up an A
  var A = ....;

  return A;
});

Теперь мне интересно, оборачиваете ли вы свои модули в вызов define. Невыполнение этого может объяснить неупорядоченное выполнение, которое вы испытываете.

RequireJS — это прекрасно работающий инструмент на традиционном сайте, а не только на одностраничном.

person Carl Raymond    schedule 01.08.2012
comment
Нет я не. Кажется, я не могу найти в Интернете никаких примеров, показывающих, о чем вы говорите. Не могли бы вы отправить меня в правильном направлении? - person Nippysaurus; 01.08.2012
comment
Я думаю, вы можете быть правы насчет упаковки моих модулей в файле define. Все еще не знаю, что вы подразумеваете под async='async'. - person Nippysaurus; 02.08.2012
comment
Это атрибут тега ‹script› в HTML5, который загружает файл сценария, не блокируя обработку остальной части разметки страницы. Вы не хотите делать это с RequireJS, и вы этого не сделаете. - person Carl Raymond; 02.08.2012
comment
Я использовал LAB.js для загрузки скриптов вместо Require.js, но я собираюсь предположить, что правильная инкапсуляция моего кода в виде модуля решит проблемы, с которыми я сталкивался. Я отмечаю этот ответ как правильный ответ на этом основании. Спасибо за помощь, Карл, очень признателен :-) - person Nippysaurus; 02.08.2012