RequireJS始终以异步方式加载模块,但它允许一种看起来同步的require
形式。实际上,您的第二个代码片段缺少一些非常重要的代码。(此外,jQuery的模块名称硬编码为jquery
。您可以编写一个配置文件,使其称为jQuery
,但这没有意义。)这种require
调用形式旨在在模块内使用:
define(function (require) {
var $ = require("jquery");
$.doSomething();
});
RequireJS在执行上述代码之前会将其转换为以下代码:
define(['jquery'], function (require) {
var $ = require("jquery");
$.doSomething();
});
注意将依赖项作为 define
的第一个参数添加。当 RequireJS 执行代码时,它会找到依赖项,加载 jquery
,然后调用匿名函数。在遇到 require("jquery")
时,模块已经加载完毕。最终看起来 require
调用是同步的,但它所需的模块加载仍然是异步的。
你能在 define
调用之外使用这个同步形式的 require
吗?只有在你不介意出现错误的情况下才可以。 如果传给它的模块尚未加载,此 require
调用将失败。你将会得到臭名昭著的错误:
Module name ... has not been loaded yet for context: ...
像我上面展示的那样在define
中使用是安全的。或者你可以这样做:
require(['jquery'], function (require) {
var $ = require("jquery");
$.doSomething();
});
这可以工作,但是手动重复依赖有什么意义呢。(以防你想知道,RequireJS 不会像我在这里的示例中展示的转换一个带有回调函数的require
调用,就像它转换define
调用一样。)