首页 文章

Require.js:从构建加载文件但不执行它

提问于
浏览
0

我正在开发一个结合了ember.js和jquery-mobile.js的应用程序

为了使这两者相互配合,我需要在初始化Ember之后加载JQM . 所以我在我的主文件app.js中使用以下代码:

require.config({
    baseUrl: 'resources/js/',
    waitSeconds: 200,
    paths: {
        text: 'lib/require/text',
        ember: 'lib/ember-1.5.1.min',
        jquery: 'lib/jquery-2.1.1.min',
        mobile: 'lib/jquery.mobile-1.4.2.min',
        handlebars: 'lib/handlebars-1.3.0.min',
    },
    shim: {
        'ember': {
            deps: ['handlebars', 'text', 'jquery']
        }
    }
});


define('app', [
    'jquery',
    'app/many/files',
    'ember'
], function($,
    ManyFiles) {

    $(document).bind('mobileinit', function() {
        $.mobile.ajaxEnabled = false;
        $.mobile.pushStateEnabled = false;
        $.mobile.linkBindingEnabled = false;
        $.mobile.hashListeningEnabled = false;
        $.mobile.ignoreContentEnabled = true;
    });

    App = Ember.Application.create({
        ready: function() {
            require(['mobile']);
        }
    });

    // Initialize stuff...
}

(如您所见,只有当ember应用程序准备好时才加载jqm)

这很好用,但是当我将所有文件构建到一个缩小的js文件中时,我遇到了这个问题:一旦代码需要JQM,我就会在网络选项卡上看到一个http调用,它会 grab jquery-mobile.js

当然这是一个令人不快的过程 . 我能想到的唯一解决方案是加载JQM以及所有其他依赖项但不执行它 . 然后,代码可以执行JQM而不需要文件 .

但是我对require.js没有经验,我不知道如何做到这一点 . 任何帮助表示赞赏 . 还可以理解实现相同目的的其他方法

谢谢

EDIT: 为什么Jmber需要在Ember之后加载?因为JQM在DOM上添加了干扰ember的包装器,类和事件......事情变得非常糟糕

1 回答

  • 0

    经过大量的讨论,我发现了一个问题的答案:

    ...
    
        App = Ember.Application.create({
            ready: emberInit
        });
    
        // Initialize stuff
    }
    
    function emberInit() {
        require(['mobile']);
    }
    

    似乎require语句太嵌套了它才能正常工作(可能是一个bug?)

    NOTE: 在尝试找到我的问题的答案时,我发现了一个require.js的功能,我想与可能有类似问题的人分享并碰到这个线程:

    显然,您可以在require参数上设置回调,以便在加载所有依赖项时运行,如下所示:

    require.config({
        deps: ['jquery', 'handlebars', 'ember', 'socketio'],
        callback: function () {
            // Do stuff when above dependencies load
        },
    });
    

    这不完全是我需要的,但其他人可能会觉得有帮助

相关问题