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

时间:2016-08-08 13:36:29

标签: javascript requirejs

我从刚插入requireJS的新库中收到了未定义的错误。我知道未定义的错误与使用之前未加载的'wNumb'模块有关。如果我在'wNumb'中加载config.js模块: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);加载?

谢谢

2 个答案:

答案 0 :(得分:1)

事实上,当您使用RequireJS的库时遇到问题,您应该检查它是如何导出的。文档有时会告诉您它与哪些内容兼容。否则,您必须阅读源代码。要使用带有RequireJS的wNumb 1.0.2,它的行为大致类似于正确的AMD模块,你必须使用垫片:

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

这将为模块提供全局变量wNumb的值(与window.wNumb相同)。这就是你如何让图书馆对AMD不了解但在全球空间中自我导出以使用RequireJS。

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

答案 1 :(得分:0)

我发现'wNumb'模块内部发生了什么。我阅读了'wNumb'代码并在文件的末尾看到了这个: enter image description here

显然,'wNumb'被导出到窗口对象。当我在window.wNumb内使用sliders.js(1,在图像上)时,它返回预期的函数(图像上的2)。作为证明: enter image description here