【问题标题】:For no reasons, sometimes, jQuery won't load with require.js无缘无故,有时,jQuery 不会加载 require.js
【发布时间】:2015-06-09 14:00:33
【问题描述】:

我创建了一个 app.js 文件,其中包含我所有的 JS 文件,用于管理依赖项和其他模块的内容。

通常,它工作得很好,但有时,它会崩溃。这是我的 app.js 文件。我所有的“模块”文件在“定义”函数中都有 jQuery 作为依赖项。

require.config({
    baseUrl: 'js/', // '../Style%20Library/js/' pour Sharepoint
    paths: {
        jquery: 'vendor/jquery-1.11.2.min',
        jqueryui: 'vendor/jquery-ui',
        jrespond: 'vendor/jrespond-0.10',
        transit: 'vendor/jquery.transit.min',
        easing: 'vendor/jquery.easing.1.3',
        mainMenu: 'modules/main-menu',
        resBreakpoints: 'modules/resBreakpoints'
        [...]
    }
});

require(['jquery','resBreakpoints', 'transit'], function($, resBreakpoints, transit) {
    // Support aux vieux browser pour ne pas utiliser le plugin transition
    if(!Modernizr.csstransitions){ 
        $.fn.transition = $.fn.animate; 
    }
});

什么会导致崩溃?当它工作时,控制台中没有错误,但当它崩溃时,它会为许多模块显示此错误。

Uncaught ReferenceError: jQuery is not defined

当没有定义 jQuery 时,jQuery 和其他文件都是完全加载的,网络选项卡上没有错误。

感谢您的帮助!

【问题讨论】:

  • 您是否尝试过使用shim 配置选项?
  • “无缘无故” - 嘻嘻,不错!
  • "无缘无故" ;) 只是提到它有时运行良好而且不知从何而来,一个狂野的“jQuery 未定义”出现了。
  • @MikeBoutin 请为您的错误提供堆栈跟踪或指定错误发生的位置。否则你会得到猜测作为答案。就像你接受的错误答案一样。
  • 所有细节都在问题中......没有更多线索......我接受了答案,因为它是为我工作的答案!很清楚,它有效......如果你不喜欢它,只需投反对票!

标签: javascript jquery requirejs requirejs-define


【解决方案1】:

jQuery 和许多其他库——有些是旧的,有些只是为了避免现代约定(coughBackbonecough)——不支持任何模块加载器种类。要使用 require 加载那些,您需要使用 the shims feature 并明确列出模块导出的符号。您可以在下面看到一个示例 here, in my front-end template project 并隔离:

require.config({
    shim: {
      jquery: {
        exports: '$'
      }
    }
  });

添加 shim 告诉 require 加载模块,然后将全局符号视为模块的默认导出。

当您在其他代码中使用 jQuery 时,请确保您:

  • 从其他模块中需要它或
  • 在加载任何内容之前需要它

为了清洁,我更喜欢前者。给定垫片后,您需要在每个模块的开头require('jquery')不是 require('$') 或类似的东西。 shim 的名称(键)是模块名称,执行 var $ = require('jquery') 将返回您需要的符号。

为了可读性和自文档化,我更喜欢使用库名称作为 shim 名称(jqueryunderscorelodash)并使用符号($ 或 @987654333)将其导入范围@),而不是具有单个非 alnum 字符的模块名称。这是个人喜好,我相信,但很清楚是什么

import $ from 'jquery';

会。

如果您有 jQuery 插件或使用 Twitter 的 Bootstrap,您可能需要定义其他依赖于您的新 jQuery“模块”的 shim。这些强制 jQuery 在插件之前加载,本质上列出了独立于模块本身的 require 的依赖关系树。 My Bootstrap example 也适用于 jQuery 插件:

shim: {
  bootstrap: {
    deps: ['jquery']
  }
}

这会强制模块之间的依赖关系,允许您 require 插件并确保之前已加载父级。由于 jQuery 等将它们的符号置于全局范围内,因此您不需要为插件设置任何导入,只需确保在插件开始加载之前 需要该库即可。

【讨论】:

  • 这个答案是错误的。 jQuery 从 pre-1.9 开始支持 AMD 加载器。事实上,为 jQuery 使用 shim 是导致 RequireJS 部分行为未定义的可靠方法。
  • @Louis 引用需要吗?从 1.9 之前到 2.x 版本,我在许多项目中一直在为 jQ 使用 shim,并且从未遇到任何问题(但在没有 shim 的情况下看到加载问题)。
  • the version used by the OP 中搜索define.amd。 jQuery 调用 define,因此没有 shim
猜你喜欢
  • 1970-01-01
  • 2010-10-04
  • 1970-01-01
  • 2019-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-11
  • 1970-01-01
相关资源
最近更新 更多