RequireJS 总是异步加载模块,但它允许require 的形式看起来是同步的。您的第二个 sn-p 实际上缺少一些非常重要的代码。 (此外,jQuery 的模块名称被硬编码为jquery。您可以编写一个配置,允许您将其称为jQuery,但没有意义。)require 调用的这种形式旨在用于在模块内部:
define(function (require) {
var $ = require("jquery");
$.doSomething();
});
RequireJS 对上面的代码所做的是在执行之前将其转换为 this:
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();
});
which would 工作,但是手动重复依赖有什么意义。 (如果您想知道,RequireJS 不会使用回调转换 require 调用,就像我在此处的示例中使用的那样,它转换 define 调用的方式与我展示的一样以上。)