requireJS - 多页 shim 中不匹配的匿名 define() 模块

Posted

技术标签:

【中文标题】requireJS - 多页 shim 中不匹配的匿名 define() 模块【英文标题】:requireJS - Mismatched anonymous define() module in multipage shim 【发布时间】:2013-05-29 23:14:19 【问题描述】:

我在这里遵循多页 shim 共享模式: https://github.com/requirejs/example-multipage-shim

我使用相同的 common.js,并且设置非常相似且简单:

<script src="js/library/requirejs/require.min.js"></script>
<script>
require(['./js/config/common'], function (common) 
  //go on...
);
</script>

一切正常,我可以继续在 require 闭包内运行操作,但我在 Firefox 中不断收到错误,抱怨匿名 define() 模块与上述代码不匹配。鉴于它是多么简单,而且我几乎完全遵循示例模式,我对为什么要得到它有点困惑。我没有在任何地方使用define()。在过去的 24 天内,requireJS 中的某些内容是否发生了变化(因为多页 git 存储库已更新)?

【问题讨论】:

是否有一个独立的 JSFiddle 你可以发布来说明这个问题?您说它与示例“几乎完全一样”,但是 如何 究竟是“非常” :-) 不幸的是,我正在一个巨大的平台上工作,如果我将上面所做的事情分解为 jsfiddle 它工作正常。所以让我相信页面上的其他内容可能存在问题或冲突。一个策略注意事项 - 如果只是在 common.js 中放置一个空的 define(function()) ,则不会抛出错误,只要我引用 requirejs.config() (即使没有 args ),我就会收到错误消息。 .. 好的,我相信问题与这里的***.com/questions/15371918/… 相同,因为当我在匿名模块定义中使用 requirejs 时会出现问题。文档说这是不使用优化器时的问题,并说使用优化器来修复它。问题是——我们在进行开发时应该如何绕过它,即在未优化的环境中工作?? 更奇怪的东西,如果我在 //go on... 行之前放一个 alert() 就不会发生错误。 【参考方案1】:

很清楚发生了什么。您正在尝试加载模块,但您的 common.js 只有 require.config 并且没有模块。因此更新的 RequireJS(不是 Firefox)会引发错误。在您的常见 JS 中包含定义,错误应该会消失。

// common.js stuff...
define();

【讨论】:

恐怕不是这样,RequireJS 并不严格要求加载 AMD 定义。此外,示例模式中的代码不是模块包装的,而是由与 RequireJS 项目关系密切的人编写的。最后,我试了一下,还是报错。感谢您的尝试!【参考方案2】:

答案是这样,希望对某人有所帮助:

鉴于这是一个大平台,许多其他的东西被加载到需求流之外(我们正在慢慢过渡)。

其中一些资产,即 jquery 1.10、spin.js 等,与 AMD 兼容,并且正在调用 define()。在 spin.js 的情况下,它匿名调用 define(),这会导致加载失败,如解析文档中 Mismatched Anonymous 错误的第二点所述。

祝你好运。

【讨论】:

您是否为“违规”文件提供了 ID? 不,因为我们不想更改第三方源,我们只是硬着头皮做了一些结构上的改变——要么我们从 RequireJS 流程中删除了所有有问题的库的加载(然后引用全局的东西)或反之亦然,将库限制为仅要求流使用。 我了解您如何将有问题的库引入 require。我不明白第一个例子,我认为这可能是我需要的解决方案。 - 你说 “我们从 RequireJS 流程中删除了所有有问题的库的加载”。从您最初的问题来看,我认为我们已经与您的 requreJS 流程分开了有问题的 JS 文件。 (就像我的情况一样)。我不能带他们进来。 例如,我们在 Handlebars 和 jQuery 上发生了很多不匹配,因为它们在流程内外都被大量使用并导致冲突。所以我们只需要删除 Require 中对 jQuery 和 H-bars 的所有引用,并让整个 RJS 流将它们作为在第一个 require() 启动之前加载的全局变量引用。并不理想,因为 Require 是我们正在努力实现的目标,但同时我们必须这样做。所以是的,任何在 Require 流程中被调用的命名模块,删除它并在 require() 开始之前加载它。

以上是关于requireJS - 多页 shim 中不匹配的匿名 define() 模块的主要内容,如果未能解决你的问题,请参考以下文章

模块化开发RequireJS之shim配置

(转)RequireJS shim 用法说明

Shim Twitter Bootstrap for RequireJS

Karma + Jasmine + Durandal + KnockoutJS + RequireJS 单元测试中不匹配的匿名 define() 模块

使用requireJS的shim参数 解决插件 jquery.ui 等插件问题

RequireJS - 垫片为CoffeeScript的脚本