Это возможно, но сильно зависит от того, как вы структурируете свое JS-приложение. Кроме того, я предполагаю, что у вас есть приложение Backbone. Существуют разные подходы для разных фреймворков.
Например, у вас может быть app.js
, который выглядит примерно так:
define([
'DvdItemView', 'DvdModel', 'DvdCollection',
'BookItemView', 'BookModel', 'BookCollection'
], function(DvdView, DvdModel, DvdCol, BookView, BookModel, BookCol) {
// router declarations go here
});
Поскольку вы «определяете» этот модуль как зависящий от вышеуказанных модулей, они всегда будут загружаться перед запуском кода маршрутизатора. Как указывает @alexndm, если вы запустите r.js, вы сможете объединить все свои модули в один.
Однако, как вы упомянули, как только приложение достигает определенного размера, вам нужно лениво загружать разные части в зависимости от того, с чем взаимодействует пользователь. Это больше проблема приложения, и RequireJS может только помочь вам в этом отношении. Я считаю, что лучший способ сделать это в маршрутизаторе.
routes: {
'/books': 'booksList',
'/books/:id': 'booksDetail',
'/dvds': 'dvdList',
'/dvds/:id': 'dvdDetail'
},
booksList: function() {
if (!booksDepsLoaded) {
// Here we go and load the appropriate files
require(['BooksArea'], function(BooksArea) {
// BooksArea.Model, BooksArea.Collection, etc...
// do stuff to render a book list..
})
}
},
...
Это очень наивный псевдокод. Скорее всего, вы захотите написать какой-нибудь общий код для обработки маршрутов, для которых по-прежнему требуется загрузка зависимостей, обработка ошибок и т. д.
Тем не менее, важная концепция заключается в том, что вам нужно определить маршруты до запуска приложения/маршрутизатора, а затем вам нужен асинхронный код для обработки модулей выборки.
person
Jon Jaques
schedule
30.12.2013