【问题标题】:Using shim config with almond将 shim 配置与杏仁一起使用
【发布时间】:2015-05-04 08:15:25
【问题描述】:

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

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

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

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

});

导致“未定义的缺少 jQuery”。如果我像这样填充 jQuery:

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

它有效。

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

我猜垫片只在构建时解决,并且构建完全按照我上面所做的那样,对吗?

【问题讨论】:

  • 是的,Almond 可能需要将模块构建到一个文件中。
  • jquery 已经是一个 amd 模块,它不需要 shim 配置。但是,它将自己定义为一个名为 jquery 的命名模块,全部小写。

标签: javascript requirejs amd almond


【解决方案1】:

jQuery 的名称被硬编码为“jquery”。如果你偏离这一点,你就会遇到麻烦。但这不是你唯一的问题。

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

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

杏仁有restrictions,其中之一是:

将所有模块优化到一个文件中 -- 没有动态代码加载。

(添加了重点。)使用我在此答案中使用的术语,这意味着“不获取”。当您使用define 电话时,您会很好。当您使用shim 时,除非您将模块优化到一个文件中,否则加载程序必须尝试获取该模块。杏仁不能那样做。

【讨论】:

  • 感谢您的回复 Louis。我了解 RequireJS 和 Almond 的概念。我并没有试图让 Almond 获取 jQuery,只是不寻找名为“jQuery”的模块,而是返回全局“jQuery”对象。但它看起来像 a) jQuery 将自己命名为“jquery”和 b) 垫片在构建时为 Almond 解析。我最终还是在这个项目上使用了 RequireJS。当我构建时可能会再次切换到杏仁。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多