// 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,在图像上)。据我所知需要机制,我会在Plotly is not defined
上看到makePlotlyWindowResponsive.js
错误,但我没有得到任何错误。一切正常。
我想了解requirejs及其工作原理。
问题1 :怎么没有错误?
问题2 :这意味着,尽管有加载顺序,但如果在页面完全加载之前加载文件,则没有错误?
谢谢你的时间!
答案 0 :(得分:1)
当requirejs从网络接收脚本时,它会运行该脚本。 require
(或define
?)函数说“下载这些其他脚本,然后运行它们,一旦获得所有返回值,就运行此函数”。因此,在调用此函数之前,它等待其他脚本加载并返回它们的值。简而言之,它们加载的顺序可能与它们的函数运行顺序不同。
答案 1 :(得分:1)
您在plotly.min.js
与依赖于它的模块之间目睹的相对顺序是必要的。在获取plotly.min.js
或makePlotlyWindowResponsive
之前,RequireJS没有理由提取renderDataToPlotly
。
术语说明:我说“获取(模块)”用于在网络上发出HTTP查询的操作,我将使用“定义(模块)”来运行模块的工厂功能。 “加载”一词含糊不清。
会发生什么:
您需要main
。所以RequireJS提取main
。
RequireJS执行define
中的main
。在自己定义依赖项之前,无法运行工厂(回调)。所以它启动了获取依赖项。这种提取可以按任何顺序进行。依赖项包括makePlotlyWindowResponsive
和renderDataToPlotly
。
RequireJS提取makePlotlyWindowResponsive
和renderDataToPlotly
。 (他们的相对顺序并不重要。)
RequireJS执行define
或makePlotlyWindowResponsive
的{{1}}。 这是它了解必须获取解析为renderDataToPlotly
的模块plotly
的地方。在此之前,RequireJS不知道将需要./libs/plotly/plotly-latest.min.js
。它位于plotly
之内并不足以触发其加载。
RequireJS提取paths
。