如何使用requirejs获取匿名模块的句柄?

时间:2015-12-14 09:30:42

标签: javascript requirejs

define(['somethingRequired'],function(somethingRequired) {
   // code
});

让我们说这段代码在test.js中,使用控制台,如何在加载后检查它并调整其属性?从文档我看到模块可以给出名称,但事实并非如此,我想知道匿名模块会发生什么。如果问题不清楚或写得不好,请提前反对

Louis回复更新:我尝试了两种缩写形式     // var foo = require(['foo']);      var foo = require('foo'); 和异步调用     require(['foo'],function(foo_){foo = foo_;}); 这两个模块都没有在全球范围内泄漏。我还缺少什么吗? 还尝试在异步调用中添加console.log('done'),但它从未在控制台中显示

2 个答案:

答案 0 :(得分:1)

你误解了在没有模块名称作为第一个参数的情况下调用define意味着什么。它唯一能做的就是让RequireJS在运行时根据RequireJS的配置计算出模块名称。例如,假设我有一个文件,baseUrl目录中的文件将具有相对路径foo/bar.js,此文件调用define而不设置模块名称。我可以通过require(['foo/bar'], ...加载此模块但是,如果我有以下配置:

paths: {
    bar: 'foo/bar'
}

然后我可以用require(['bar'], ...加载它如果文件中还有define 设置模块名称,则加载模块的两种方法之一当然失败了。如果我有define('foo/bar', ...,则第一个require会起作用但不会起作用。如果我有define('bar', ...,那么第二个require将起作用,但不会起作用。

但最终,当您加载一个不使用模块名称调用define的模块时,仍然需要使用某个名称加载它。所以你需要弄明白什么命名您正在检查的应用程序用于引用您感兴趣的模块,并使用该名称。

加载模块后,您可以摆弄的唯一内容是模块导出的值。任何未出口的都是禁止的。

一旦为模块命名,就必须在控制台发出require调用以获取对模块的引用。如果模块已加载,则可以使用var foo = require(module_name)。这是require的同步形式,方便使用,但仅在已加载模块时才有效。如果尚未加载模块,则必须使用类似require([module_name], function (foo_) { foo = foo_ });的内容(请注意第一个参数是否为数组),以便将全局foo设置为模块。有关更详细的解释,请参阅this answer

答案 1 :(得分:0)

您可以在模块内部使用自调用函数,以便在模块加载后立即执行。

有关自我调用功能的更多信息 - A self invoking anonymous function expression

相关问题