【问题标题】:jquery/jqueryui/jquerymobile not loading fast enough in backbone.js appjquery/jqueryui/jquerymobile 在backbone.js 应用程序中加载速度不够快
【发布时间】:2012-11-08 23:38:02
【问题描述】:

在本地,应用程序运行良好,一旦它在服务器上大约 50% 的时间 jquery 库加载速度不够快,并且应用程序会为任何与 jquery 相关的内容抛出一堆未定义的 js 错误。我正在使用带有 jquery、jquery mobile、jquery ui 和 required.js 的主干.js。 require js 文件看起来是否正确,或者有没有办法在启动应用程序之前判断脚本是否已加载?

require.config({

paths: {
    jquery: 'libs/jquery/jquery-1.7.2',
'jquery.ui':'libs/jquery-ui/jquery-ui-1.8.14.custom',
    'jquery.mobile-config': 'libs/jqm/jquery.mobile-config',
    'jquery.mobile': 'libs/jqm/jquery.mobile-1.1.1',
    underscore: 'libs/underscore/underscore-1.3.3',
    backbone: 'libs/backbone/backbone-amd-0.9.2',
text: 'libs/require/text',
    templates: '../templates'
},

shim: {
    'underscore': {
        exports: "_"
    },
    'backbone': {
        deps: ['jquery','underscore'],
        exports: 'Backbone'
    },
    'jquery.ui': {
        deps:['jquery']
    },
    'jquery.mobile-config': {
        deps: ['jquery']
    },
    'jquery.mobile': {
        deps:['jquery','jquery.mobile-config']
    },
    'bundles': {
        deps:['jquery','jquery.mobile','validate','jquery.ui']
    },
},

waitSeconds: 5

});

require([
    'app'
], function(App) {
    $(function() {
        clearInitialLoader();
        App.initialize();
    });
});

【问题讨论】:

    标签: jquery jquery-ui jquery-mobile backbone.js requirejs


    【解决方案1】:

    虽然我没有使用underscore,但在特定页面需要时,我还需要requireJS 获取大量插件。花了一段时间让它与 Jquery Mobile 一起工作,但这就是我的应用程序的运行方式(我不再收到任何错误,所以请随意复制)

    1) 在页眉中添加requirejs

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

    2) 我使用的是overrides.js,它有这个:

    // pre-sets
    $(document).bind("mobileinit", function(){
    $.mobile.autoInitializePage = false;
    });
    

    您需要这个,因为 jquery mobile 将在 require.js 之前触发(mobileinit 与 docready),这可能是您所有问题的原因 = JQM 在其他所有内容加载和渲染之前开始运行,因此您必须触发从您的应用程序控制器手动 JQM(我的 app.js

    3) 我的main.js 配置

    var IS_LOCAL  = /(:\/\/localhost|file:\/\/)/.test(document.location.href);     
    
    requirejs.config({  
             waitSeconds :  (IS_LOCAL? 2 : 45)
          ,  baseUrl:       "../js"
        //,  enforceDefine: true    
          , paths: { 
                  app:          'app'
                , overrides:    'overrides'
                , jquery:       'libs/jquery/jquery.min'
                , jqm:          'libs/jquery-mobile/jquery-mobile.min'
                , multiview:    'services/multiview/multiview.min'
                , respond:      'services/respond/respond.min'
                , klass:        'services/klass/klass.min'
                }
          , shim: {
                  'overrides':        { deps: ['jquery'] }
                , 'klass':            { deps: ['jquery'] }
                , 'jqm':              { deps: ['jquery'], exports: 'mobile' }
                ,  'services/multiview/multiview.min' :           { deps: ['jquery', 'jqm'] }
                ,  'services/add2home/add2home.min' :             { deps: ['jquery'] }
                ,  'services/datatables/datatables.min' :         { deps: ['jquery'] }
                ... more ... 
                ,  'services/respond/respond.min' :               { deps: ['jquery'] }
                    }
            });
    
        requirejs([ 'overrides', 'jquery', 'jqm', 'multiview', 'respond', 'app'], 
            function( $, overrides, mobile, multiview, respond, App){ 
                App.start();                
                });
    

    4) 然后我有一个app.js,我运行应用程序并且每个插件都需要app.js (config files)。这样我可以按需加载。看起来像这样:

    define([], function(){
        var start = function() {
            require([ 'overrides', 'jquery', 'jqm','multiview', 'respond' ],function() {
    
            // your magic goes here...
    
            // request a plugin:
            $(document).on('pagebeforeshow.add2home', '#login', function() {
                // add2Home - trigger once and lock
                var dom = $('html');
                if ( dom.jqmData('bound') != true ) {
                    dom.jqmData('bound', true);
                    require(['services/addtohome/app'], function (App) {
                        App.render();
                        });
                };
             });
    
            // don't forget to trigger JQM manually
            if ( $.mobile.autoInitializePage == false){
                $.mobile.initializePage();
            }
            }); // end require
        } // end start
        return {"start":start};
    });
    

    5) 这会调用插件app.js 配置文件,其中包含所有插件配置。看起来像这样:

    define(['services/addtohome/app', 'services/addtohome/addtohome.min'], function( app, addtohome ) {
    function render() {
    
        if ('standalone' in navigator && !navigator.standalone && (/iphone|ipod|ipad/gi).test(navigator.platform) && (/Safari/i).test(navigator.appVersion)) { 
            var addToHomeConfig = { 
                touchIcon:true,
                animationIn: 'bubble',
                animationOut: 'drop',
                returningVisitor: 'true',
                expire: '10',       
                }; 
            };
        };
    return {
        render:render
        };          
    });
    

    当然,您需要的脚本越多,花费的时间就越长,但是这个设置在压缩+gzip 压缩的 132k Javascript 中运行良好。

    【讨论】:

    • 我正在尝试您的示例,您的应用在 IE8 上测试是否正常?我不断收到#2 的未定义错误。感谢您的帮助。
    • 是的,它有效。但我需要稍微修改一下。明天我会尝试发布代码。
    • 谢谢。这几天我一直在寻找这个解决方案。我没有使用 initializePage 配置。
    【解决方案2】:

    因此,在实时站点中,您几乎应该缝合和缩小资源。 AMD 设置中有太多资源,无法实际尝试在实时站点中按需下载所有资源。 AMD 模块是开发时的便利,而不是部署解决方案。

    就模块顺序而言,我从来没有使用导出的任何运气。我们发现,最好的方法是将外部依赖项包装在 AMD 包装器中。是的,这意味着如果您更新外部库,则需要重新执行此操作,但实际上并没有您想象的那么大。

    首先你包装库

    //underscore.js file
    define(function(){
      //underscore code
      return underscore
    })
    

    然后您可以将它包含在任何地方,并获得订单保证 AMD 加载的所有好处:

    //backbone.js (or any other file that wants underscore)
    define([underscore],function(_){
      //backbone code
      return Backbone
    })
    

    【讨论】:

      【解决方案3】:

      您应该看看shim options 允许您按顺序加载模块。

      您也可以使用require.js optimizer 将所有文件合并为一个。

      【讨论】:

        猜你喜欢
        • 2020-07-26
        • 2020-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多