【问题标题】:Require.js: load file from build but don't execute itRequire.js:从构建中加载文件但不执行它
【发布时间】:2014-07-22 21:46:31
【问题描述】:

我正在开发一个结合了 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...
}

(如您所见,jqm 仅在 ember 应用程序就绪时才加载)

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

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

但是,我没有使用 require.js 的经验,也不知道该怎么做。任何帮助表示赞赏。其他方法来完成同样的事情也值得赞赏

谢谢

编辑: 为什么 JQM 需要在 Ember 之后加载? 因为 JQM 在 DOM 上添加了影响 ember 的包装器、类和事件......事情变得非常糟糕

【问题讨论】:

  • 我不知道 Ember - 您能否解释一下为什么在 Ember 初始化之前无法加载 jQuery Mobile 脚本(如 jQuery 脚本)?也许可以避免这种需要。如果做不到这一点,则需要将 jQuery Mobile 脚本缩小到与 Ember 脚本被缩小到的不同的脚本中,以便可以在不同的时间点单独加载。
  • 感谢您的回复,我编辑了帖子以回答您的问题
  • 谢谢。并检查我是否理解问题:这里的根本问题是,当所有脚本都被缩小时,移动脚本脚本与 ember 脚本一起缩小,因此它们都同时加载并且没有机会绑定mobileinit 加载移动脚本之前的事件处理程序。这就是您要解决的问题吗?
  • 听起来不错。
  • 这又引出了一个问题:你是如何进行缩小的——你使用的是什么缩小工具?你能控制你正在使用的任何缩小工具,以便将脚本缩小并按特定顺序输出吗?

标签: javascript jquery jquery-mobile ember.js requirejs


【解决方案1】:

经过一番折腾,我找到了问题的答案:

    ...

    App = Ember.Application.create({
        ready: emberInit
    });

    // Initialize stuff
}

function emberInit() {
    require(['mobile']);
}

似乎 require 语句过于嵌套而无法正常工作(可能是一个错误?)

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

显然你可以在 require 配置上设置一个回调,以便在加载所有依赖项时运行,如下所示:

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

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

【讨论】:

    猜你喜欢
    • 2011-07-18
    • 2013-04-23
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    • 2019-06-01
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多