常见错误

此页面列出了RequireJS生成的错误。如果以下信息不能解决问题,则可以在RequireJS 列表打开问题。无论哪种情况,最好都有一个示例或对该问题的详细解释,希望有重现步骤。

不匹配的匿名define()模块...§ 1

如果您手动编写HTML脚本标记以通过匿名define()调用加载脚本,则可能会发生此错误。

如果您在HTML中手动编码脚本标记以加载具有一些命名模块的脚本,但是随后尝试加载最终与在手动编码脚本加载的脚本中具有名称模块之一名称相同的匿名模块标签。

如果您使用加载程序插件或匿名模块(不带字符串ID调用define()的模块)但不使用RequireJS优化器将文件组合在一起,则可能发生此错误。优化器知道如何正确命名匿名模块,以便它们可以与优化模块中的其他模块组合。

如果var define;将文件顶部用于jshint/jslint,这将对优化器造成问题,因为它避免了解析声明define变量的文件,因为这可能表明脚本是由某些使用以下脚本的脚本串联而成的本地定义。

为避免该错误:

  • 确保通过RequireJS API加载所有调用define()的脚本。不要手动在HTML中编写脚本标记,以加载其中具有define()调用的脚本。
  • 如果您手动编码HTML脚本标记,请确保它仅包含命名模块,并且不会加载与该文件中的模块名称相同的匿名模块。
  • 如果问题是使用加载程序插件或匿名模块,但RequireJS优化器未用于文件捆绑,请使用RequireJS优化器。
  • 如果问题是var define棉绒方法,请改用/*global define */(“全局"前不能有空格)注释样式。

模块的加载超时:...§ 2

可能的原因和解决方法:

  • 列出的模块之一中存在脚本错误。如果浏览器的错误控制台中没有脚本错误,并且您使用的是Firebug,请尝试在其他浏览器(例如Chrome或Safari)中加载页面。有时,脚本错误不会在Firebug中显示。
  • 模块的路径配置不正确。检查浏览器开发人员工具中的“网络"或“网络"选项卡,以查看是否存在404映射到模块名称的URL。确保脚本文件在正确的位置。在某些情况下,您可能需要使用路径配置来修复脚本的URL解析。
  • 路径配置用于将两个模块ID设置为同一文件,并且该文件中仅包含一个匿名模块。如果将模块标识"something"和"lib/something"都配置为指向相同的"scripts/libs/something.js"文件,并且something.js中仅包含一个匿名模块,则可能会发生这种超时错误。解决方法是确保所有模块ID引用都使用相同的ID(为所有引用选择"something"或"lib/something"),或使用map config.

错误评估模块...§ 3

为错误消息中给定的模块调用define()函数时发生错误。define函数内部的代码逻辑存在错误。该错误可能发生在require回调内部。

在Firefox和WebKit浏览器中,错误中将显示行号和文件名。它可以用来定位问题的根源。通过使用调试器在包含错误的文件中放置一个断点,可以更好地隔离错误。

模块名称...尚未为上下文加载:...§ 4

当有一个require('name')调用,但尚未加载'name'模块时,会发生这种情况。

如果错误消息包含Use require([]),则它是应使用异步,回调版require加载代码的顶级require调用(而不是define()调用内的require调用):

//如果此代码不在define调用中,
//不使用require('foo'),而是使用async
//回调版本:
require(['foo'], function (foo) {
    //foo现在已加载。
});

如果使用简化的定义包装器,请确保将require作为定义函数的第一个参数:

define(function (require) {
    var namedModule = require('name');
});

如果要在依赖项数组中列出依赖项,请确保require和name在依赖项数组中:

define(['require', 'name'], function (require) {
    var namedModule = require('name');
});

特别是以下情况将不起作用:

//这会失败的
define(['require'], function (require) {
    var namedModule = require('name');
});

失败是因为在调用上述工厂函数之前,requirejs需要确保加载并执行所有依赖项。如果为define()提供了一个依赖项数组,则requirejs假定该数组中列出了所有依赖项,并且不会扫描工厂函数中是否存在其他依赖项。因此,要么不传入依赖项数组,要么使用依赖项数组列出其中的所有依赖项。

如果是require()回调的一部分,则所有依赖项都需要在数组中列出:

require(['require', 'name'], function (require) {
    var namedModule = require('name');
});

确保require('name')仅出现在define()定义函数或require()回调函数内部,而不会出现在全局空间中。

在RequreJS 1.0.x发行版中,使用简化的CommonJS包装(无依赖项数组)时,WebKit浏览器中的require和parens之间存在空格存在一个错误:

define(function (require) {
    //注意require和参数之间的空格。
    var namedModule = require ('name');
});

解决方法是仅删除空间。这在2.0代码中已修复,如果完成1.0.9版,则可以反向移植到1.0.x系列。

无效的要求呼叫§ 5

当有类似这样的呼叫时会发生这种情况:

require('dependency', function (dependency) {});

异步加载依赖项应使用数组列出依赖项:

require(['dependency'], function (dependency) {});

没有定义要求...§ 6

当forcemDefine设置为true,并且加载了以下任一脚本时,会发生这种情况:

  • 没有调用define()来声明模块。
  • 或者是垫片配置的一部分,垫片配置指定了exports可以检查以验证加载的字符串属性,但检查失败。
  • 或者是未为config选项设置字符串值的填充程序配置的一部分exports。

或者,如果错误仅在IE中显示,而不在其他浏览器中显示(这可能会产生Script错误,则该脚本可能是:

  • 引发JavaScript语法/评估错误。
  • 或IE中出现404错误,脚本无法加载。

要解决这个问题:

  • 如果模块调用define(),请通过在脚本调试器中进行调试来确保已到达define调用。
  • 如果是匀场配置的一部分,请确保匀场配置的导出检查正确无误。
  • 如果在IE中,请使用脚本调试器检查HTTP 404错误或JavaScript sytnax错误。

脚本错误§ 7

在浏览器中触发script.onerror函数时,会发生这种情况。这通常意味着运行脚本存在JavaScript语法错误或其他执行问题。要解决此问题,请在脚本调试器中检查生成错误的脚本。

该错误可能不会在IE中显示,而只会在其他浏览器中显示,相反,在IE中,当您看到“脚本错误"时,可能会看到No define call for ...错误。.

没有匹配的脚本互动式的...§ 8

此错误仅在某些IE浏览器中显示。最有可能是由于加载了调用define()但已通过纯脚本标记或通过其他调用(例如JavaScript字符串的eval())加载的脚本引起的。

为避免该错误,请确保通过RequireJS API加载所有调用define的脚本。

不支持路径:...§ 9

当优化器遇到模块或脚本的路径(即网络路径)时,会发生此错误。优化器仅允许使用本地资源进行构建。要解决这个问题:

确保将网络依赖项作为模块名称而不是完整的URL引用,以便在构建过程中可以将其映射到其他名称:

//不要这样做
require(['http://some.domain.dom/path/to/dependency.js'],
function (dependency) {});

//而是这样做:
require.config({
    paths: {
        'dependency': 'http://some.domain.dom/path/to/dependency'
    }
});

require(['dependency'], function (dependency) {});

如果要在构建/优化的文件中包含此依赖项,请下载JS文件,并在优化器的构建配置文件中,放入指向该本地文件的路径配置。

如果要从该文件中排除该文件,而只需要为构建映射“依赖关系"(否则它将无法构建),则请使用特殊的"empty:"路径配置:

//在生成配置文件中
{
    paths: {
        'dependency': 'empty:'
    }
}

不能用PRESERVELICENSECOMMENTS和GENERATESOURCEMAPS一起§ 10

在r.js优化器中,preserveLicenseComments充当JS文件的预处理和后处理步骤。找到各种许可证注释,将其从JS源中拉出,然后将修改后的源传递给压缩程序。完成压缩程序后,r.js优化器会将注释添加到文件顶部。

然而,对于minifier准确地构建源映射,源精缩不能以任何方式修改,所以preserveLicenseComments与不相容generateSourceMaps。在优化器的2.1.2版本中引入了generateSourceMaps。

优化程序的默认值是keepLicenseComments为true。因此,如果使用generateSourceMaps,则将显式地将preserveLicenseComments设置为false。如果要保留一些许可证注释,则可以在JS源代码中手动修改许可证注释以使用JSDoc样式的@license注释。

IMPORTSCRIPTS失败...§ 11

当RequireJS在使用Web工作,importScripts用于加载模块。如果该呼叫由于某种原因失败,则会生成此错误。