requirejs意外行为

时间:2016-08-06 20:33:08

标签: javascript requirejs load-order

// 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() {

});

当我加载页面时,我收到此加载顺序: enter image description here 如您所见,makePlotlyWindowResponsive.js(1,在图像上)在plotly-latest.min.js之前加载(2,在图像上)。据我所知需要机制,我会在Plotly is not defined上看到makePlotlyWindowResponsive.js错误,但我没有得到任何错误。一切正常。

我想了解requirejs及其工作原理。

问题1 :怎么没有错误?

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

谢谢你的时间!

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

您在plotly.min.js与依赖于它的模块之间目睹的相对顺序是必要的。在获取plotly.min.jsmakePlotlyWindowResponsive之前,RequireJS没有理由提取renderDataToPlotly

术语说明:我说“获取(模块)”用于在网络上发出HTTP查询的操作,我将使用“定义(模块)”来运行模块的工厂功能。 “加载”一词含糊不清。

会发生什么:

  1. 您需要main。所以RequireJS提取main

  2. RequireJS执行define中的main。在自己定义依赖项之前,无法运行工厂(回调)。所以它启动了获取依赖项。这种提取可以按任何顺序进行。依赖项包括makePlotlyWindowResponsiverenderDataToPlotly

  3. RequireJS提取makePlotlyWindowResponsiverenderDataToPlotly。 (他们的相对顺序并不重要。)

  4. RequireJS执行definemakePlotlyWindowResponsive的{​​{1}}。 这是它了解必须获取解析为renderDataToPlotly的模块plotly的地方。在此之前,RequireJS不知道将需要./libs/plotly/plotly-latest.min.js。它位于plotly之内并不足以触发其加载。

  5. RequireJS提取paths