没有理由,有时候,jQuery不会加载require.js

时间:2015-06-09 14:00:34

标签: javascript jquery requirejs requirejs-define

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

通常,它运作良好,但有时会崩溃。那是我的app.js文件。我所有的"模块"文件将jQuery作为依赖关系在" define"功能

DateTime

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

未捕获的ReferenceError:未定义jQuery

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

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

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

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

添加填充程序告诉需要加载模块,然后将全局符号视为模块的默认导出。

从其他代码中使用 jQuery时,请务必确定:

  • 要求其他模块或
  • 在任何加载之前需要它

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

为了便于阅读和自我记录,我更喜欢使用库名作为填充名称(jqueryunderscorelodash)并使用符号将其导入范围( $_),而不是具有单个非alnum字符模块名称。我相信这是个人偏好,但很明显是什么

import $ from 'jquery';

确实

如果你有jQuery插件或使用Twitter的Bootstrap,你可能需要定义依赖于你的新jQuery“模块”的其他填充程序。这些强制jQuery在插件之前加载,实质上列出了依赖于需求的依赖树而不依赖于模块本身。 My Bootstrap example也适用于jQuery插件:

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

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