详解RequireJs官方使用教程(12)

§ 4.3 在页面加载之后加载代码

上述多版本示例中也展示了如何在嵌套的require()中迟后加载代码。

§ 4.4 Web Worker 支持

从版本0.12开始,RequireJS可在Web Worker中运行。可以通过在web worker中调用importScripts()来加载require.js(或包含require()定义的JS文件),然后调用require就好了。

你可能需要设置baseUrl配置项来确保require()可找到待加载脚本。

你可以在unit test使用的一个文件中找到一个例子。

§ 4.5 Rhino 支持

RequireJS可通过r.js适配器用在Rhino中。

§ 4.6 处理错误

通常的错误都是404(未找到)错误,网络超时或加载的脚本含有错误。RequireJS有些工具来处理它们:require特定的错误回调(errback),一个“paths”数组配置,以及一个全局的requirejs.onError事件。

传入errback及requirejs.onError中的error object通常包含两个定制的属性:

requireType: 含有类别信息的字串值,如“timeout”,“nodefine”, “scripterror”
requireModules: 超时的模块名/URL数组。

如果你得到了requireModules错,可能意味着依赖于requireModules数组中的模块的其他模块未定义。

§ 4.6.1 在IE中捕获加载错

Internet Explorer有一系列问题导致检测errbacks/paths fallbacks中的加载错 比较困难:

IE 6-8中的script.onerror无效。没有办法判断是否加载一个脚本会导致404错;更甚地,在404中依然会触发state为complete的onreadystatechange事件。

IE 9+中script.onerror有效,但有一个bug:在执行脚本之后它并不触发script.onload事件句柄。因此它无法支持匿名AMD模块的标准方法。所以script.onreadystatechange事件仍被使用。但是,state为complete的onreadystatechange事件会在script.onerror函数触发之前触发。

因此IE环境下很难两全其美:匿名AMD(AMD模块机制的核心优势)和可靠的错误检测。

但如果你的项目里使用了define()来定义所有模块,或者为其他非define()的脚本使用shim配置指定了导出字串,则如果你将enforceDefine配置项设为true,loader就可以通过检查define()调用或shim全局导出值来确认脚本的加载无误。

因此如果你打算支持Internet Explorer,捕获加载错,并使用了define()或shim,则记得将enforceDefine设置为true。参见下节的示例。

注意: 如果你设置了enforceDefine: true,而且你使用data-main=""来加载你的主JS模块,则该主JS模块必须调用define()而不是require()来加载其所需的代码。主JS模块仍然可调用require/requirejs来设置config值,但对于模块加载必须使用define()。

§ 4.6.2 require([]) errbacks

当与requirejs.undef()一同使用errback时,允许你检测模块的一个加载错,然后undefine该模块,并重置配置到另一个地址来进行重试。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/1271.html