0

我想知道为什么我不能使用这样的require()功能:

// I'm using define's sugar syntax
define(function(require) {  

  // This works fine. It assigns myModule to the myModule variable (no callback needed)
  var myModule = require('myModule');

  var getModule = function(name) {

    // This doesn work. Using require() here expects a callback
    return require(name);        
  };

  return getModule;
});

第二次require()调用抛出(但使用 DevTools 显示<name>实际已加载):

Uncaught Error: Module name <name> has not been loaded yet for context: _ 

为什么第一次require()调用只返回模块(无需以回调方式执行),而第二次require()调用仅适用于回调?

4

1 回答 1

1

我会在这里跟进我的评论。

除非在传递给它的定义回调中,否则require如果不将数组作为第一个参数传递,则无法使用。即使这样也有局限性。require

尝试在其他任何地方执行此操作会引发错误:

require('jquery', function() {});

http://requirejs.org/docs/errors.html#requireargs

你唯一能做到的就是在这里:

define(function(require) {
    var $ = require('jquery');
});

这只是一种更好的写作方式:

define(['jquery'], function($) {

});

第一个版本被称为糖语法 - http://requirejs.org/docs/whyamd.html#sugar

AMD 加载器将使用 Function.prototype.toString() 解析出 require('') 调用,然后在内部转换上述定义调用

我基本上只是重复了 RequireJS 文档中解释的内容,但希望这能让它更清楚一点。

我还在不同的上下文中讨论了这个主题 -如何使用 RequireJS 实现延迟加载?

于 2013-03-26T19:57:46.407 回答