RequireJS 在使用其变量之前不加载模块

RequireJS not loading module before use its variables

我刚插入 requireJS 的新库出现未定义错误。我知道未定义的错误与使用前未加载的 'wNumb' 模块有关。如果我像这样在 config.js 中加载 'wNumb' 模块:require(['main', 'wNumb']); 一切正常。

// conifg.js
require.config({
  paths: {
    'main': 'main',
    'socketio': './libs/socket.io/socket.io',
    'plotly': './libs/plotly/plotly-latest.min',
    'renderDataToPlotly': './scripts/renderDataToPlotly',
    'noUISlider': './libs/noUiSlider.8.5.1/nouislider.min',
    'wNumb': './libs/wnumb-1.0.2/wNumb',
    'sliders': './scripts/sliders',
    'makePlotlyWindowResponsive': './scripts/makePlotlyWindowResponsive'
  }
});

require(['main']);

// main.js
define([
  'socketio',
  'sliders', //---------------------------------------------> NOTE: sliders.js loading here
  'makePlotlyWindowResponsive',
  'renderDataToPlotly'
  ],
  function(io, sliders, makePlotlyWindowResponsive, renderDataToPlotly) {
    //
  }
);

// sliders.js
define(['noUISlider', 'wNumb'], function(noUISlider, wNumb) {
  console.log(wNumb); // ---------------------------------------------------> undefined
});

问题:为什么会这样? 'wNumb' 不应该在 console.log(wNumb); 执行时加载吗?

谢谢

我发现 'wNumb' 模块内部发生了什么。我阅读 'wNumb' 代码并在文件末尾看到:

显然,'wNumb' 被导出到 window 对象。当我在 sliders.js 中使用 window.wNumb(1,在图像上)时,它 returns 预期的功能(2,在图像上)。作为证明:

确实,当您在使用 RequireJS 的库时遇到问题,您应该检查它是如何导出自身的。该文档有时会告诉您它与什么兼容。否则,您必须阅读源代码。要将 wNumb 1.0.2 与 RequireJS 一起使用,使其表现得像一个合适的 AMD 模块,您必须使用垫片:

shim: {
    wNumb: {
        exports: "wNumb",
    },
}

这将为模块提供全局变量 wNumb 的值(与 window.wNumb 相同)。这就是您如何获得对 AMD 一无所知但将自己导出到全局 space 以与 RequireJS 一起工作的库。

不过,如果你能把wNumb升级到1.0.4就更好了因为这个版本引入了proper code使wNumb成为一个合适的AMD 模块:当它检测到有可用的 AMD 加载程序时,它会调用 define。那你不需要shim