Ошибка прерывистой нагрузки - программирование
Подтвердить что ты не робот

Ошибка прерывистой нагрузки

У меня довольно большой проект Backbone.js, который использует RequireJS. По мере роста размера проекта ( "размер" здесь ссылался на количество отдельных файлов модулей) возникали прерывистые ошибки. Большую часть времени это ошибка объекта:

Uncaught TypeError: object is not a function

Иногда он жалуется на то, что модуль не загружается.

Эти ошибки исчезают после запуска проекта через оптимизатор r.js. Они происходят только тогда, когда RequireJS загружает отдельные модули.

Это подводит меня к моему вопросу - не возникает ли у RequireJS проблемы с загрузкой модулей во времени, когда количество модулей достигает определенного номера?

4b9b3361

Ответ 2

Это определенно ошибка, с которой я столкнулся много за последние несколько дней. Загрузка одного модуля может привести к тому, что второй полностью несвязанный модуль в другой части приложения станет undefined, где он работал отлично. Я многократно использовал RequireJS - это не проблема загрузки или круговой зависимости script. Сначала я чаще всего сталкивался с ошибкой, когда мне требовался текстовый файл в представлении 2-го уровня, который повторяется несколько раз (1800 +):

domReady -calls-> new View1() -iterates-> new SubView() -depends-> text!template
         -calls-> new View2() --> undefined!

Это приведет к тому, что полностью не связанный модуль в другом месте станет undefined. Я некоторое время работал над этим, интегрируя функциональные возможности SubView в модуль View.

domReady -calls-> new CombinedView1() -depends-> text!template
         -calls-> new View2() --> ... all good ...

По мере того как проект вырос, я снова ударил по стене и действительно должен найти способ его исправить. Включение большего количества модулей приводит к тому, что ранее определенные становятся undefined случайным. Требование не вызывает ошибок, и браузер не работает. Я не использую CoffeeScript или что-то в этом роде.

Я потратил некоторое время на создание версии моего приложения, имеющей ту же структуру модулей и зависимостей, что и зависимые виды, модели и коллекции. Это работает отлично, поэтому я могу только предположить, что есть какая-то проблема с памятью? Однако Chrome никогда не вызывает ошибок.

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

Использование Require v2.0.1, поэтому никакие плагины заказа и зависимости от них не настроены с помощью директивы shim config. Загрузка модулей без AMD:

  • Магистральные
  • Подчеркивание
  • JQuery
  • Усы
  • Буклет
  • Bootstrap

P.S. Извиняюсь, если это не в нужном месте. Я думал, что это будет лучше, чем комментарий, но я, честно говоря, не могу увидеть кнопку комментария где угодно.

Update: Эта структура зависимостей последовательно разрывается:

Main
  - View 1
      - text!...
      - View 2
         - text!...

Подстановка текста пустыми строками отлично работает каждый раз:

Main
  - View 1
      - View 2

Итак, почему ожидает, что текст загрузит причину View 1, чтобы стать undefined, когда он явно задан как зависимость в основном модуле? Неужели Main не следует вызывать до тех пор, пока не загрузится все, что зависит от него?

Ответ 3

Я сражался с той же проблемой в последние дни, и вот что я узнал:

По-видимому, вложенная структура зависимостей, требующая шаблонов с помощью плагина text.js, может вызвать условие гонки, которое позволяет модулю верхнего уровня не быть готовым, если это требуется. Я столкнулся с этой проблемой, когда у меня было несколько структур зависимостей вложенных модулей этого типа:

Router
  -> View1
    -> text!.../view1.html
    -> View2
      -> text!.../view2.html
  -> View3
    -> text!.../view3.html
    -> View4
      -> text!.../view4.html
  -> View5
    -> text!.../view5.html
    -> View6
      -> text!.../view6.html
  -> View7
    -> text!.../view7.html
    -> View8
      -> text!.../view8.html

Имея эту структуру, я получил TypeErrors как "View1 не является конструктором", когда маршрутизатор пытается создать экземпляры.

Также требуя, чтобы шаблоны вложенных представлений в представлениях верхнего уровня решили проблему для меня:

Router
  -> View1
    -> text!.../view1.html
    -> text!.../view2.html
    -> View2
      -> text!.../view2.html
  -> View3
    -> text!.../view3.html
    -> text!.../view4.html
    -> View4
      -> text!.../view4.html
  -> View5
    -> text!.../view5.html
    -> text!.../view6.html
    -> View6
      -> text!.../view6.html
  -> View7
    -> text!.../view7.html
    -> text!.../view8.html
    -> View8
      -> text!.../view8.html

Я не знаю, как работает require.js, но это выглядит для меня как вложенный вложенный текст! вызовы не рассматриваются, когда установлен некоторый флаг "ready" для родительского модуля.