0
// conifg.js
require.config({
  paths: {
    'main': 'main',
    'socketio': './libs/socket.io/socket.io',
    'plotly': './libs/plotly/plotly-latest.min',
    'renderDataToPlotly': './scripts/renderDataToPlotly',
    'jquery': './libs/jquery/jquery-2.1.4.min',
    'jqueryUI': './libs/jquery/jquery-ui-1.11.4.custom/jquery-ui.min',
    'sliders': './scripts/sliders',
    'makePlotlyWindowResponsive': './scripts/makePlotlyWindowResponsive'
  },
  shim: {                  
    'jqueryUI': ['jquery'] 
  }
});

require(['main']);

// main.js
define([
  'jquery',
  'jqueryUI',
  'socketio',
  'sliders',
  'makePlotlyWindowResponsive',
  'renderDataToPlotly'
  ],
  function($, ui, io, sliders, makePlotlyWindowResponsive, renderDataToPlotly) {
    //
  }
);

// renderDataToPlotly.js and makePlotlyWindowResponsive.js
define(['plotly'], function() {

});

当我加载页面时,我得到这个加载顺序: 在此处输入图像描述 如您所见,makePlotlyWindowResponsive.js(1,在图像上)在plotly-latest.min.js(2,在图像上)之前加载。据我了解 requirejs 机制,我会看到一个Plotly is not defined错误makePlotlyWindowResponsive.js,但我没有得到任何错误。一切正常。

我想了解 requirejs 以及它是如何工作的。

问题1:怎么没有错误?

问题2:这意味着,尽管加载顺序,如果文件在页面完全加载之前加载没有错误?

谢谢你的时间!

4

2 回答 2

1

当 requirejs 从网络接收到脚本时,它会运行该脚本。(requiredefine?)函数说“下载这些其他脚本,然后运行它们,一旦你得到它们的所有返回值,运行这个函数”。因此,它会等待其他脚本加载并返回它们的值,然后再调用这个函数中的函数。简而言之,它们加载的顺序可能与它们的函数运行的顺序不同。

于 2016-08-06T21:53:52.430 回答
1

您目睹的相对顺序plotly.min.js以及依赖它的模块是必要的。RequireJS 没有理由在获取plotly.min.js之前makePlotlyWindowResponsiverenderDataToPlotly已经获取之前获取。

术语说明:我说“获取(模块)”表示在网络上发出 HTTP 查询的操作,我将使用“定义(模块)”表示运行模块的工厂函数的操作。“加载”这个词太含糊了。

会发生什么:

  1. 你需要main. 所以 RequireJS 获取main.

  2. RequireJS 执行definein main。在定义自己的依赖项之前,无法运行工厂(回调)。因此它开始获取依赖项。这种获取可以以任何顺序发生。依赖项包括makePlotlyWindowResponsiverenderDataToPlotly

  3. RequireJS 获取makePlotlyWindowResponsiverenderDataToPlotly. (它们的相对顺序无关紧要。)

  4. RequireJS执行define或。这是它知道它必须获取解析为的模块的地方在此之前,RequireJS 不知道会需要它。它在其中的事实并不是触发其加载的充分条件。makePlotlyWindowResponsiverenderDataToPlotlyplotly./libs/plotly/plotly-latest.min.jsplotlypaths

  5. RequireJS 获取./libs/plotly/plotly-latest.min.js.

于 2016-08-07T11:29:29.317 回答