RequireJS shim导出的是什么?

Ada*_*ner 5 javascript requirejs backbone.js

我正在阅读Backbone Fundamentals,目前正在介绍如何使用RequireJS构建应用程序的部分.

根据我的理解,匀场背后的想法是,通常当您需要模块时,RequireJS也会计算出如何加载它们的依赖关系.但是当你试图加载一个非AMD模块时,这不起作用(我不知道为什么,但这是一个单独的问题).为了解决这个问题,你可以设置一个垫片来说"在Y之前加载X".

require.config({
  shim: {
    'Y': ['X']
  }
});
Run Code Online (Sandbox Code Playgroud)

我看到你可以exports说,"把这个非AMD的东西放到一个全局变量而不是一个模块".

require.config({
  shim: {
    'Y': {
      exports: 'globalY'
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

嗯,那解决了什么问题?非AMD库的问题不仅仅是RequireJS无法找出依赖关系吗?

kry*_*ger 12

实际上需要解决"我不知道为什么"的部分来回答这个问题.匀场需要非AMD模块,并通过加载RequireJS非AMD模块不能正常工作正是因为RequireJS需要AMD模块.也就是说,它需要将模块包装在define包含依赖项列表和工厂方法的调用中(此处有更多详细信息)."标准",旧式库将它们的东西写入全局范围,写入任意命名的命名空间(在Backbone的情况下:) window.Backbone.从历史上看,开发人员会编写一个小的包装模块来将"旧"库转换为AMD,例如:

骨干-wrapper.js

define([], function() {
  return window.Backbone;
});
Run Code Online (Sandbox Code Playgroud)

添加填充程序配置(在RequireJS 2.0中添加)允许在配置中以声明方式处理此问题.

Shimming 并不是"将这种非AMD的东西放入全局变量而不是模块".Shimming说"加载这个非AMD库并公开exports变量中指定的全局命名空间,就好像它是一个AMD模块".


它实际上是很好的解释中RequireJS的文档和其他一些SO问题:1,2.