带有requirejs的模块的加载超时

时间:2013-11-29 14:30:57

标签: javascript requirejs underscore.js amd

我正在使用 requirejs 加载一些库和依赖项。

当我加载 jQuery 时,它完美地运行:

main.js

require.config({
  shim: {
    jquery: {
      exports: '$'
    }
  },
  paths: {
    jquery: 'vendor/jquery'
  }
});

require([
  'vendor/jquery',
  'app/init'
]);

应用/ init.js

define(
  ['jquery'],
  function ($) {
    $(document).ready(function () {
      console.log('domready');
    })
  }
)

但是当我尝试添加下划线时,在网络面板中文件已正确加载但在控制台中我得到了

  

未捕获错误:模块的加载超时:下划线

发生了什么事? 我还尝试了require.config中的 waitSeconds:200 选项,但没有成功。

在最终(破损)代码下面作为参考:

main.js

require.config({
  shim: {
    jquery: {
      exports: '$'
    },
    underscore: {
      exports: '_'
    }
  },
  paths: {
    jquery: 'vendor/jquery',
    underscore: 'vendor/underscore',
  }
})

require([
  'vendor/jquery',
  'vendor/underscore',
  'app/init'
])

应用/ init.js

define(
  ['jquery', 'underscore'],
  function ($, _) {
    $(document).ready(function () {
      console.log('domready');
    })
  }
)

1 个答案:

答案 0 :(得分:11)

definerequire来电中,您有时会将模块称为"vendor/<name of module>",有时称为"<name of module>"。这是错的。根据您显示的配置,您应该在所有"<name of module>"require来电中将您的模块称为define。因此,请始终将jQuery和Underscore称为"jquery""underscore",而不是"vendor/...。当您使用完整路径引用它们时,可以绕过shim配置。

实际上,您可以将require来电更改为:

require(['app/init']);

你不需要在那里引用jQuery和Underscore。由于app/init.js需要加载define,因此会加载它们。

(另外,相对较新版本的jQuery不需要垫片,因为jQuery检测到它是由兼容AMD的加载器加载并调用define本身。这不是问题的根源,但它是很高兴知道。)