这是可能的,但取决于您如何构建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) {
require(['BooksArea'], function(BooksArea) {
})
}
},
...
这是非常朴素的伪代码。你可能需要编写一些通用代码来处理仍需要加载依赖项和错误处理等路由,但重要的概念是你需要在应用程序/路由器开始之前定义路由 - 然后你需要异步代码来处理获取模块。