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

7
我将遵循多页面 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天内(自多页 git 存储库更新后),requireJS 是否发生了变化?

你能否提供一个自包含的JSFiddle示例来说明这个问题?你说它“几乎完全”像例子,但是“几乎”具体指什么呢? :-) - explunit
我正在开发一个巨大的平台,不幸的是,如果我把上面的内容分解成jsfiddle,它可以正常运行。这让我相信页面上可能存在某些问题或冲突。但是有一个奇怪的现象——如果只在common.js中加入空的define(function(){}),就不会出现错误,一旦引用requirejs.config()(即使没有args),我就会出现错误…… - Dan
好的,我相信问题与这里的问题相同,https://dev59.com/IGUp5IYBdhLWcg3wS2PP,即在使用匿名模块定义时使用requirejs时会出现问题。文档中指出,在不使用优化器时会有此问题,并建议使用优化器进行修复。问题是——我们在开发中应该如何解决这个问题,也就是在未经过优化的环境中工作时? - Dan
更奇怪的是,如果我在上面的//go on...行之前放置一个alert(),错误就不会发生。 - Dan
2个回答

7
答案是这样的,希望对某些人有帮助:由于这是一个大平台,许多其他内容是在require流程之外加载的(我们正在慢慢过渡)。其中一些资产,例如jquery 1.10、spin.js等,与AMD兼容,并且调用define()。在spin.js的情况下,它匿名地调用define(),这导致加载出现问题,如解决文档中的不匹配的匿名错误的第二点所述。天哪。

你给那些“有问题”的文件打了ID吗? - Jesse Burcsik
不是因为我们不想改变第三方源代码,而是我们决定勇敢地做出一些结构性的改变——要么我们从RequireJS流中删除了所有有问题库的加载(然后全局引用这些内容),要么就限制某个库只能在Require流中使用。 - Dan
我理解你是如何将有问题的库引入到require中的。但我不理解第一个例子,我认为那可能是我需要的解决方案。你说:“我们从RequireJS流中删除了所有有问题的库的加载”。根据你最初的问题,我认为有问题的JS文件已经与你的requreJS流分开了(就像我的情况一样)。我无法将它们引入。 - Jesse Burcsik
我们在Handlebars和jQuery之间出现了很多不匹配的情况,因为它们经常在流程内外被使用,导致冲突。所以我们只能在Require中删除所有对jQuery和H-bars的引用,让整个RJS流程在第一个require()启动之前将它们作为全局变量加载。虽然这并不理想,因为我们正在努力向Require迁移,但我们不得不在此期间这样做。所以,任何在Require流程中被调用的命名模块,都要将其删除,并在require()开始之前加载它。 - Dan

0

很明显发生了什么。您正在尝试加载模块,但是您的common.js只有require.config而没有模块。因此更新RequireJS(而不是Firefox)会抛出错误。在您的common JS中包含define,错误应该就会消失。

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

很抱歉,那不是解决方法。RequireJS并不严格要求AMD定义才能加载。此外,示例模式中的代码没有被模块包装,而这是由接近RequireJS项目的人编写的。最后,我尝试了一下,仍然出现错误。感谢您的尝试! - Dan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接