不匹配的匿名定义()module

IT技术 javascript jquery requirejs
2021-02-02 04:01:04

当我第一次浏览我的web 应用程序时(通常在禁用缓存的浏览器中),我收到此错误

错误:不匹配的匿名定义()module:函数(需要){

HTML :

<html>
   .
   .
   .
   <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script>
   <script> var require = { urlArgs: "v=0.4.1.32" }; </script>
   <script data-main="assets/js/main" src="assets/js/libs/require.js"></script>
   <script src="assets/js/ace/ace.js?v=0.4.1.32"></script>
   </body>
</html>

JS

$(function () {
    define(function (require) {
        // do something
    });
});

任何人都知道这个错误的确切含义以及它为什么会发生?

源文件在 github 问题页面中对其进行简短讨论

6个回答

就像 AlienWebguy 说的,根据文档,require.js 可能会崩溃,如果

  • 在自己的脚本标签中有一个匿名定义(“调用没有字符串 ID 的define() 的module”)(我假设它们实际上是指全局范围内的任何地方)
  • 您有名称冲突的module
  • 您使用加载器插件或匿名module,但不要使用 require.js 的优化器来捆绑它们

我在包含使用 browserify 构建的包和 require.js module时遇到了这个问题。解决方案是:

A. 在加载 require.js之前加载脚本标签中的非 require.js 独立包,或

B. 使用 require.js(而不是脚本标签)加载它们

你的评论对我很有帮助。@xtrm
2021-03-26 04:01:04
另一种可能的解决方案是,在某些匿名module的特殊情况下,覆盖 requirejs.onError 函数,以防止 requirejs 抛出的默认错误异常会停止执行后续module或代码。
2021-03-28 04:01:04
感谢您告诉我之前加载它们!我不知道为什么这个技巧不在 requirejs 自己的文档中......这就是 stack 派上用场的地方
2021-04-02 04:01:04
名称冲突是常见的
2021-04-07 04:01:04
刚刚添加了一个拉取请求(github.com/requirejs/requirejs/pull/1763)来放宽那个确切的情况。我认为这是当今一个非常普遍的问题。
2021-04-08 04:01:04

在开始使用 require.js 时,我遇到了这个问题,作为初学者,文档也可能是用希腊语编写的。

我遇到的问题是,当您应该使用“字符串 ID”时,大多数初学者示例都使用“匿名定义”。

匿名定义

define(function() {
        return { helloWorld: function() { console.log('hello world!') } };
 })
    
  
define(function() {
        return { helloWorld2: function() { console.log('hello world again!') } };
 })

用字符串 id 定义

define('moduleOne',function() {
    return { helloWorld: function() { console.log('hello world!') } };
})

 define('moduleTwo', function() {
      return { helloWorld2: function() { console.log('hello world again!') } };
})

当您使用带有字符串 id 的定义时,当您尝试使用像这样的module时,您将避免此错误:

require([ "moduleOne", "moduleTwo" ], function(moduleOne, moduleTwo) {
    moduleOne.helloWorld();
    moduleTwo.helloWorld2();
});
(仅供后人注意)这种方法一些缺点,在文档有所描述:“define() 调用包含module的名称……通常由优化工具生成……自己命名 [ing] module……使module可移植性较差……通常最好避免在module名称中进行编码,而只需让优化工具刻录module名称即可。” ...以及在此 GitHub 线程中这似乎是初学者示例中排除列出名称的原因。
2021-04-05 04:01:04

我有这个错误,因为我包含了 requirejs 文件以及直接包含在脚本标签中的其他库。那些库(如 lodash)使用了一个与 require 的定义相冲突的定义函数。requirejs 文件是异步加载的,所以我怀疑 require 的定义是在其他库定义之后定义的,因此存在冲突。

要消除错误,请使用 requirejs 包含所有其他 js 文件。

原来很多库都做这样的事情,或者至少使用/导出这样的功能。我会建议每个人 - 如果他们使用 require - 使用 require 导入所有内容:)
2021-03-16 04:01:04

根据文档

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

如果您在 HTML 中手动编写脚本标记以加载具有几个命​​名module的脚本,然后尝试加载一个匿名module,该module最终与手动加载的脚本中的一个命名module具有相同的名称,也可以看到编码脚本标签。

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

为避免错误:

  • 确保通过 RequireJS API 加载所有调用 define() 的脚本。不要在 HTML 中手动编写脚本标记以加载其中具有 define() 调用的脚本。

  • 如果您手动编写 HTML 脚本标记,请确保它仅包含命名module,并且未加载与该文件中的module之一具有相同名称的匿名module。

  • 如果问题是使用加载器插件或匿名module,但 RequireJS 优化器未用于文件捆绑,请使用 RequireJS 优化器。

2021-03-16 04:01:04

现有的答案很好地解释了这个问题,但是如果由于遗留代码而使用 requireJS 或在 requireJS 之前包含您的脚本文件不是一个简单的选择,那么稍微有点hacky 的解决方法是在您的脚本标记之前从窗口范围中删除 require,然后在之后恢复它。在我们的项目中,这被包装在服务器端函数调用之后,但实际上浏览器会看到以下内容:

    <script>
        window.__define = window.define;
        window.__require = window.require;
        window.define = undefined;
        window.require = undefined;
    </script>
    <script src="your-script-file.js"></script>        
    <script>
        window.define = window.__define;
        window.require = window.__require;
        window.__define = undefined;
        window.__require = undefined;
    </script>

不是最整洁的,但似乎有效并且节省了很多折射。

@jcbdrn 这不仅仅是在 IE 上。我见过它发生在其他平台上。原因是 HTML 规范确实提供了关于同步脚本执行顺序的保证,但仅与其他同步脚本相关它不保证异步脚本相对于同步脚本的执行(反之亦然)。因此,在此处的答案中显示的代码中,可以在任意两个script元素之间执行异步脚本
2021-03-18 04:01:04
如果你有能力编辑你正在导入的 bundle js,你可以像这样包装整个东西: (function(){ var define = undefined; // the UMD registration code won't find the global 'define' anymore! // generated content goes here })()
2021-03-23 04:01:04
在 IE 中,即使在恢复这些变量之后出现 require 命令时,包含在 requireJS 中的脚本也会在其窗口范围内定义缺失。我们从来没有弄清楚为什么会发生这种情况,所以我们放弃了这个 hacky 解决方案。
2021-03-27 04:01:04
实际上永远不要这样做。它在 IE 中无法正常工作。
2021-03-31 04:01:04
谢谢,对于有很多团队的遗留应用程序,这是理想的解决方案......:/
2021-04-10 04:01:04