匿名的define()模块不匹配

Ado*_*dis 115 javascript jquery requirejs

当我第一次浏览我的webapp时(通常在具有禁用缓存的浏览器中),我收到此错误.

错误:匿名的define()模块不匹配:function(require){

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>
Run Code Online (Sandbox Code Playgroud)

JS:

$(function () {
    define(function (require) {
        // do something
    });
});
Run Code Online (Sandbox Code Playgroud)

无论如何知道这个错误究竟是什么意思以及它为什么会发生?

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

B T*_*B T 135

就像AlienWebguy说,每文档,require.js可以炸毁如果

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

我在使用browserify和require.js模块构建的bundle时遇到了这个问题.解决方案是:

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

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

  • 冲突的名称是常见的 (2认同)
  • 另一种可能的解决方案是,在一些匿名模块的特殊情况下,覆盖 requirejs.onError 函数,以防止 requirejs 抛出的默认错误异常会停止执行后续模块或代码。 (2认同)
  • 刚刚添加了一个拉取请求(https://github.com/requirejs/requirejs/pull/1763)来放松这种情况。我认为这是当今一个非常普遍的问题。 (2认同)

elo*_*one 13

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

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


Ali*_*guy 11

根据文档:

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

还可以看到,如果您在HTML中手动编写脚本标记以加载具有一些命名模块的脚本,但随后尝试加载一个匿名模块,该模块最终与手动加载的脚本中的一个命名模块具有相同的名称编码脚本标记.

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

为了避免错误:

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

  • 如果手动编写HTML脚本标记代码,请确保它只包含命名模块,并且不会加载与该文件中某个模块同名的匿名模块.

  • 如果问题是使用加载程序插件或匿名模块但是RequireJS优化器不用于文件绑定,请使用RequireJS优化程序.

  • 这是一个匿名定义的模块吗?https://github.com/requirejs/example-multipage/blob/master/www/js/app/controller/c1.js (3认同)

P.B*_*key 10

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

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

匿名定义

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


define(function() {
        return { helloWorld2: function() { console.log('hello world again!') } };
 })
Run Code Online (Sandbox Code Playgroud)

用字符串id定义

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

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

当您使用带有字符串id的define时,当您尝试使用这样的模块时,您将避免此错误:

require([ "moduleOne", "moduleTwo" ], function(moduleOne, moduleTwo) {
    moduleOne.helloWorld();
    moduleTwo.helloWorld2();
});
Run Code Online (Sandbox Code Playgroud)


jcb*_*drn 6

现有的答案很好地解释了这个问题,但是如果由于遗留代码而使用 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>
Run Code Online (Sandbox Code Playgroud)

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

  • 实际上永远不要这样做。它在 IE 中无法正常工作。 (5认同)
  • @jcbdrn 这不仅仅是在 IE 上。我见过它发生在其他平台上。原因是 HTML 规范确实提供了关于同步脚本执行顺序的保证*但仅相对于其他同步脚本*。它不保证相对于同步脚本的*异步*脚本的执行(反之亦然)。因此,在此处的答案中显示的代码中,可以在任意两个 `script` 元素之间执行异步脚本。 (3认同)
  • 间歇性地在 IE 中,requireJS 中包含的脚本会在其窗口范围内定义缺失,即使在恢复这些变量之后出现 require 命令时也是如此。我们从来没有弄清楚为什么会发生这种情况,所以我们放弃了这个 hacky 解决方案。 (2认同)

Vec*_*tor 5

请注意,某些浏览器扩展可以向页面添加代码.在我的情况下,我有一个"emmet in all textareas"插件与我的requireJs搞砸了.通过在浏览器中检查,确保没有额外的代码添加到文档中.