Javascript RequireJS垫片导出用于什么?

Javascript RequireJS垫片导出用于什么?,javascript,backbone.js,requirejs,Javascript,Backbone.js,Requirejs,我正在通读,目前正在阅读关于如何使用RequireJS构建应用程序的文章 据我所知,填隙背后的想法是,通常当您需要模块时,RequireJS也会找出如何加载它们的依赖项。但当你试图加载一个非AMD模块时,这是行不通的(我不知道为什么,但这是一个单独的问题)。为了解决这个问题,你可以设置一个垫片,上面写着“在Y之前加载X” 我看到您可以使用exports来表示,“将这个非AMD的东西放入一个全局变量而不是一个模块” 那能解决什么问题?非AMD库的问题不正是因为RequireJS无法找出依赖项吗?实

我正在通读,目前正在阅读关于如何使用RequireJS构建应用程序的文章

据我所知,填隙背后的想法是,通常当您需要模块时,RequireJS也会找出如何加载它们的依赖项。但当你试图加载一个非AMD模块时,这是行不通的(我不知道为什么,但这是一个单独的问题)。为了解决这个问题,你可以设置一个垫片,上面写着“在Y之前加载X”

我看到您可以使用
exports
来表示,“将这个非AMD的东西放入一个全局变量而不是一个模块”

那能解决什么问题?非AMD库的问题不正是因为RequireJS无法找出依赖项吗?

实际上需要解决“我不知道为什么”部分来回答这个问题。仅非AMD模块需要填隙,而通过RequireJS加载非AMD模块并不完全有效,因为RequireJS需要AMD模块。也就是说,它需要将模块包装在
define
调用中,该调用包含依赖项列表和工厂方法()。“标准”,旧式库将其内容写入全局范围,并写入任意命名的命名空间(在主干的情况下:
window.Backbone
)。历史上,开发人员会编写一个小型包装器模块,将“旧”库转换为AMD,例如:

主干包装器.js

define([], function() {
  return window.Backbone;
});
添加垫片配置()允许在配置中以声明方式处理此问题

填隙并不是说“把这个非AMD的东西放到一个全局变量而不是一个模块中”。Shimming的意思是“加载此非AMD库并公开
导出
变量中指定的全局命名空间,就像它是AMD模块一样”


实际上,在和其他一些SO问题中已经很好地解释了这一点:

require.config({
  shim: {
    'Y': {
      exports: 'globalY'
    }
  }
});
define([], function() {
  return window.Backbone;
});