将垫片配置与杏仁一起使用

Using shim config with almond

我正在尝试填充某些模块以便与 almond 一起使用,如下所示:

<script>
requirejs.config({
  shim: {
    'jQuery': { exports: 'jQuery' },
  //etc.
</script>

因为某些脚本已经包含在内。但是,这段代码:

require(['jQuery', function($) {

});

结果 "undefined missing jQuery"。如果我这样填充 jQuery:

define('jQuery', function() {
  return jQuery;
});

有效。

我根本没有构建我的 JS,只是将 almond.js 放入现有的网络软件中,以便我可以使用 AMD 开发我的新组件。我想为我的新模块填充现有的全局变量。

我猜 shim 只在构建时解析,并且构建完全符合我上面所做的,对吗?

jQuery 的名称被硬编码为 "jquery"。如果您偏离这一点,您将 运行 惹上麻烦。但这不是你唯一的问题。

使用 shim 与使用模块名称调用 define 不同。当您像在问题中那样使用 shim 时,您告诉加载程序存在一个名为 jQuery 的模块,并且 一旦该模块被加载 ,RequireJS应该 return 作为模块值变量 jQuery 的值。强调的文本很重要:加载程序将获取并加载名为 jQuery.

的模块

您在问题中显示的 define 通常会与对 require.config 的调用放在一起,在它之前或之后。这声明了一个名为 jQuery 的模块。因为module已经那里了,loader需要获取这个module的时候,没有什么可以取的。这是杏仁的重要区别。

杏仁有restrictions,其中之一是:

optimize all the modules into one file -- no dynamic code loading.

(强调已添加。)使用我在此答案中使用的术语,这意味着 "no fetching"。当你使用你的 define 电话时,你很好。当您使用 shim 时,那么 除非您将模块优化为一个文件 ,否则加载程序必须尝试获取模块。杏仁做不到。