使用requirejs仅下载所需的js文件

时间:2015-09-18 13:29:02

标签: javascript backbone.js require

我正在开发一个应用程序,我在前端使用了requirejs和backbone。

我已配置requirejs来加载所有js文件。

我的main.js文件看起来像这样:

require.config({
    baseUrl: 'js',
    paths: {
        "jquery": 'lib/jquery',
        "jquery.ui.widget" : "lib/jquery.ui.widget",
        "jquery.knob" : "lib/jquery.knob",
        "jquery.iframe-transport" : "lib/jquery.iframe-transport",
        "jquery.fileupload" : "lib/jquery.fileupload",
        "socket" : "lib/socket.io",
        "handlebars": 'lib/handlebars',
        "underscore": 'lib/underscore',
        "bootstrap" : 'lib/bootstrap',
        "backbone": 'lib/backbone',
        "views" : "views",
        "models" : "models",
        "collections" : "collections",
        "text" : "lib/helper/text"
    }
});

require(['jquery',
         'handlebars',
         'underscore',
         'backbone',
         'login',
         'jquery.ui.widget',
         'jquery.knob',
         'jquery.iframe-transport',
         'jquery.fileupload',
        ],function($,
                    Handlebars,
                    _,
                    Backbone,
                    Login){
    Login();
}); 

我的登录文件如下所示:

define(function(require){
    return function(){
        var LoginView = require("views/login_view");
        $("#createAccount").click(function(){           
            $("#signInContainer").addClass("hide");
            $("#register").removeClass("hide");
        });
        var view = new LoginView({el : "body"});
    }
});

视图对象是Backbone.View对象,其开始如下:

define(function(require){
    var User = require("models/user");
    var Dashboard = require("views/dashboard");

  //... rest of the code

}

Login_view.js文件中还包含2个其他js文件。

同样,登录后将要调用的所有其他页面中也包含这样的require语句。

问题是: 当页面加载时,所有这些嵌套的需求都会被下载。 例如。在登录所需的Dashboard js文件中的require语句也会被下载。

我想要一个解决方案,我希望只下载初始文件。仅当我想要实例化仪表板对象时,才应下载仪表板内的文件。

1 个答案:

答案 0 :(得分:0)

您需要更改代码逻辑,并使用requireJS仅按需请求js文件。请参阅以下示例,该示例在用户单击页面中的元素时加载仪表板。

define(function(require){
    var User = require("models/user");  

  //...my code
 //ex on user click
 $("#myElement").on("click",function(){

     require(["views/dashboard"],function(Dashboard){

       //code for Dashboard here
     });
 });

}